从野牛2.7升级到3.0后,我在解析器定义文件(.yy)中更改了以下两行

-------old--------
%define parser_class_name smathparser
%name-prefix = "imath"
-------new--------
%define api.prefix {imath}
%define parser_class_name {smathparser}
-------------------

结果是在编译解析器(!)文件时出现以下编译器错误(即使严重使用yylval,编译lexer文件也不会产生错误):
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解析器中仍然可以使用,但您很少需要在解析器操作中引用前瞻 token 的语义值和位置。我相信您有您的理由,虽然我对它们的含义感到好奇,但您没有义务透露它们。对C++框架代码的检查表明,您应该能够使用yyla.valueyyla.location而不是yylvalyylloc,但这没有记录,因此不能保证。

如果幸运的话,Akim Demaille会过来回答这个问题的。就个人而言,即使使用C++,我也使用C接口(interface)。旧习难改。

关于c++ - 切换到野牛3.0后yylval和yylloc的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23685843/

10-10 01:14