1

我遇到了一个使用 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]失败。如果我将规则的顺序交换为constFooand constBar,则后者成功而前者失败。

Happy 的语义是否存在我不理解的某些方面?

4

1 回答 1

1

已编辑 - Happy 的语法允许您使用 name 指令指定开始生产:

%name parser constFoo

这将创建一个名为parser的函数,并使用constFoo作为开始生产。

如果你想要 constFoo 和 constBar 的解析器,这似乎是语法:

%name parser1 constFoo
%name parser2 constBar

I think in your original, both named parser functions (constFoo and constBar) defaulted to the first production in the grammar (constFoo).

于 2011-03-04T18:46:15.217 回答