Я столкнулся с делом, использующим 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
, последний будет успешным, а первый - неудачным.
Есть ли какой-то аспект в семантике Хэппи, который я не понимаю?