2014-11-07 1 views
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, как в старой версии. Есть ли способ сделать это?

ответ

0

Мое решение:

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 '>'!");} 
; 
Смежные вопросы