ANTLR解析器/词法分析器中的可选前缀

ANTLR解析器/词法分析器中的可选前缀,antlr,antlr4,Antlr,Antlr4,我正在尝试使用ANTLR4来解析由以下语法描述的输入字符串: grammar MyGrammar; parse : PREFIX? SEARCH; PREFIX : [0-9]+ ':' ; SEARCH : .+ ; e、 g.有效的输入字符串包括: 0: maracujá apple 3:€53.60 1: 10kg 2:chilli pepper 但是SEARCH规则总是匹配整个字符串,不管它是否有前缀 我理解这是因为ANTLR4 lexer优先考虑匹配最长字符

我正在尝试使用ANTLR4来解析由以下语法描述的输入字符串:

grammar MyGrammar;

parse : PREFIX? SEARCH;

PREFIX
  : [0-9]+ ':'
  ;

SEARCH
  : .+ 
  ;
e、 g.有效的输入字符串包括:

0: maracujá
apple
3:€53.60
1: 10kg
2:chilli pepper
但是
SEARCH
规则总是匹配整个字符串,不管它是否有前缀

我理解这是因为ANTLR4 lexer优先考虑匹配最长字符串的规则。因此,
搜索
规则匹配所有输入,而不给
前缀
规则一个机会

而非贪婪版本(即
SEARCH:.+?;
)也有同样的问题,因为(据我所知)它在规则中只是非贪婪的,而
SEARCH
规则没有任何其他部分来约束它

如果有帮助的话,我可以限制
搜索
文本以排除
:“
,但我真的希望它能识别其他任何东西-unicode字符、符号、数字、空格等

我已经读过了,但是在这种情况下,字符串的主体(在前缀之后)明显受到更多的约束


注意:
SEARCH
文本可能有一个结构,比如上面的
53.00欧元和
10kg
(我也希望用ANTLR4进行解析),或者它可能只是免费文本,比如上面的
apple
maracujá
chilli pepper
。但是我已经尝试过简化,这样我就可以先解决提取
前缀的问题。

ANTLR在解析之前进行词法分析。lexer更喜欢长匹配,搜索标记匹配每个前缀标记,甚至是附加到它的任何字符,因此搜索匹配您的完整行

为了防止这种情况:保持lexer规则不相交,或者至少标记不应该相互包含

parse : prefix? search;

search: (WORD | NUMBER)+;

prefix: NUMBER ':';

NUMBER : [0-9]+;
WORD : (~[0-9:])+;

不约束
SEARCH
规则是没有意义的,因为您的语法可能不明确
0:x1:y
可以标记为
PREFIX SEARCH PREFIX SEARCH
PREFIX SEARCH
。在我的语言中
0:x1:y
将是
0:
前缀,而
SEARCH
将是
x1:y
前缀,因此只有一个
前缀
,接下来的一切都是
搜索
。不幸的是,这并没有达到我希望的效果。当我使用示例进行测试时:
0:maracujá
search
匹配整个字符串。我想要
prefix
=
0
search
=
maracujá
<代码>苹果
:好的<代码>3:53.60欧元
搜索
匹配整个字符串。我期望
前缀
=
3
搜索
=
=
53.60欧元
<代码>1:10kg
:正常<代码>2:辣椒粉
搜索
匹配整个字符串。我期望
前缀
=
2
搜索
=
辣椒
。从WORD中排除冒号
。我改正了语法。如果要在搜索中允许
,请调整用于搜索的解析器规则。