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;
为什么这样改?
- 转义序列的正确性:ANTLR语法文件中,字符串字面量里的控制字符必须用转义形式(
\t、\n、\r)表示,直接插入实际的换行/回车会破坏语法文件结构,导致Lexer生成异常。 - 添加EOF:虽然你的输入
.*本身没有多余字符,但加上EOF后,Parser会强制验证整个输入都被匹配,避免后续输入出现多余字符时难以排查的错误。
用修正后的语法重新生成Parser和Lexer,再测试输入.*,应该就能正常匹配了。
内容的提问来源于stack exchange,提问作者lauw
相关产品推荐
相关产品推荐

