ANTLR语义谓词 - 仅消耗部分匹配

时间:2014-11-07 08:54:36

标签: antlr4

我需要处理这个序列:< 1>,< 1-2>,< 3-5 /0.5/>。 在ANTLR v3中,我使用了以下规则:

LPOINTY : ('<' REPEAT (PROBABILITY)? '>') => '<' // will consume only '<' 
repeatOperator : LPOINTY_OR_ABNF_URI (XML_NM_TOKEN (weightOrProbability'>')?

在ANTLR v4中,不允许这个opertor“=&gt;”,所以我这样写了:

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 - 它匹配'&lt; ..&gt;'
  • 的内容
  • weightOrProbability和WEIGHT_OR_PROBABILITY - 匹配/0.5 /
  • 概率 - 匹配/0.5 /
  • WS - 匹配空格
  • SHARP_BRACKET_RIGHT - 匹配'&gt;'

有更好的方法吗?我想使用预见功能,只使用第一个字符,就像旧版本一样。有办法吗?

1 个答案:

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