在bison中匹配多个模式

在bison中匹配多个模式,bison,yacc,Bison,Yacc,在lex/flex中,可以使用普通的正则表达式规则将多个模式匹配到一个令牌,但是在yacc/bison端的等价物是什么 在我的代码中,对于单个任务,我有两个可能的语法: IF expression THEN number IF expression GOTO number 看起来很明显 | IF expression THEN number | IF expression GOTO number { ... guts of the handler go here... } 但野牛抱怨默认操作

在lex/flex中,可以使用普通的正则表达式规则将多个模式匹配到一个令牌,但是在yacc/bison端的等价物是什么

在我的代码中,对于单个任务,我有两个可能的语法:

IF expression THEN number
IF expression GOTO number
看起来很明显

|
IF expression THEN number
|
IF expression GOTO number
{ ... guts of the handler go here... }
但野牛抱怨默认操作时类型冲突:!=。通过谷歌搜索发现,如果给定条目没有动作,则假定动作是
{$$=$1;},这就是出现此错误的原因。很公平

这似乎是一种常见的任务,所以我在github上查看了半打小解析器的示例,但看起来它毕竟不太常见


那么这里的正确语法是什么呢?

在yacc/bison语法中,每个选项都有自己的操作,这几乎总是您想要的。没有将多个备选方案分组的语法。因此,您需要复制操作:

 if: IF expression THEN number { do_Something ($2, $4); }
   | IF expression GOTO number { do_Something ($2, $4); }
如果您不喜欢重复操作,请将语义相同的令牌分组:

 then: THEN | GOTO
 if:   IF expression then number { do_Something ($2, $4); }

令人惊讶的是,这是不可能的,但生活就是如此。不幸的是,第二个不起作用,因为
如果1=1,则打印…
。莫利:我打赌你没试过。实际上,您可以添加production
IF expression THEN语句
,只要
语句
不能生成
number
(这是因为LR解析允许在需要减少之前产品是不明确的)语句确实允许使用number,但我正在重新排列它,这样它就不会