Счастливый порядок правил парсера - PullRequest
1 голос
/ 04 марта 2011

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

Есть ли какой-то аспект в семантике Хэппи, который я не понимаю?

1 Ответ

1 голос
/ 04 марта 2011

Отредактировано - Синтаксис Happy позволяет указать начало производства с помощью директивы name:

%name parser constFoo

Это создает функцию с именем parser и использует constFoo в качестве начала производства.

Если вам нужны парсеры как для constFoo, так и для constBar, этот синтаксис выглядит следующим образом:

%name parser1 constFoo
%name parser2 constBar

Я думаю, что в вашем оригинале обе именованные функции синтаксического анализатора (constFoo и constBar) по умолчанию выполняли первое производство в грамматике (constFoo).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...