【发布时间】: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] 失败。如果我将规则的顺序交换为constFoo 和constBar,则后者成功而前者失败。
Happy 的语义是否有一些我不理解的方面?
【问题讨论】: