You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR语法匹配报错:extraneous input '.' expecting '.' 求助

解决ANTLR语法匹配.*时的报错问题

遇到这种矛盾的报错确实头疼——明明输入的是.,却提示“期望.但输入多余的.”,同时还说缺少*,这大概率是你的Lexer规则定义出了隐性问题,导致ANTLR没法正确识别输入的Token。

问题根源

你的WHITESPACE规则里直接在字符串字面量中插入了换行、回车和制表符,而不是用ANTLR认可的转义序列(比如\n代表换行,\t代表制表符)。这种写法会让ANTLR解析语法文件时出现异常,生成的Lexer无法正确识别COMP(.)和KLEENE(*)这两个Token,进而让Parser抛出看似矛盾的错误。

修正后的语法

把WHITESPACE规则里的特殊字符换成正确的转义序列,同时建议在start规则末尾加上EOF,确保Parser能验证整个输入的完整性:

grammar regex;
@parser::header { package antlr; }
@lexer::header { package antlr; }

// 使用标准转义序列表示空白字符
WHITESPACE : (' ' | '\t' | '\n' | '\r') -> channel(HIDDEN);
COMP : '.';
KLEENE : '*';

// 添加EOF确保输入完全匹配规则,避免隐性问题
start : COMP KLEENE EOF;

为什么这样改?

  1. 转义序列的正确性:ANTLR语法文件中,字符串字面量里的控制字符必须用转义形式(\t、\n、\r)表示,直接插入实际的换行/回车会破坏语法文件结构,导致Lexer生成异常。
  2. 添加EOF:虽然你的输入.*本身没有多余字符,但加上EOF后,Parser会强制验证整个输入都被匹配,避免后续输入出现多余字符时难以排查的错误。

用修正后的语法重新生成Parser和Lexer,再测试输入.*,应该就能正常匹配了。

内容的提问来源于stack exchange,提问作者lauw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:36:56