1

私はこのようなルールを書くことができないことに気づきました:

ausdruck: label=ausdruck 'x' #One
        | label='foo'    #Two
        ;

次のエラーが発生します。

label'label'タイプが前の定義と一致しません:TOKEN_LABEL!= RULE_LABEL

これは、1回のラベルがパーサールールを参照し、もう1回はレクサールールを参照するためです。ルールを少し変更すると:

ausdruck: label=ausdruck 'x' #One
        | label2='foo'    #Two
        ;

すべてが正常に動作します。しかし、なぜ?私の最初の試みの何が問題になっていますか?

4

1 に答える 1

1

#One代替にラベルを付けるための構文の使用に固有のバグを見つけたようです。

各ラベルは、生成されたコードの具体的なタイプのフィールドに対応しています。ルールはをausdruck返しAusdruckContext、トークンを一致させると。を'foo'返しますTerminalNode。これらのタイプには互換性がないため、通常、ラベル名は異なっている必要があります。ただし、外側の選択肢#One#Twoにラベルを付けたので、2つの異なるコンテキストのそれぞれに同じ名前のラベルを含めることができるはずです。

于 2013-03-18T17:21:53.843 に答える