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 のセマンティクスの側面はありますか?