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

标签 antlr antlr4

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

grammar MyGrammar;

parse : PREFIX? SEARCH;

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

SEARCH
  : .+ 
  ;

例如有效的输入字符串包括:
0: maracujá
apple
3:€53.60
1: 10kg
2:chilli pepper

但是SEARCH rule 总是匹配整个字符串——无论它是否有前缀。

我理解这是因为 ANTLR4 词法分析器优先考虑匹配最长字符串的规则。因此SEARCH规则匹配所有输入,不给出 PREFIX统治一个机会。

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

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

我已阅读 Lexer to handle lines with line number prefix但在这种情况下,字符串的主体(在前缀之后)明显受到更多限制。

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

最佳答案

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

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

parse : prefix? search;

search: (WORD | NUMBER)+;

prefix: NUMBER ':';

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

关于antlr - ANTLR 解析器/词法分析器中的可选前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29753181/

相关文章:

c++ - 从 antlrcpp::Any 中检索基类

python - 访问用括号定义的属性

java - JavaCC 与 ANTLR 的优势是什么

java - 如何诊断我的 ANTLR4 语法中的歧义?

java - 使语法接受不同范围的数值的问题

parsing - 对多行 ANTLR 重复相同的规则

java - 返回不同类型的对象时,将访问者或监听器与 ANTLR4 一起使用

java - 在 Antlr 中使用访问者编辑 AST

mysql - 在 ANTLR 中编写 SQL 解析器有哪些挑战?

java - 如何转义 StringTemplate 模板?