快乐的解析器规则顺序

时间:2011-03-04 18:19:51

标签: haskell happy

我遇到了一个使用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的语义是否有某些方面?

1 个答案:

答案 0 :(得分:1)

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

%name parser constFoo

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

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

%name parser1 constFoo
%name parser2 constBar

我认为在你的原文中,两个命名的解析器函数(constFoo和constBar)默认为语法中的第一个生成(constFoo)。