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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:36:59