0

現在、次のような antlr に複数行のコメント lexer ルールがあります。

MULTILINE: '/*' .* '*/' {$channel=HIDDEN;} ;

ただし、これにより現在、次のようなことが可能になります。

/* /* hello */ */

antlrでネストコメントを無効にする方法はありますか? 私はさまざまなことを試しました

MULTILINE: '/*' (~(MULTILINE)|.*) '*/' {$channel=HIDDEN;} ;

しかし、それはうまくいきません。どんな助けでも大歓迎です!

4

2 に答える 2

2

いいえ、それは正しくありません.*.+貪欲ではありません。

次の文法によって生成されたパーサーがあるとします。

grammar T;

parse
 : (t=. {System.out.printf("\%-15s'\%s'\n", tokenNames[$t.type], $t.text);} )* EOF
 ;

MULTILINE
 : '/*' .* '*/' {$channel=HIDDEN;}
 ;

OTHER
 : .
 ;

入力"/* /* hello */ */"により、コマンド ラインで次のように生成されます。

他の ' '
他の '*'
他の '/'

つまり、がチャネル"/* /* hello */"に配置され、 3 つのトークンが構築されます。HIDDENOTHER

于 2013-04-18T17:50:54.447 に答える