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]失敗します。と のルールの順序を入れ替えるconstFooconstBar、後者は成功し、前者は失敗します。

私が理解していない Happy のセマンティクスの側面はありますか?

4

1 に答える 1

1

編集済み - Happy の構文では、 name ディレクティブで開始プロダクションを指定できます。

%name parser constFoo

これにより、パーサーと呼ばれる関数が作成され、 constFooが開始プロダクションとして 使用されます。

constFoo と constBar の両方のパーサーが必要な場合は、次の構文のようです。

%name parser1 constFoo
%name parser2 constBar

あなたのオリジナルでは、名前付きパーサー関数 (constFoo と constBar) の両方がデフォルトで文法の最初のプロダクション (constFoo) になっていると思います。

于 2011-03-04T18:46:15.217 に答える