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