就像不情愿的量词在正则表达式中起作用一样,我正在尝试从我的输入中解析两个不同的标记,即 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
规则。因此,任何后续输入都有机会与其他词法分析器规则匹配(按照它们在语法中定义的顺序(。