2012-02-21 7 views
0

この式文法を明確にするにはどうすればいいですかの文法は、LL(1)解析のために曖昧ではありませんか?LL(1)

文法は、ほとんどのC言語のような表現に非常に似ています。

注:<の文字列は非終端記号ですが、大文字の記号は終端記号です。


<expression> --> <arithmeticExpr> | <booleanExpr> 

<arithmeticExpr> --> <arithmeticExpr> <op1> <term> | <term> 

<term> --> <term> <op2> <factor> 
<term> --> <factor> 

<factor> --> BO <arithmeticExpr> BC 
<factor> --> <var> 

<op1> --> PLUS | MINUS 

<op2> --> MUL | DIV 

<booleanExpr> --> <booleanExpr> <logicalOp> <booleanExpr> 
<booleanExpr> --> <arithmeticExpr> <relationalOp> <arithmeticExpr> 
<booleanExpr> --> BO <booleanExpr> BC 

<logicalOp> --> AND | OR 

<relationalOp> --> LT | LE | GT | GE | EQ | NE 

<var> --> ID <whichId> | NUM | RNUM 

<whichId> --> SQBO ID SQBC | ε 

PS:私はあなたがルール

<booleanExpr> --> <booleanExpr> <logicalOp> <booleanExpr> 

それはどのように入力を処理するを明確にする必要があるBoolean Expressions.

答えて

1

ファーストを扱っStackOverflowの上の任意の質問を見つけるcoudn't a AND b OR ca OR b AND c?考えられる解釈は複数あります。あなたはあなたが望むものを決める必要があります。

次に、LL(1)ではなく、あいまいではない文法があります。それをLL(1)にするには、left-factorが必要です。

+0

のFIRSTセットを見つけようとする場合にのみ、私は右の構文解析に左たい共通因子(<booleanExpr>のようBO)を左ます。同様に、AND b OR cは '(a AND b)OR c)と解釈されます。 –

0

@Chris、あなたの問題はおそらく以下のように修正されます。しかし、完全な文法のあいまいさは消えません。
また、ここでは標準形式での左寄りは不可能です。
我々は<booleanExpr><expression>


<booleanExpr> --> <arithmeticExpr> <relationalOp> <arithmeticExpr> <BooleanX> 
<booleanExpr> --> BO <booleanExpr> BC <BooleanX> 

<BooleanX> --> <logicalOp> <booleanExpr> <BooleanX> | ε