在野牛中匹配多种模式

match multiple patterns in bison

在 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... }

但是野牛抱怨 type clash on default action: <statement> != <>。一些谷歌搜索 turned up 如果您没有针对给定条目的操作,它会假定该操作是 { $$ = ; };,这就是您收到此错误的原因。很公平。

这似乎是一种常见的任务,所以我查看了 github 上的六个小解析器示例,它似乎并不常见。

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

在yacc/bison 语法中,每个选项都有自己的操作,这几乎总是您想要的。没有用于对多个备选方案进行分组的语法。所以你需要复制这个动作:

 if: IF expression THEN number { do_Something (, ); }
   | IF expression GOTO number { do_Something (, ); }

如果您不喜欢重复操作,请将语义相同的标记分组:

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