私はANTLR 4.5でレクサーを書くことを学び始めています。ドキュメントとして機能するthis pageから、more、pushMode(x)、popMode、type(x)、channel(x)、mode(x)、skipというLexerコマンドが存在することがわかりました。ANTLR4でのさまざまなLexerコマンドの機能。私の解釈は正しいのですか?それぞれは何をしていますか?
私はその機能をはっきりと理解できませんでした。
これは、現在のトークンに読み込まれているすべての文字をスキップし
スキップ:以下は、それらのそれぞれが何をするかの私の理解です。過去のトークンは変更されません。
レクサーは、いくつかの文字a
を読んでいて、それが次のb
を読み込み、
SOME_RULE : 'b' -> skip;
に対応するのであれば、それはa
とb
の両方を捨てて次のトークンに移動します。
さらに
これは何かわかりません。ドキュメントには、読み込まれたテキストが破棄されることはありませんが、最終的にはどのトークンがそこに存在するかについては何も記載されていません。意味値ab
、またはRULE_1 RULE_2
とRULE_2
への結果のトークン対応させていただきます、または何か他のもの、a
を読むと、私は
RULE_1 : 'a' -> more;
RULE_2 : 'b';
を持っていると仮定して、b
?
I型
RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
のみa
がTOKEN_1
のセマンティック値とする持って、またはすべての文字が右からではなく、トークンたルールに対応する場合は(X)
最後のトークンは、意味値と見なされますか? b
とa
が到着した場合、TOKEN_1
の値はa
またはba
となりますか?
モード(X)
これは新しいmode
にモードを切り替えます。しかし、ここでは、スイッチのポイントが保持されるか破棄されるまで文字が読み込まれますか?トークンはどうですか?各モードに別々のスタックがありますか?
pushMode(x)の
これはどのようにmode
は異なるのですか?既に読み込まれた文字が、それが起こっているモードにプッシュされるのは、mode
で起こらないのでしょうか?
popMode
ポップアウトとは何ですか?もしあれば、私は、トークンb
とa
、popMode
原因だけa
が返されるか、またはba
、またはを取得する場合、私は
RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
を持っている場合は?スタックが空のために時折エラーが発生するのはなぜですか?
チャンネル(x)
私はこれに関する説明を見つけることができませんでした。チャンネルとは何ですか?
可能であれば、これらのコマンドのそれぞれの機能を明確にしてください。
これが広すぎる場合は教えてください。
ありがとうございます。