野牛 - 处理非LALR(1)语法

时间:2013-03-27 06:29:36

标签: expression grammar bison context-free-grammar lalr

我正在使用flex,bison制作一个简单的计算器。

我开发了一个包含两种表达式的语法 - 整数表达式和实际表达式。

语法类似于:

exp -> intExp | realExp

intExp -> INT | intExp '+' intExp

realExp -> REAL | realExp '+' realExp | intExp '+' realExp | realExp '+' intExp

这不是LALR(1)。

例如,考虑字符串INT'+'REAL。在'INT',前瞻是'+',基于此,无法判断字符串是intExp还是realExp。

我尝试重写语法以解决歧义,但没有任何结果。

我知道我可以推迟在解析过程中进行计算,而是构建一个解析树。然后通过类型检查,可以解决问题。但对于这么简单的问题,这似乎有点过分了。

有没有办法让野牛本身能够处理这种歧义?或者可以用更好的方式重写语法?

1 个答案:

答案 0 :(得分:2)

不,如果它不是LALR(1)那么它不是。但是,在您的语言中,您不能出现类型不匹配错误。为什么然后有int和real表达式的单独制作?只需使节点值包含整数,实数和类型代码。