正如不情愿的量词在正则表达式中工作一样,我试图从我的输入中解析两个不同的标记,即对于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] ;
答案 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
规则。因此,任何后续输入都将有机会与其他词法规则匹配(按语法中定义的顺序)。