JavaCC中ParseException与TokenManagerError的区别及示例说明
JavaCC中ParseException与TokenManagerError的核心区别
核心差异梳理
- 触发阶段不同:TokenManagerError发生在词法分析阶段——也就是将输入字符流拆分为可识别token(如标识符、关键字、运算符)的过程;ParseException发生在语法分析阶段——词法分析完成后,验证token序列是否符合预定义文法结构的环节。
- 错误根源不同:TokenManagerError通常因输入包含文法未定义的非法字符/字符序列导致;ParseException则是输入的token均合法,但序列结构不符合文法规则(如缺少必要token、括号不匹配等)。
- 错误特征不同:TokenManagerError会明确提示“Lexical error”及具体非法字符;ParseException会指出当前遇到的token,同时列出预期的token类型。
代码示例与错误场景演示
示例文法文件(Calculator.jj)
options { STATIC = false; } PARSER_BEGIN(Calculator) public class Calculator { public static void main(String[] args) throws ParseException, TokenManagerError { Calculator parser = new Calculator(System.in); parser.start(); } } PARSER_END(Calculator) SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : { <INTEGER: (["0"-"9"])+> | <PLUS: "+"> | <MINUS: "-"> } void start() : {} { expression() <EOF> } void expression() : {} { <INTEGER> ( <PLUS> | <MINUS> ) <INTEGER> }
场景1:触发TokenManagerError
输入内容:123 + $45
这里的$是文法中未定义的字符,词法分析器无法将其识别为合法token,抛出错误:
TokenManagerError: Lexical error at line 1, column 5. Encountered: "$" (36), after : ""
场景2:触发ParseException
输入内容:123 +
所有输入字符都能被词法分析器拆分为合法token(<INTEGER>、<PLUS>),但序列结构不符合expression()的文法规则(要求INTEGER + INTEGER),抛出错误:
ParseException: Encountered "<EOF>" at line 1, column 5. Was expecting one of: <INTEGER> ...
内容的提问来源于stack exchange,提问作者ViiP
相关产品推荐
相关产品推荐

