从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。
答案 0 :(得分:3)
yylval
和yylloc
在词法分析器中设置,而不是在解析器中设置。传统上,这些是全局变量,但在纯粹的" (重入)解析器,它们是解析器的内部,并且它们的地址作为参数传递给扫描器。 C ++解析器总是纯粹的。
从3.0开始,这些值不再是解析器中的独立变量;相反,它们是代表符号的类的一部分。该更改不会影响扫描程序,因为它仍然接收与参数相同的指针,但它使得名称无法访问解析器操作。
显然,应该在某处记录不兼容性,但我还没找到。
尽管如此,值得注意的是,您很少需要在解析器操作中引用 lookahead 标记的语义值和位置,尽管自远古以来一直支持这样做继续在C解析器中工作,甚至在GLR解析器中工作。我确定你有理由,虽然我很好奇它们是什么,但你没有义务透露它们。检查C ++框架代码表明您应该能够使用yyla.value
和yyla.location
而不是yylval
和yylloc
,但是没有记录,所以有没有保证。
如果我们很幸运,Akim Demaille会过来并正确回答这个问题。就个人而言,我使用C接口,即使使用C ++;旧习惯很难过。
答案 1 :(得分:2)
在我们的.yy
文件中,同样受到bison 3.0升级的影响,我将yylloc
替换为@$
。