【问题标题】:LALR grammar ambiguousLALR 语法模棱两可
【发布时间】:2013-03-23 20:55:46
【问题描述】:

我已经为布尔和算术表达式制作了一个语法。我想处理算术表达式,例如:

(1+5)+(-3)   

我已经完成了这项工作:我可以处理我想要的所有表达式。

我的问题是布尔表达式可能是这样的:

( ( (2+2==4) or (3>2) ) and 2==2)

所以在某些时候我的布尔规则必须引用我的算术表达式规则。我不能在布尔规则中使用括号 (),因为它会导致我的语法不明确。我明白为什么,但我无法找到解决此问题的方法。

【问题讨论】:

  • 到目前为止你尝试过什么?显示您的代码并提供 yacc 识别的冲突的详细信息。
  • 在布尔表达式和算术表达式中都有括号并没有本质上的歧义(这样做的简单方法将使语法不是 LL,但对 LR 很好)。你试过什么?

标签: grammar yacc lalr disambiguation ambiguous-grammar


【解决方案1】:

这个为 GOLD 编写的 LALR 语法应该可以帮助您入门:

<Formula>     ::= <BoolConcat> <Formula> | <BoolConcat> 

<BoolConcat> ::= <BoolConcat> 'and' <Comparison> | <Comparison>

<Comparison> ::=  <Comparison> '>' <Expression> | <Expression> 

<Expression> ::= <Expression> '+' <Term> | <Term>

<Term> ::= <Term> '*' <Fact> | <Fact>

<Fact> ::= Integer | '(' <BoolConcat> ')'

对于布尔部分,算术语法的典型概念被重用。没有什么新东西,只是不同类型的布尔运算符的优先级更高。

只需将“==”添加到比较中,将“或”添加到 BoolConcat 等等。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多