我试图使用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词法分析器优先考虑与最长字符串匹配的规则。因此,SEARCH
规则匹配所有输入,而不是给PREFIX
规则一个机会。
非贪婪版本(即SEARCH : .+? ;
)也存在同样的问题,因为(据我所知),它只是规则中的非贪婪 - SEARCH
规则没有&# 39;没有任何其他部分来限制它。
如果有帮助,我可以约束SEARCH
文字以排除':'
,但我真的希望它能识别其他任何内容 - unicode字符,符号,数字,空格等。
我已阅读Lexer to handle lines with line number prefix但在这种情况下,字符串的正文(在前缀之后)受到更多约束。
注意: SEARCH
文字可能有一个结构 - 如上面的€53.00
和10kg
(我也要像解析ANTLR4一样)或者它可能只是自由文本 - 例如上面的apple
,maracujá
和chilli pepper
。但是我试图简化,所以我可以解决首先提取PREFIX
的问题。
答案 0 :(得分:2)
ANTLR在解析之前确实是lexing。词法分析器更喜欢长匹配,SEARCH标记匹配每个PREFIX标记,甚至是附加到其上的任何字符,因此您的完整行匹配SEARCH。
为了防止这种情况:保持词法分析器规则不相符,或者至少令牌不应该相互包含。
parse : prefix? search;
search: (WORD | NUMBER)+;
prefix: NUMBER ':';
NUMBER : [0-9]+;
WORD : (~[0-9:])+;