2

「{NUM}」と一致させてから、レクサールールに「NUM」を返させたいと思います。だから、やってみた

NUM : ('{' { skip(); })  'NUM'  ('}' { skip(); });

しかし、それはすべてをスキップし、試合で空を返すようです。レクサーマッチの一部をスキップすることは可能でしょうか?

antlr 3.4

4

1 に答える 1

3

ルールの任意の場所を呼び出すskip()と、特定の文字だけでなく、トークン全体がレクサーから削除されます。

あなたができることはこれです:

NUM
 : '{NUM}' {setText("NUM");}
 ;

または、NUMが可変の場合は、次のようにします。

NUM
 : '{' 'A'..'Z'+ '}' {setText($text.substring(1, $text.length() - 1));}
 ;

これにより、トークンから最初と最後の文字が削除されます。

編集

smartnut007は次のように書いています。

トークンに対してこれを行う同等の方法はありますか?

パーサールール内のトークンのテキストを変更する方法を意味する場合は、次のことを試してください。

parser_rule
 : LEXER_RULE {$LEXER_RULE.setText("new-text");}
 ;

LEXER_RULE 
 : 'old-text'
 ;
于 2012-12-13T23:03:39.973 に答える