Antlr4 匹配[STRING]或[STRING]

Antlr4 匹配[STRING]或[STRING],antlr4,Antlr4,我正在尝试匹配Antlr4中的以下行: 约翰或苹果和约翰·史密斯或苹果酱 我使用以下规则: conjunction : WORDS OR WORDS ; WORDS: [A-Za-z ]+ ; OR: ' or ' ; 但是antlr找到的第一个单词也包括'or'。因此,它并不认为约翰和苹果是由或分隔的两个不同的词 如何解决此问题?如果2个或多个lexer规则匹配相同数量的字符,则规则define first将获胜。换句话说,对于输入的或,可以匹配规则单词和或。既然单词是首先定义的,它就赢了

我正在尝试匹配Antlr4中的以下行:

约翰或苹果
约翰·史密斯或苹果酱

我使用以下规则:

conjunction : WORDS OR WORDS ;
WORDS: [A-Za-z ]+ ;
OR: ' or ' ;
但是antlr找到的第一个
单词也包括'or'。因此,它并不认为约翰和苹果是由或分隔的两个不同的词


如何解决此问题?

如果2个或多个lexer规则匹配相同数量的字符,则规则define first将获胜。换句话说,对于输入的
,可以匹配规则
单词
。既然
单词
是首先定义的,它就赢了

交换订单:

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

然而,ANTLR的lexer尽可能匹配。因此,只有将
标记化时,上述方法才有效。如果您尝试将约翰·史密斯或苹果酱标记为
,则规则
单词将匹配所有内容

不应包含空格:

conjunction : WORDS+ OR WORDS+ ;
OR: 'or' ;
WORDS: [A-Za-z]+ ;
SPACES: [ \t\r\n] -> skip ;
当我使用由上述语法生成的解析器测试输入
John或apple
时,我得到以下结果:

对于输入
约翰·史密斯或苹果酱
如下:


删除单词regex(
WORDS:[A-Za-z]+;
)中的空格。但我希望它能够匹配空格。请参阅我编辑的文章。使用非贪婪运算符是否有效?(
WORDS:[A-Za-z]+?;
)因此,只有在标记化或。如果你试图用约翰·史密斯或苹果酱来做标记,那么规则词将与一切匹配!什么意思?那我怎么才能符合我的要求呢?当我从
单词
中删除空格时,它不起作用,因为它占用了行的末尾。@RaptorDotCpp对于我发布的第一个语法,如果您让lexer标记输入
“或”
,它将创建一个
标记。如果您让同一个lexer标记输入
“John或apple”
,它将创建一个
单词
标记。然后如何按照我在第二个语法中的建议匹配我想要的。