「コード」の後ろに「{」と続けて、解析に関心のないコードを続け、 '}'をつけた言語を解析しています。 。ANTLR4パースルールを開いて閉じ括弧に一致させる
単に右中括弧に進んでしまう..whichskip_code: 'code' '{' ~['}']* '}'
:私は、理想的のようなルールを持っているしたいと思います。問題は、スキップされるコード自体が中括弧のペアを持つ可能性があることです。だから、私が本質的に必要とするのは、カウンターを動かし、カウンターが0に戻ったときに解析ルールを終了することです。
何が最善の方法ですANTLR4でこれは? 「コード」が検出されたときにカスタム関数にスキップして、トークンを呑み込んでカウンターを動かすべきですか、それとも文法自体でこれを表現するためのエレガントな方法がありますか?
EDIT:いくつかのサンプルコード、要求通り:私はレクサーでこれらのコードブロックを処理したい
skip_code: CODE_SYM block;
block: OPEN_CURLY (~CLOSE_CURLY | block)* CLOSE_CURLY;
CODE_SYM: 'code';
OPEN_CURLY: '{';
CLOSE_CURLY: '}';
解析しているコードの実際の例を投稿できますか? –
無視したいコードブロック内に文字列リテラル( '{'または '}'を含むかもしれません)がありますか?それらのコードブロックの中にコメントがありますか( '{'か '}'を含むかもしれません)?あなたはマイクの提案に行くことができますが、レキシング中にこれらのコードブロックを破棄する方が簡単かもしれません。パーサーでそれらを破棄すると、 '{...} 'の中のすべてがまだトークン化される必要があることになります。 –
@BartKiersええ、中括弧内の内容は、独自の文字列、中括弧などを含む、完全に合法なCコードと見なすことができます。これにより、レクサーで扱いにくくなります。理想的には、私はそのコードをトークン化したくはありませんが、マイクの提案はパーザで実装するのがとても簡単です。それがレクサーでどのように行われるかについての提案はありますか? – Stan