切换到野牛3.0后yylval和yylloc出现问题

时间:2014-05-15 18:18:54

标签: c++ bison

从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。

2 个答案:

答案 0 :(得分:3)

yylvalyylloc在词法分析器中设置,而不是在解析器中设置。传统上,这些是全局变量,但在纯粹的" (重入)解析器,它们是解析器的内部,并且它们的地址作为参数传递给扫描器。 C ++解析器总是纯粹的。

从3.0开始,这些值不再是解析器中的独立变量;相反,它们是代表符号的类的一部分。该更改不会影响扫描程序,因为它仍然接收与参数相同的指针,但它使得名称无法访问解析器操作。

显然,应该在某处记录不兼容性,但我还没找到。

尽管如此,值得注意的是,您很少需要在解析器操作中引用 lookahead 标记的语义值和位置,尽管自远古以来一直支持这样做继续在C解析器中工作,甚至在GLR解析器中工作。我确定你有理由,虽然我很好奇它们是什么,但你没有义务透露它们。检查C ++框架代码表明您应该能够使用yyla.valueyyla.location而不是yylvalyylloc,但是没有记录,所以有没有保证。

如果我们很幸运,Akim Demaille会过来并正确回答这个问题。就个人而言,我使用C接口,即使使用C ++;旧习惯很难过。

答案 1 :(得分:2)

在我们的.yy文件中,同样受到bison 3.0升级的影响,我将yylloc替换为@$