0

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

我开发了一种语法,其中包括两种类型的表达式——整数表达式和实数表达式。

语法与此类似:

exp -> intExp | realExp

intExp -> INT | intExp '+' intExp

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

这不是 LALR(1)。

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

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

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

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

4

1 回答 1

2

不,如果它不是 LALR(1),那么它不是。但是,在您的语言中,您不能出现类型不匹配错误。那么为什么对 int 和 real 表达式有不同的产生式呢?只需让节点值包含一个整数、一个实数和一个类型代码。

于 2013-03-27T06:35:59.423 回答