ANTLR解析器/词法分析器中的可选前缀
我正在尝试使用ANTLR4来解析由以下语法描述的输入字符串: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优先考虑匹配最长字符
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中排除冒号:
。我改正了语法。如果要在搜索中允许:
,请调整用于搜索的解析器规则。