2013-04-04 2 views
10

私はANTLR4を学んでおり、字句モードでプレイしようとしていました。同じトークンを複数の字句モードで表示させるにはどうすればよいですか?非常に簡単な例として、私の文法には2つのモードがあり、両方で白いスペースと行末を一致させたいとしましょう。たとえば、WS_MODE1とWS_MODE2で終わらないでどうすればいいですか?どちらの場合も同じ定義を再利用する方法はありますか?私はモードに関係なく、すべての空白の出力ストリームにWSトークンを取得したいと考えています。同じことが、両方のモードで使用できるEOLやその他のキーワードにも当てはまります。ANTLR4で複数の字句モードで表示されるトークンを定義する方法は?

答えて

12

ルールには異なる名前が必要ですが、-> type(...) lexerコマンドを使用して同じタイプを指定することができます。それは彼らのためにトークンを定義しないようにMode1_WSMode2_WSfragmentルールではないにもかかわらず

WS : [ \t]+; 

mode Mode1; 

    Mode1_WS : WS -> type(WS); 

mode Mode2; 

    Mode2_WS : WS -> type(WS); 

、コードジェネレータは、typeコマンドを参照してください、あなたは自分のタイプを再割り当てすることを知っているだろう。

+0

これらのLexerルールの使い方に関する短い質問:パーサールールでは、WSまたはMode1_WS、Mode2_WSを参照していますか?私は両方を試しましたが、パーサーのルールでそれらを直接参照することなく、レクサールールを定義するだけです。その意味では、「エイリアス」よりむしろ「インポートステートメント」です。 –

+0

'type'コマンドは明示的にトークンタイプを割り当てます。これはパーサーに表示されるタイプです。この場合、これらの3つのルールのいずれかによって作成されたトークンを参照するために、「WS」が使用されます。 –

+0

@SamHarwell最終モード仕様を終了させるものは何ですか?私は、一部のレクサーのドキュメントに、フラグメントの使用がデフォルトを含むすべてのモードで使用可能であることを示す最終モード仕様に従って、フラグメントのデフがあることに気付きました。 – bvj

関連する問題