如何用ANTLR编写匹配任意字符直到FOOTER关键词的解析规则?
问题原因
你现有代码的核心错误有两点:
- 词法规则中
~[FOOTER \r\n]是字符集匹配逻辑,仅代表匹配单个不是F/O/O/T/E/R/空格/换行的字符,完全没有排除FOOTER关键词的效果 .*是贪心匹配逻辑,会直接吞掉所有输入到文件末尾,优先级高于你定义的FOOTER规则,导致FOOTER关键词永远不会被词法器识别
正确实现方案
推荐用ANTLR4的词法模式实现需求,逻辑清晰且边界控制准确,完整语法规则如下:
grammar CustomTextParser; // 解析器规则 parse: headerPart contentPart footerPart restPart EOF; headerPart: HEADER ':' .*? LINE_BREAK; contentPart: CONTENT LINE_BREAK CONTENT_TEXT; footerPart: FOOTER LINE_BREAK; restPart: .*? END; // 基础词法规则(默认模式) HEADER: 'HEADER'; CONTENT: 'CONTENT' -> pushMode(CONTENT_SCAN_MODE); FOOTER: 'FOOTER'; END: 'END'; LINE_BREAK: '\r'? '\n'; PLAIN_SPACE: [ \t]+ -> skip; // 若需要保留关键词外的空格可删除该行 // 内容扫描模式:仅匹配FOOTER之前的所有字符 mode CONTENT_SCAN_MODE; MODE_FOOTER: 'FOOTER' -> type(FOOTER), popMode; CONTENT_TEXT: .+?;
关键逻辑说明
- 匹配到
CONTENT关键词后自动切换到内容扫描模式,隔离其他词法规则的干扰 - 内容模式下
MODE_FOOTER规则优先级最高,命中后自动切回默认模式,且将token类型标记为FOOTER供解析器使用,FOOTER本身不会被计入内容 CONTENT_TEXT用非贪心匹配,自动包含所有数字、空格、特殊字符、换行等任意内容,直到碰到FOOTER关键词为止
内容的提问来源于stack exchange,提问作者user3401335
相关产品推荐
相关产品推荐

