在 1.5.4 节使用任意谓词控制解析:野牛手册指定您可以通过检查括号之间的谓词以这种格式的返回来使规则中的选项的解析失败:
parent_rule: %?{ test_predicate_flag } child_rule_1 |
%?{ !test_predicate_flag } child_rule_2;
问题是我的语法文件中出现上述格式的语法错误:
error: invalid directive: ‘%?{’
如手册中所述,我在第一个之前添加了%glr-parser
标志%%
。有什么我想念的吗?
更新:在发布之前尝试使用野牛 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 语句开始之前的行上输出,就像我在其他规则匹配选项中看到的那样。提交错误报告后,也许还有一些信息要添加到错误报告中?现在,我可以搜索并替换这些内容以继续前进。