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