【问题标题】:match multiple patterns in bison匹配野牛中的多个模式
【发布时间】:2020-12-17 17:44:55
【问题描述】:

在 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,如果您没有针对给定条目的操作,则假定该操作是{ $$ = $1; };,这就是您收到此错误的原因。很公平。

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

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

【问题讨论】:

    标签: bison yacc


    【解决方案1】:

    在 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); }
    

    【讨论】:

    • 这似乎令人惊讶,但生活就是这样。不幸的是,第二个不起作用,因为IF 1=1 THEN PRINT...。无赖。
    • @maury:我敢打赌你没有尝试。你实际上可以添加生产IF expression THEN statement,只要statement不能生产number
    • (这是因为 LR 解析允许产生式不明确,直到需要减少)
    • 声明确实允许数字,但我正在重新排列它,所以它不会
    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多