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

时间:2015-04-20 16:20:27

标签: 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词法分析器优先考虑与最长字符串匹配的规则。因此,SEARCH规则匹配所有输入,而不是给PREFIX规则一个机会。

非贪婪版本(即SEARCH : .+? ;)也存在同样的问题,因为(据我所知),它只是规则中的非贪婪 - SEARCH规则没有&# 39;没有任何其他部分来限制它。

如果有帮助,我可以约束SEARCH文字以排除':',但我真的希望它能识别其他任何内容 - unicode字符,符号,数字,空格等。

我已阅读Lexer to handle lines with line number prefix但在这种情况下,字符串的正文(在前缀之后)受到更多约束。

注意: SEARCH文字可能有一个结构 - 如上面的€53.0010kg(我也要像解析ANTLR4一样)或者它可能只是自由文本 - 例如上面的applemaracujáchilli pepper。但是我试图简化,所以我可以解决首先提取PREFIX的问题。

1 个答案:

答案 0 :(得分:2)

ANTLR在解析之前确实是lexing。词法分析器更喜欢长匹配,SEARCH标记匹配每个PREFIX标记,甚至是附加到其上的任何字符,因此您的完整行匹配SEARCH。

为了防止这种情况:保持词法分析器规则不相符,或者至少令牌不应该相互包含。

parse : prefix? search;

search: (WORD | NUMBER)+;

prefix: NUMBER ':';

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