ANTLR 中的可选前缀 parser/lexer
Optional Prefix in ANTLR parser/lexer
我正在尝试使用 ANTLR4 来解析由如下语法描述的输入字符串:
grammar MyGrammar;
parse : PREFIX? SEARCH;
PREFIX
: [0-9]+ ':'
;
SEARCH
: .+
;
例如有效的输入字符串包括:
0: maracujá
apple
3:€53.60
1: 10kg
2:chilli pepper
但是 SEARCH
规则总是匹配整个字符串 - 无论它是否有前缀。
我理解这是因为 ANTLR4 词法分析器优先考虑匹配最长字符串的规则。因此 SEARCH
规则匹配所有输入,而不给 PREFIX
规则机会。
非贪婪版本(即 SEARCH : .+? ;
)有同样的问题,因为(据我所知)它只是规则中的非贪婪 - 而 SEARCH
规则没有任何其他部分来约束它。
如果有帮助,我可以限制 SEARCH
文本以排除 ':'
但我真的更希望它能识别其他任何东西 - unicode 字符、符号、数字、space 等。
我读过 Lexer to handle lines with line number prefix 但在那种情况下,字符串的主体(在前缀之后)明显更受限制。
注意: SEARCH
文本可能有一个结构 - 就像上面的 €53.00
和 10kg
(我也喜欢ANTLR4 来解析)或者它可能只是自由文本 - 如上面的 apple
、maracujá
和 chilli pepper
。但我已经尝试简化,所以我可以先解决提取 PREFIX
的问题。
ANTLR 在解析之前进行词法分析。词法分析器更喜欢长匹配,并且 SEARCH 标记匹配每个 PREFIX 标记甚至附加到它的任何字符,因此您的完整行由 SEARCH 匹配。
为了防止这种情况:保持词法分析器规则分离,或者至少标记不应该相互包含。
parse : prefix? search;
search: (WORD | NUMBER)+;
prefix: NUMBER ':';
NUMBER : [0-9]+;
WORD : (~[0-9:])+;
我正在尝试使用 ANTLR4 来解析由如下语法描述的输入字符串:
grammar MyGrammar;
parse : PREFIX? SEARCH;
PREFIX
: [0-9]+ ':'
;
SEARCH
: .+
;
例如有效的输入字符串包括:
0: maracujá
apple
3:€53.60
1: 10kg
2:chilli pepper
但是 SEARCH
规则总是匹配整个字符串 - 无论它是否有前缀。
我理解这是因为 ANTLR4 词法分析器优先考虑匹配最长字符串的规则。因此 SEARCH
规则匹配所有输入,而不给 PREFIX
规则机会。
非贪婪版本(即 SEARCH : .+? ;
)有同样的问题,因为(据我所知)它只是规则中的非贪婪 - 而 SEARCH
规则没有任何其他部分来约束它。
如果有帮助,我可以限制 SEARCH
文本以排除 ':'
但我真的更希望它能识别其他任何东西 - unicode 字符、符号、数字、space 等。
我读过 Lexer to handle lines with line number prefix 但在那种情况下,字符串的主体(在前缀之后)明显更受限制。
注意: SEARCH
文本可能有一个结构 - 就像上面的 €53.00
和 10kg
(我也喜欢ANTLR4 来解析)或者它可能只是自由文本 - 如上面的 apple
、maracujá
和 chilli pepper
。但我已经尝试简化,所以我可以先解决提取 PREFIX
的问题。
ANTLR 在解析之前进行词法分析。词法分析器更喜欢长匹配,并且 SEARCH 标记匹配每个 PREFIX 标记甚至附加到它的任何字符,因此您的完整行由 SEARCH 匹配。
为了防止这种情况:保持词法分析器规则分离,或者至少标记不应该相互包含。
parse : prefix? search;
search: (WORD | NUMBER)+;
prefix: NUMBER ':';
NUMBER : [0-9]+;
WORD : (~[0-9:])+;