如何在bison / yacc GLR-parser中获得'预期令牌'?
您好,
在我正在做的项目中,有一些模棱两可的草图。所以我试图用%glr-parser来解决移位/减少混乱。
当我使用非GLR解析器时,我可以使用yystate(全局变量)在检测到语法错误时获取“预期令牌”。但是在切换到GLR解析器后,我发现它不再是全局变量。
所以我的问题是,当出现语法错误时,无论如何都要在GLR解析器中获取“预期令牌”吗?
答案 0 :(得分:1)
GLR解析器中没有有效的yystate
信息是正确的,因此不能有#34;期望令牌的简单解决方案"。
要了解为什么必须理解默认LALR解析器和GLR解析算法之间的区别。这里有详细记录:http://www.delorie.com/gnu/docs/bison/bison_11.html。基本上,GLR(广义LR)执行多个并发线程,每个线程尝试使用不同的模糊替代方案来搜索匹配。当它们都不匹配时,解析失败并且您处于语法错误状态。因此,不可能存在单个预期令牌,但可能存在许多预期令牌。这就是为什么它含糊不清。一个很好的文档解释了野牛解析器的工作原理:http://www.cs.uic.edu/~spopuri/cparser.html,它解释了非GLR解析中yystate变量的功能。
为此GLR解析器生成更好的错误消息的方法最好在@ rici对此问题的回答中提及:Additional syntax error message on GLR parser when syntax is ambiguous;在很多方面,这个问题实际上与那个问题重复。
它还没有作为副本被关闭,因为它们为什么都在询问同样的问题而相当模糊。