2011-03-04 18 views
1

一見独立したルールの順序が奇妙な方法でその動作に影響を与えるハッピー(Haskell解析パッケージ)を使用してケースに入りました。私は、パースconstFoo [Foo]constBar [Bar]の両方がどのようにハッピーな作品成功する必要があります理解したようハッピーパーサールールの注文

{ 
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 
} 

。ただし、上記のコードでは、constFoo [Foo]は成功しますが、constBar [Bar]は失敗します。 constFooconstBarのルールの順序を入れ替えた場合、後者は成功し、前者は失敗します。

私は理解していないハッピーのセマンティクスにいくつかの側面がありますか?編集

答えて

1

- 幸せの構文は、名前のディレクティブでスタート生産を指定することができます:

%name parser constFoo 

これは、関数を作成しますパーサと呼ばれ、それがスタートの生産としてconstFooを使用しています。

あなたはconstFooとconstBarの両方のためのパーサをしたい場合は、この構文のようだ:

%name parser1 constFoo 
%name parser2 constBar 

私はあなたの元、両方の名前のパーサ関数(constFooとconstBar)での最初の生産にデフォルト設定だと思います文法(constFoo)。

+0

ありがとうございますが、それが問題であるかどうかはわかりません。 '%name constFoo'を削除すると、constBarは同じ奇妙な順序依存の動作を示します。 –

+0

こんにちはユダ - 私はハッピーマニュアルを読んでいないので、私の答えを再加工しました。 –