ANTLR 4词法错误:'package'匹配异常问题求助
解决ANTLR 4语法中"mismatched input 'package' expecting 'package'"错误
要解析的目标代码:
package main () { name1; name2; }
当前使用的Crimson语法:
// Parser rules program : packageDefinitionList EOF ; packageDefinitionList : packageDefinition+ ; packageDefinition : Package Identifier parameterList packageBody ; parameterList : parameter* ; parameter : parameterType Identifier ; packageBody : statement* ; parameterType : Integer | Boolean ; statement : Identifier ; // Lexer rules Package : 'package' ; Integer : 'int' ; Boolean : 'bool' ; Identifier : NonDigit+ ; fragment NonDigit : [a-zA-Z_] ;
错误原因及修正方案
出现该错误的核心原因是语法未处理空白字符,且解析规则未匹配目标代码中的括号、大括号、分号等结构,导致词法与语法解析逻辑混乱。具体修正如下:
- 添加空白字符跳过规则
ANTLR不会自动忽略空格、换行等空白字符,这些字符会被视为无效输入干扰解析。在词法规则中添加:
WS : [ \t\r\n]+ -> skip ;
- 修正
parameterList规则
目标代码中参数列表被()包裹,原规则未定义括号逻辑,修改为:
parameterList : '(' parameter* ')' ;
- 修正
packageBody规则
目标代码中包体被{}包裹,原规则未定义大括号逻辑,修改为:
packageBody : '{' statement* '}' ;
- 修正
statement规则
目标代码中语句以分号结尾,原规则未处理分号,修改为:
statement : Identifier ';' ;
修正后的完整语法
// Parser rules program : packageDefinitionList EOF ; packageDefinitionList : packageDefinition+ ; packageDefinition : Package Identifier parameterList packageBody ; parameterList : '(' parameter* ')' ; parameter : parameterType Identifier ; packageBody : '{' statement* '}' ; parameterType : Integer | Boolean ; statement : Identifier ';' ; // Lexer rules Package : 'package' ; Integer : 'int' ; Boolean : 'bool' ; Identifier : NonDigit+ ; fragment NonDigit : [a-zA-Z_] ; WS : [ \t\r\n]+ -> skip ;
将修正后的语法放入ANTLR Lab即可正常解析目标代码。
内容的提问来源于stack exchange,提问作者Atom
相关产品推荐
相关产品推荐

