Antlr4 ANTLR语义谓词-仅使用部分匹配项

Antlr4 ANTLR语义谓词-仅使用部分匹配项,antlr4,Antlr4,我需要处理这个序列:。 在ANTLR v3中,我使用了以下规则: LPOINTY : ('<' REPEAT (PROBABILITY)? '>') => '<' // will consume only '<' repeatOperator : LPOINTY_OR_ABNF_URI (XML_NM_TOKEN (weightOrProbability'>')? 在ANTLR v4中,不允许使用此运算符=>,因此我这样写: LPOINTY_OR_ABNF

我需要处理这个序列:。 在ANTLR v3中,我使用了以下规则:

LPOINTY : ('<' REPEAT (PROBABILITY)? '>') => '<' // will consume only '<' 
repeatOperator : LPOINTY_OR_ABNF_URI (XML_NM_TOKEN (weightOrProbability'>')?
在ANTLR v4中,不允许使用此运算符=>,因此我这样写:

LPOINTY_OR_ABNF_URI // will return only digit, ex: 1, 1-2, 3-5 
: '<' REPEAT '>' { setText(getText().substring(1, getText().length() - 1)); }
| '<' REPEAT WS+ { setText(getText().substring(1, getText().length())); }
; 

repeatOperator
:  LPOINTY_OR_ABNF_URI (WEIGHT_OR_PROBABILITY)? SHARP_BRACKET_RIGHT? 
;
其中,代币:

XML\u NM\u标记-它匹配 权重或概率和权重或概率-匹配/0.5/ 概率-它匹配/0.5/ WS-it匹配空格 右尖括号-与“>”匹配 有更好的办法吗?我想使用前瞻功能,只使用第一个字符,就像在旧版本中一样。有办法做到这一点吗

我的解决方案:

 REPEAT_OP1
 : '<' REPEAT '>'    { setText(getText().substring(1, getText().length()-1)); }
 ;             

 REPEAT_OP2
 :   '<' REPEAT      { setText(getText().substring(1, getText().length())); }       
 ;

repeatOperator
: REPEAT_OP1 
| REPEAT_OP2 WEIGHT_OR_PROBABILITY? SHARP_BRACKET_RIGHT 
| REPEAT_OP2 WEIGHT_OR_PROBABILITY? {notifyErrorListeners("Missing closing '>'!");}
;