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

时间:2012-12-13 22:53:32

标签: antlr antlr3

我想匹配“{NUM}”,然后让词法分析器规则返回“NUM”。所以,我试过了

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

但是,这似乎会跳过一切,并在比赛中返回空。是否有可能跳过lexer匹配的部分内容?

antlr 3.4

1 个答案:

答案 0 :(得分: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'
 ;