ANTLR 4.4 中的不情愿匹配



就像不情愿的量词在正则表达式中起作用一样,我正在尝试从我的输入中解析两个不同的标记,即 for operand1 和运算符。我的运算符令牌应该不情愿地匹配,而不是贪婪地匹配操作数 1 的输入令牌。

例输入:

("A"、"D"、"S"(中的活动指示器

(为了简化,我删除了与操作数2相关的代码(

预期操作数1:

活动指示器

预期操作员:

操作数 1 的实际输出:

中的活动指示器

运算符规则为 non。以下是我的语法代码:

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] ;

一种解决方案是不要为多个单词生成一个标记,而是为每个单词生成一个标记。
然后,您的语法将如下所示:

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规则。因此,任何后续输入都有机会与其他词法分析器规则匹配(按照它们在语法中定义的顺序(。

最新更新