在野牛中匹配多种模式
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 (, ); }
在 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 (, ); }