ANTLR解析器/lexer中的可选前缀



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

grammar MyGrammar;
parse : PREFIX? SEARCH;
PREFIX
: [0-9]+ ':'
;
SEARCH
: .+ 
;

例如,有效的输入字符串包括:

0: maracujá
apple
3:€53.60
1: 10kg
2:chilli pepper

但是SEARCH规则总是匹配整个字符串——不管它是否有前缀。

我理解这是因为ANTLR4 lexer优先选择与最长字符串匹配的规则。因此,SEARCH规则匹配所有输入,而不给PREFIX规则机会。

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

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

我读过Lexer来处理带有行号前缀的行,但在这种情况下,字符串的主体(在前缀之后)受到的约束要大得多。

注意:SEARCH文本可能有一个结构,比如上面的€53.0010kg(我也希望ANTLR4解析它),或者它可能只是自由文本,比如上面applemaracujáchilli pepper。但我已经尝试过简化,这样我就可以首先解决提取PREFIX的问题。

ANTLR在解析之前执行词法分析。lexer更喜欢长匹配,SEARCH标记匹配每个PREFIX标记,甚至是附加到它的任何字符,所以您的整行都由SEARCH匹配。

为了防止这种情况:保持lexer规则的析取,或者至少令牌不应该相互包含。

parse : prefix? search;
search: (WORD | NUMBER)+;
prefix: NUMBER ':';
NUMBER : [0-9]+;
WORD : (~[0-9:])+;

相关内容

  • 没有找到相关文章

最新更新