我正在尝试使用 Bison 的语义谓词 https://www.gnu.org/software/bison/manual/html_node/Semantic-Predicates.html#Semantic-Predicates功能,但我在尝试让它工作时遇到了一些问题。
当我尝试编译生成的文件时出现问题.tab.c
与 GCC 文件。我在用海湾合作委员会7.1.0 https://gcc.gnu.org/gcc-7/(2017-05-02) 和 Bison 3.0.4。这是编译错误的片段:
test2.tab.c: In function ‘yyuserAction’:
test2.tab.c:811:12: error: stray ‘#’ in program
if (! (#line 19 "test2.y" /* glr.c:816 */
^
test2.tab.c:811:13: error: ‘line’ undeclared (first use in this function); did you mean ‘uint’?
if (! (#line 19 "test2.y" /* glr.c:816 */
^~~~
uint
我采用了 Bison 的语义谓词示例,并将其作为一个工作示例:
%{
int new_syntax = 0;
int yyerror(const char* msg) { /* some error handling */ }
%}
%token id
%glr-parser
%%
prog: %empty
| prog widget
| prog flip
;
widget: %?{ new_syntax } "widget" id old_arg
| %?{ !new_syntax } "widget" id new_arg
;
flip: "flip" { new_syntax = !new_syntax; }
;
old_arg: /* something here */
;
new_arg: /* something else here */
;
%%
在研究了选项卡文件后,我意识到在#line
指令解决了语法错误,(但直接修改生成的文件感觉有点老套。另外,您必须与一些空格对齐,以便 GCC 计算代码的正确列位置)。
我想知道这是 Bison 本身的错误,还是我使用了错误的语义谓词,或者这个语法在早期版本的 GCC 中是否正确,或者其他什么。
我也尝试在网上搜索这个问题,或者搜索已经向 Bison 提交的错误,但我没有找到。 (最新的 Bison 版本似乎已经有 3 岁左右了。如果这个问题根本没有得到解决,我会感到惊讶。)解释是什么?
如果有必要,我可以尝试用 bison 提交错误(需要弄清楚如何做到这一点),但我不确定这是我自己的问题还是其他问题。