Bison的C ++ GLR解析器

时间:2011-12-15 21:31:01

标签: bison glr

我正在使用Bison生成解析器。我有一个转变/减少冲突,我真的需要Bison使用GLR而不是LALR来处理它。但是我已经通过了%glr-parser指令,源文件仍然声明它是一个LALR解析器。我甚至发现了一个“glr.cc”骨架,它表明它是一个GLR C ++解析器,%skeleton "glr.cc"使用它并没有改变输出。 Bison不会为所有目标语言提供所有算法吗?

3 个答案:

答案 0 :(得分:2)

您只需%glr-parser即可获得GLR解析器。请注意,GLR解析器可能仍然存在冲突(shift / reduce或reduce / reduce),只是生成的解析器将尝试两种替代方案并统一结果。

如果您想要关闭有关冲突的消息,可以使用%expect%expect-rr。但是,只是盲目地使用GLR解析器而你不明白所有冲突是危险的 - 如果你不小心,结果解析器可能会花费指数长来解析一些输入,或者在运行时可能会给你一些模糊错误。

答案 1 :(得分:1)

我不知道你的意思是“%skeleton "glr.cc"没有改变输出”,因为它确实如此!你确定你真的重新生成了输出吗?如果您这样做,请提供更多详细信息。

$ echo "%% exp: '0'" > /tmp/f.y
$ bison -S lalr1.cc /tmp/f.y -o f1.cc
$ bison -S glr.cc /tmp/f.y -o f2.cc
$ ls -l f1.cc f2.cc
-rw-r--r--  1 akim  wheel  28373 30 oct 09:29 f1.cc
-rw-r--r--  1 akim  wheel  82767 30 oct 09:29 f2.cc

答案 2 :(得分:0)

我遇到了同样的问题。我学到的东西-如果无法生成新的输出,Bison将返回1。问题:为什么?由于我已禁用C ++变体(%define api.value.type variant),因此Bison中的GLR不支持该变量,但是请忘记%define api.token.constructor。而且没有提示的野牛就会休息。

祝您进行故障排除。