ANTLR 4.4中的不情愿匹配

时间:2018-01-21 11:11:30

标签: regex antlr antlr4

正如不情愿的量词在正则表达式中工作一样,我试图从我的输入中解析两个不同的标记,即对于operand1和operator。并且我的操作员令牌应该不情愿地匹配,而不是贪婪地匹配操作数1的输入令牌。

实施例, 输入:

  

(“A”,“D”,“S”)中的活动指示器

(为了简化我删除了与operand2相关的代码)

预期的操作数1:

  

有效指标

预期的运营商:

  

操作数1的实际输出:

  

中的活动指示器

并且没有运营商规则。 下面是我的语法代码:

grammar Test;

condition: leftOperand WHITESPACE* operator;

leftOperand:  ALPHA_NUMERIC_WS ;
operator: EQUALS | NOT_EQUALS | IN | NOT_IN;

EQUALS  : '=';
NOT_EQUALS  : '!=';
IN  : 'in';
NOT_IN  : 'not' WHITESPACE 'in';

WORD: (LOWERCASE | UPPERCASE )+ ;
ALPHA_NUMERIC_WS:    WORD  ( WORD| DIGIT | WHITESPACE )* ( WORD | DIGIT)+ ;
WHITESPACE  : (' ' | '\t')+;

fragment DIGIT: '0'..'9' ;

LOWERCASE   : [a-z] ;
UPPERCASE   : [A-Z] ;

1 个答案:

答案 0 :(得分:1)

对此的一个解决方案是不为几个单词生成一个标记,而是为每个单词生成一个标记 你的语法看起来像这样:

grammar Test;

condition: leftOperand operator;

leftOperand:  ALPHA_NUMERIC+ ;
operator: EQUALS | NOT_EQUALS | IN | NOT_IN;

EQUALS  : '=';
NOT_EQUALS  : '!=';
IN  : 'in';
NOT_IN  : 'not' WHITESPACE 'in';

WORD: (LOWERCASE | UPPERCASE )+ ;
ALPHA_NUMERIC:    WORD  ( WORD| DIGIT)* ;
WHITESPACE  : (' ' | '\t')+ -> skip; // ignoring WS completely

fragment DIGIT: '0'..'9' ;

LOWERCASE   : [a-z] ;
UPPERCASE   : [A-Z] ;

这样,一旦输入相应的词法分析器规则,词法分析器将不会将整个输入与ALPHA_NUMERIC_WS匹配,因为任何出现的WS都会强制词法分析器离开ALPHA_NUMERIC规则。因此,任何后续输入都将有机会与其他词法规则匹配(按语法中定义的顺序)。