0

在 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 语句开始之前的行上输出,就像我在其他规则匹配选项中看到的那样。提交错误报告后,也许还有一些信息要添加到错误报告中?现在,我可以搜索并替换这些内容以继续前进。

4

1 回答 1

0

语义谓词功能在 2013 年 7 月下旬发布的 bison 3.0 中添加;在撰写本文时,它尚未捆绑到大多数操作系统发行版中,因此您需要从源代码安装才能尝试它。但是,我快速浏览了一下 bison 源代码(截至 2013 年 10 月 10 日,在scan.gram.l 的第 269 行发现了扫描仪规范中的一个错误)

该行中的模式将匹配%{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 文件的程度上。)

于 2013-10-12T04:22:29.127 回答