[英]Reluctant matching in ANTLR 4.4
就像勉强的量词在正则表达式中工作一样,我正在尝试从输入中解析两个不同的标记,即用于操作数和运算符。 而且我的运算符应该被勉强地匹配,而不是贪婪地匹配操作数1的输入令牌。
示例,输入:
活动指示器(“ A”,“ D”,“ S”)
(为简化起见,我删除了与操作数2相关的代码)
预期的操作数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] ;
一种解决方案是不为多个单词生成一个令牌,而是为每个单词生成一个令牌。
您的语法将如下所示:
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
规则。 因此,随后的任何输入都将有机会与其他词法规则匹配(按照它们在语法中定义的顺序)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.