匹配[STRING]或[STRING]

时间:2015-03-11 15:17:50

标签: antlr4

我试图在Antlr4中匹配这些行:

John or appleJohn Smith or apple sauce

我使用以下规则:

conjunction : WORDS OR WORDS ;
WORDS: [A-Za-z ]+ ;
OR: ' or ' ;

但第一个WORDS antlr发现还包括'或'。所以它并没有将约翰和苹果视为两个不同的单词或者分开。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果2个或更多词法分析器规则匹配相同数量的字符,则首先定义的规则将获胜。换句话说,对于输入or,可以匹配规则WORDSOR。由于首先定义WORDS,因此获胜。

交换订单:

conjunction : WORDS OR WORDS ;
OR: ' or ' ;
WORDS: [A-Za-z ]+ ;

然而,ANTLR的词法分析器尽可能匹配。因此,只有在对or进行标记时,上述操作才有效。如果您尝试对John Smith or apple sauce进行标记,则规则WORDS将匹配所有内容!

你不应该包括空格:

conjunction : WORDS+ OR WORDS+ ;
OR: 'or' ;
WORDS: [A-Za-z]+ ;
SPACES: [ \t\r\n] -> skip ;

当我使用从上面的语法生成的解析器测试输入John or apple时,我得到了这个:

enter image description here

并输入John Smith or apple sauce这个:

enter image description here