我正在使用Bison生成解析器。我遇到了一种转移/减少冲突,我真的需要Bison使用GLR而不是LALR来处理它。但是我已经传递了%glr-parser
指令,并且源文件仍然声明它是LALR解析器。我什至发现了一个“glr.cc”骨架,这表明它是GLR C++解析器,并且%skeleton "glr.cc"
使用它并没有改变输出。 Bison不会为所有目标语言提供所有算法吗?
最佳答案
您只需要%glr-parser
即可获得GLR解析器。请注意,GLR解析器可能仍然存在冲突(移位/减少或减少/减少),只是生成的解析器将尝试两种选择并统一结果。
如果要关闭有关冲突的消息,可以使用%expect
和%expect-rr
。但是,仅在不了解所有冲突的危险的情况下盲目使用GLR解析器是危险的-如果不小心,生成的解析器可能需要花费指数时间才能解析某些输入,否则可能会在运行时给您带来歧义错误。