我试图在Antlr4中匹配这些行:
John or apple
和John Smith or apple sauce
。
我使用以下规则:
conjunction : WORDS OR WORDS ;
WORDS: [A-Za-z ]+ ;
OR: ' or ' ;
但第一个WORDS
antlr发现还包括'或'。所以它并没有将约翰和苹果视为两个不同的单词或者分开。
我该如何解决这个问题?
答案 0 :(得分:2)
如果2个或更多词法分析器规则匹配相同数量的字符,则首先定义的规则将获胜。换句话说,对于输入or
,可以匹配规则WORDS
和OR
。由于首先定义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
时,我得到了这个:
并输入John Smith or apple sauce
这个: