我正在使用 flex,bison 制作一个简单的计算器。
我开发了一种语法,其中包括两种类型的表达式——整数表达式和实数表达式。
语法与此类似:
exp -> intExp | realExp
intExp -> INT | intExp '+' intExp
realExp -> REAL | realExp '+' realExp | intExp '+' realExp | realExp '+' intExp
这不是 LALR(1)。
例如,考虑字符串 INT '+' REAL。在“INT”处,前瞻为“+”,仅基于此,无法判断字符串是 intExp 还是 realExp。
我尝试重写语法以解决歧义,但没有任何结果。
我知道我可以在解析期间推迟进行计算,而是构建一个解析树。然后通过类型检查,问题可以解决。但是对于这样一个简单的问题来说,这似乎有点过分了。
有没有办法让野牛本身来处理这种歧义?或者可以用更好的方式重写语法吗?