c – 切换到bison 3.0后yylval和yylloc出现问题
作者:互联网
从bison 2.7升级到3.0后,我在解析器定义文件(.yy)中更改了以下两行
-------old--------
%define parser_class_name smathparser
%name-prefix = "imath"
-------new--------
%define api.prefix {imath}
%define parser_class_name {smathparser}
-------------------
结果是在编译解析器(!)文件时遇到以下编译器错误(编译lexer文件即使它大量使用yylval也没有错误):
error: ‘yylval’ was not declared in this scope
error: ‘yylloc’ was not declared in this scope
我搜遍了我能想到的任何地方,但我看不到yylval和yylloc的定义.他们被重命名了吗?已过时?为什么它们在词法分析器中工作但在解析器中不起作用?
为了澄清:我实际上在解析器的代码中使用了yylval和yylloc.
解决方法:
yylval和yylloc在词法分析器中设置,而不是在解析器中.传统上,这些是全局变量,但在“纯”(重入)解析器中,它们是解析器的内部,并且它们的地址作为参数传递给扫描器. C解析器总是纯粹的.
从3.0开始,这些值不再是解析器中的独立变量;相反,它们是代表符号的类的一部分.该更改不会影响扫描程序,因为它仍然接收与参数相同的指针,但它使得名称无法访问解析器操作.
显然,这种不兼容性应该在某处记录,但我还没有找到.
尽管如此,值得注意的是,您很少需要在解析器操作中引用前瞻标记的语义值和位置,尽管从远古时代开始就支持它并且继续在C语法分析器中工作,甚至在GLR解析器中也是如此.我相信你有理由,虽然我很好奇它们是什么,但你没有义务透露它们.检查C骨架代码表明你应该能够使用yyla.value和yyla.location而不是yylval和yylloc,但是没有记录,所以没有保证.
如果我们幸运的话,Akim Demaille会过来并正确地回答这个问题.就个人而言,我使用C接口,即使是C;旧习难改.