在1.5.4节中使用任意谓词控制解析: bison手册指定您可以通过检查以这种格式在括号之间返回谓词来预先解析规则中的选项:
parent_rule: %?{ test_predicate_flag } child_rule_1 |
%?{ !test_predicate_flag } child_rule_2;
问题是我在语法文件中使用上述格式出现此语法错误:
error: invalid directive: ‘%?{’
我在手册中所述的第一个%glr-parser
之前添加了%%
标记。有什么我想念的吗?
更新:在发布之前使用bison 3.0版尝试此操作并且无效。正如医生所说,关于人们对这种“实验性特征”的体验,在线信息并不多。任何人都可以确认或否认它对他们有效吗?
更新#2:在遵循rici发布的解决方案后,生成的.c文件出现问题。 似乎在尝试帮助编译调试时,bison输出以下格式的#line指令:
#line <line_no> <grammar_file_prefix>.tab.c
在任意谓词生成的情况下,规则的上述谓词选项最终出现在解析器文件的主交换机块中,如下所示:
if (! (#line <line_no> <grammar_file_prefix>.tab.c
这当然不会编译,我猜想是在case语句开始之前输出就像我在其他规则匹配选项中看到的那样。一旦提交错误报告,可能会添加一些信息吗?现在,我可以搜索并替换这些以继续前进。
答案 0 :(得分:0)
语义谓词功能在2013年7月底发布的bison 3.0中添加;在撰写本文时,它尚未捆绑到大多数操作系统发行版中,因此您需要从源代码安装甚至尝试它。但是,我快速浏览了一下野牛源代码(截至2013年10月10日,在line 269 of scan.gram.l
找到了扫描仪规范中的错误。该行中的模式将与%{nonletter}[[::graph:]]+
匹配(其中非简约除了alnum,%
或{
),其肯定会匹配%?{
但是,它与%? {
不匹配。我尝试了手册中的例子,确实:
widget:
%?{ new_syntax } "widget" id new_args { $$ = f($3, $4); }
| %?{ !new_syntax } "widget" id old_args { $$ = f($3, $4); }
;
产生您看到的错误,而
widget:
%? { new_syntax } "widget" id new_args { $$ = f($3, $4); }
| %? { !new_syntax } "widget" id old_args { $$ = f($3, $4); }
;
没有。
我认为修复方法是将?
添加到与{notletter}
不匹配的字符中。至少,我尝试过,之后上述两个片段都“起作用”(至少在野牛生成.c文件的程度上。)