ANTLR语法与测试用例不匹配引发报错的问题排查请求
ANTLR语法报错排查与修复
问题根源分析
- STR令牌规则限制过严:原规则
STR: [a-zA-Z.]*;仅允许字母和点,无法匹配测试用例中带空格的字符串"assembler quiz",导致多处匹配失败。 - 未定义DOC令牌:expr规则中引用了
DOC,但令牌部分未定义该规则,引发语法逻辑错误。 - prog规则未处理EOF:缺少文件结束符匹配,导致出现
missing '(' at '<EOF>'错误。 - decl规则中字符串匹配冗余:原规则手动拼接
'"' STR '"',但STR本身不含引号,导致引号匹配逻辑混乱。
修正后的语法代码
grammar g; prog: (decl | expr)+ EOF; decl: VAR '=' STR | '%doc' '(' VAR '=' STR ')' | '%quiz' '(' VAR '=' STR ')' .*? '%quiz' ; expr: expr '*' expr | expr '+' expr | expr '-' expr | expr '=' expr | STR ; // 令牌定义 VAR: [a-zA-Z0-9_]+ ; STR: '"' (~["\r\n])* '"'; // 匹配双引号包裹的任意内容(不含引号与换行) WS: [ \t\n]+ -> skip;
关键修正说明
- STR令牌优化:改为匹配双引号包裹的任意字符(除引号和换行),支持带空格、特殊字符的字符串内容。
- 移除冗余引号匹配:decl规则中直接使用
STR(已包含引号),避免重复匹配引号导致的逻辑错误。 - 添加EOF匹配:prog规则末尾加入
EOF,确保语法能正确识别文件结束,消除EOF相关报错。 - 删除未定义令牌:移除expr规则中的
DOC引用,解决未定义令牌的语法问题。
内容的提问来源于stack exchange,提问作者Omkar Patil
相关产品推荐
相关产品推荐

