1

如何在野牛/yacc GLR 解析器中获取“预期令牌”?

你好,

在我正在做的项目中,有一些模棱两可的语法。所以我正在尝试使用 %glr-parser 来解决移位/减少冲突。

当我使用非 GLR 解析器时,我可以在检测到语法错误时使用 yystate(全局变量)来获取“预期的令牌”。但是切换到 GLR 解析器后,我发现它不再是全局变量了。

所以我的问题是,当出现语法错误时,是否可以在 GLR 解析器中获取“预期令牌”?

4

1 回答 1

1

GLR解析器中没有有效yystate信息是正确的,因此不可能有“预期令牌”的简单解决方案。

要了解为什么必须了解默认 LALR 解析器和 GLR 解析算法之间的区别。这在这里有很好的记录:http: //www.delorie.com/gnu/docs/bison/bison_11.html。基本上,GLR(广义 LR)执行多个并发线程,每个线程都尝试不同的模棱两可的替代方案来搜索匹配项。当它们都不匹配时,解析失败并且您处于语法错误情况。因此,不可能有一个预期的令牌,但可能有许多预期的令牌。这就是为什么它是模棱两可的。解释野牛解析器如何工作的好文档在这里:http ://www.cs.uic.edu/~spopuri/cparser.html ,它解释了 yystate 变量在非 GLR 解析中的功能。

为 GLR 解析器生成更好的错误消息的方法最好在 @rici 对这个问题的回答中得到说明:Additional syntax error message on GLR parser when syntax is ambiguous ; 在许多方面,这个问题实际上是那个问题的重复。

它只是没有作为副本被关闭,因为对于他们为什么都在询问同一个问题相当模糊。

于 2015-02-26T16:24:23.760 回答