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,您的问题可能已纠正如下。然而,完整语法的歧义并没有消失。
此外,这里不可能以标准形式进行左分解。 只有当我们
试图找到和BO<booleanExpr><booleanExpr><expression>


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

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