0
Мне нужно обрабатывать следующие последовательности: < 1>, < 1-2>, < 3-5 /0.5/>. В ANTLR v3 я использовал эти правила:ANTLR семантический предикат - потреблять только часть матча
LPOINTY : ('<' REPEAT (PROBABILITY)? '>') => '<' // will consume only '<'
repeatOperator : LPOINTY_OR_ABNF_URI (XML_NM_TOKEN (weightOrProbability'>')?
В ANTLR v4, туда не пускают этот opertor "=>", так что я написал это так:
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_NM_TOKEN - это соответствие содержания '< ..>'
- weightOrProbability и WEIGHT_OR_PROBABILITY - это матч /0.5/
- ВЕРОЯТНОСТЬ - это соответствует /0.5/
- WS - это соответствует белые пространства
- SHARP_BRACKET_RIGHT - это соответствует '>'
Есть ли лучший способ это? Я хотел бы использовать перспективные функции и потреблять только первый charcter, как в старой версии. Есть ли способ сделать это?