【问题标题】:Happy parser rule order快乐的解析器规则顺序
【发布时间】:2011-03-04 18:19:50
【问题描述】:

我遇到了一个使用 Happy(Haskell 解析包)的案例,其中看似独立的规则的顺序会以一种奇怪的方式影响其行为。

{
module Parser where
}
%name constFoo
%name constBar
%tokentype { Token }
%error { parseError }
%token
    foo          { Foo }
    bar          { Bar }
%%
constFoo : foo { Foo }
constBar : bar { Bar }
{
parseError :: [Token] -> a
parseError _ = error "Parse error"
data Token = Bar | Foo deriving Show
}

据我了解 Happy 的工作原理,constFoo [Foo]constBar [Bar] 的解析都应该成功。但是,使用上面的代码,constFoo [Foo] 成功但 constBar [Bar] 失败。如果我将规则的顺序交换为constFooconstBar,则后者成功而前者失败。

Happy 的语义是否有一些我不理解的方面?

【问题讨论】:

    标签: haskell happy


    【解决方案1】:

    已编辑 - Happy 的语法允许您使用 name 指令指定开始生产:

    %name parser constFoo
    

    这将创建一个名为 parser 的函数,它使用 constFoo 作为开始生产。

    如果你想要 constFoo 和 constBar 的解析器,这似乎是语法:

    %name parser1 constFoo
    %name parser2 constBar
    

    我认为在您的原始文件中,两个命名解析器函数(constFoo 和 constBar)都默认为语法中的第一个产生式(constFoo)。

    【讨论】:

    • 谢谢,但我不确定是不是这个问题;如果我删除 %name constFoo 然后 constBar 表现出同样奇怪的顺序相关行为。
    • 嗨,Judah - 由于错过了《快乐手册》,我重新修改了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多