我们怎样才能使这个表达式语法明确地用于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.
答案 0 :(得分:1)
首先,您需要消除规则的歧义
<booleanExpr> --> <booleanExpr> <logicalOp> <booleanExpr>
如何处理a AND b OR c
和a 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> | ε