2

文法に2つのことを追加しようとしています。

  1. 単項マイナス記号、つまり'-'、および

  2. 括弧

これまでの私の文法は次のとおりです。

<comp>  ::= <expr> | <comp> <op0> <expr>
<expr>  ::= <term> | <expr> <op1> <term>
<term>  ::= <darg> | <term> <op2> <darg>
<darg>  ::= <digit> | <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0>   ::= > | < | =< | => | =
<op1>   ::= + | -
<op2>   ::= * | /

私はすべてを試しましたが、これを理解することはできません。単項マイナス記号を最高レベルの優先順位にし、次に括弧を付け、次に残りの演算子を説明するようにするにはどうすればよいですか?

4

2 に答える 2

2

代わり<term>に使用するように変更し、定義する<fred><darg>

<fred> ::= -<fred> | (<comp>) | <darg>
于 2013-01-28T03:03:58.250 に答える
1

問題の現在の文法に、<new> 3つの新しいプロダクションルールで名前が付けられた新しい変数を追加Unary minus signして、次のようにし Parenthesesます。

<comp>  ::= <expr>   | <comp> <op0> <expr>
<expr>  ::= <term>   | <expr> <op1> <term>
<term>  ::= <new>    | <term> <op2> <darg>
<new>   ::= (<comp>) | -<darg> | <darg> 
<darg>  ::= <digit>  |  <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0>   ::= > | < | =< | => | =
<op1>   ::= + | -
<op2>   ::= * | /

括弧を追加すると、文法に2つの新しい端末が追加されます。{ (, ) }

また、式などを生成し<new> ::= ( <new> )たい場合は追加できます(これらは有効な式です(-7)(7)((6+7))

コンパイラーを作成している場合は、代わりにあいまいな文法を使用し、効率的な構文解析を可能にするYACCツールに演算子の優先順位を追加することをお知らせします。

編集

のような式を追加したい場合-(7)、それは有効な式です。だから<new> ::= -<new>代わりに<new> ::= <drag>

于 2013-01-28T19:00:22.117 に答える