0

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:Stackoverflowで処理した質問は見つかりませんでしたBoolean Expressions.

4

2 に答える 2

1

まず、ルールを明確にする必要があります

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

a AND b OR cやのような入力をどのように処理する必要がありa OR b AND cますか? 複数の解釈が可能です。どちらが欲しいかを決める必要があります。

そうすれば、あいまいさのない文法が得られますが、LL(1) ではありません。LL(1) にするには、左因数分解する必要があります。

于 2012-02-21T23:06:13.753 に答える
0

@Chris、あなたの問題はおそらく次のように修正されます。しかし、完全な文法のあいまいさは消えません。
また、標準形式での左因数分解はここではできません。 との FIRST セットを見つけようとする場合にのみ、
(BO<booleanExpr><booleanExpr><expression>


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

<BooleanX> -->  <logicalOp> <booleanExpr> <BooleanX> | ε
于 2012-02-22T07:34:13.153 に答える