Antlr4 ANTLR语义谓词-仅使用部分匹配项
我需要处理这个序列:。 在ANTLR v3中,我使用了以下规则: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
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 '>'!");}
;