Antlr 跳过匹配词汇元素或标记的部分

Antlr 跳过匹配词汇元素或标记的部分,antlr,antlr3,Antlr,Antlr3,我想匹配一个“{NUM}”,然后让lexer规则返回“NUM”。所以,我试过了 NUM : ('{' { skip(); }) 'NUM' ('}' { skip(); }); 但是,这似乎跳过了所有内容,并在比赛中返回空值。是否可以跳过lexer匹配的部分 antlr 3.4在规则中的任何地方调用skip()都将从lexer中删除整个标记,而不仅仅是某些字符 你能做的是: NUM : '{NUM}' {setText("NUM");} ; 或者,如果NUM是可变的,则执行以下操作:

我想匹配一个“{NUM}”,然后让lexer规则返回“NUM”。所以,我试过了

NUM : ('{' { skip(); })  'NUM'  ('}' { skip(); });
但是,这似乎跳过了所有内容,并在比赛中返回空值。是否可以跳过lexer匹配的部分

antlr 3.4

在规则中的任何地方调用
skip()
都将从lexer中删除整个标记,而不仅仅是某些字符

你能做的是:

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'
 ;

谢谢对于代币,有没有一种等效的方法可以做到这一点?@smartnut007,请参阅我的编辑。