切换到bison 3.0后yylval和yylloc的问题

Problems with yylval and yylloc after switching to bison 3.0

本文关键字:yylval yylloc 问题 bison      更新时间:2023-10-16

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

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

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

显然,这种不兼容性应该在某个地方记录下来,但我还没有找到。

尽管如此,值得注意的是,您很少需要在解析器操作中引用前瞻标记的语义值和位置,尽管这样做自古以来就得到支持,并且在C解析器中继续工作,甚至在GLR解析器中。我相信你有你的理由,虽然我很好奇,但你没有义务透露出来。对c++框架代码的检查表明,您应该能够使用yyla.valueyyla.location而不是yylvalyylloc,但没有文档说明,因此没有保证。

如果我们幸运的话,Akim Demaille会过来正确地回答这个问题。就我个人而言,我使用C接口,甚至使用c++;积习难改

在我们的.yy文件中,由于升级到bison 3.0,我将yylloc替换为@$