ANTLR4解析START/END包裹的星号分隔输入的语法问题
原语法存在的核心问题
- 词法语法职责错配:将整个
START到END的结构定义为单个词法符号ENTRY,ANTLR词法分析器会将整段内容识别为一个不可拆分的token,无法单独提取每个字段的内容,同时贪婪匹配逻辑很容易出现越界识别。 - 依赖未定义的规则:代码中使用了
ANY规则但没有明确定义,若配置了全局WS跳过规则,字段内的空格、制表符会被直接丢弃,无法参与解析。 - 规则限制缺失:没有限制字段内容不能包含
*、START、END等保留标记,会出现匹配混乱。 - Fragment规则无法用于内容拆分:
FIELD_SET、Data都被定义为fragment,本身不会生成独立token,无法在语法解析阶段做字段拆分。
调整后的语法实现
grammar StarSeparatedList; // 顶层语法规则 parse: START field (DELIMITER field)* END; // 单字段规则,支持空值 field: FIELD_CONTENT?; // 词法规则定义 START: 'START'; END: 'END'; DELIMITER: '*'; // 字段内容:优先匹配非*、非S/E开头的内容,避免误识别START/END标记,支持空格、制表符等所有非保留字符 FIELD_CONTENT: ( ~[*SE] | 'S' ~[*T] | 'E' ~[*N] ) ~[*]*;
支持的场景验证
- 空字段:两个连续分隔符
**匹配空field规则 - 仅含空格的字段:空格属于规则允许的字符范围,会被完整保留为字段内容
- 带空格的业务内容:字段中间、前后的空格、制表符都会被完整包含在
FIELD_CONTENT中,不会被丢弃 - 混合字符内容:支持字母、数字、特殊符号(除
*、START、END外)的任意组合
内容的提问来源于stack exchange,提问作者spencer741
相关产品推荐
相关产品推荐

