LALR语法暧昧

时间:2013-03-23 20:55:47

标签: grammar yacc lalr disambiguation ambiguous-grammar

我为布尔和算术表达式编写了一个语法。我想处理像:

这样的算术表达式
(1+5)+(-3)   

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

我的问题是布尔表达式可以是:

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

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

1 个答案:

答案 0 :(得分: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> ')'

对于bool部分,重用了算术语法的典型概念。没有什么新的,只有不同类型的bool运营商的新优先级。

只需将'=='添加到比较,'或'添加到BoolConcat等等。