【问题标题】:Make this Expression Grammar unambiguous for LL(1)使此表达式语法对 LL(1) 明确
【发布时间】:2012-02-21 21:58:11
【问题描述】:

我们如何才能使这个表达式语法对 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. 的问题

【问题讨论】:

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


    【解决方案1】:

    首先你需要消除规则的歧义

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

    它应该如何处理像a AND b OR ca OR b AND c 这样的输入?有多种可能的解释;你需要决定你想要哪个。

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

    【讨论】:

    • 我想从左到右解析。比如,a AND b OR c 被解释为(a AND b) OR c)
    【解决方案2】:

    @Chris,您的问题可能已纠正如下。然而,完整语法的歧义并没有消失。
    此外,此处无法使用标准形式的左分解。
    只有当我们尝试找到&lt;booleanExpr&gt;&lt;expression&gt; 的第一组时,我们才会得到左公因子(例如&lt;booleanExpr&gt; 中的BO


    <booleanExpr> -->  <arithmeticExpr> <relationalOp> <arithmeticExpr> <BooleanX>
    <booleanExpr> -->   BO <booleanExpr> BC <BooleanX>
    
    <BooleanX> -->  <logicalOp> <booleanExpr> <BooleanX> | ε
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多