6

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

4

3 回答 3

2

你只需要%glr-parser得到一个 GLR 解析器。请注意,GLR 解析器可能仍然存在冲突(移位/归约或归约/归约),只是生成的解析器将尝试两种选择并统一结果。

如果要关闭有关冲突的消息,可以使用%expect%expect-rr。然而,只是盲目地使用 GLR 解析器,而您不了解所有冲突是什么是危险的——如果您不小心,生成的解析器可能会花费指数级的时间来解析某些输入,或者可能会在运行时给您带来歧义错误。

于 2011-12-15T22:48:35.883 回答
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
于 2012-10-30T08:30:35.380 回答
0

我有同样的问题。我学到的东西——如果无法生成新的输出,Bison 返回 1。问题:为什么?因为我禁用了 C++ Variants ( %define api.value.type variant),这在 Bison 中的 GLR 不支持,但忘记了%define api.token.constructor. 没有提示的野牛会休息。

祝您顺利排除故障。

于 2019-06-15T05:45:42.593 回答