使这个表达式语法对LL(1)明确无误

时间:2012-02-21 21:58:12

标签: parsing context-free-grammar ambiguous-grammar

我们怎样才能使这个表达式语法明确地用于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.

的任何问题

2 个答案:

答案 0 :(得分:1)

首先,您需要消除规则的歧义

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

如何处理a AND b OR ca OR b AND c等输入?有多种可能的解释;你需要决定你想要的。

然后,你将有一个明确的语法,但不是LL(1)。要使它成为LL(1),您需要left-factor它。

答案 1 :(得分:0)

@Chris,您的问题可能已经纠正如下。然而,完整语法的模糊性并没有消失。
另外,这里不能以标准形式留下因子。
只有当我们尝试找到BO<booleanExpr>

的第一组时,我们才会得到常见因素(例如<booleanExpr>中的<expression>
<booleanExpr> -->  <arithmeticExpr> <relationalOp> <arithmeticExpr> <BooleanX>
<booleanExpr> -->   BO <booleanExpr> BC <BooleanX>

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