我正在使用flex,bison制作一个简单的计算器。
我开发了一个包含两种表达式的语法 - 整数表达式和实际表达式。
语法类似于:
exp -> intExp | realExp
intExp -> INT | intExp '+' intExp
realExp -> REAL | realExp '+' realExp | intExp '+' realExp | realExp '+' intExp
这不是LALR(1)。
例如,考虑字符串INT'+'REAL。在'INT',前瞻是'+',基于此,无法判断字符串是intExp还是realExp。
我尝试重写语法以解决歧义,但没有任何结果。
我知道我可以推迟在解析过程中进行计算,而是构建一个解析树。然后通过类型检查,可以解决问题。但对于这么简单的问题,这似乎有点过分了。
有没有办法让野牛本身能够处理这种歧义?或者可以用更好的方式重写语法?
答案 0 :(得分:2)
不,如果它不是LALR(1)那么它不是。但是,在您的语言中,您不能出现类型不匹配错误。为什么然后有int和real表达式的单独制作?只需使节点值包含整数,实数和类型代码。