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

Antlr4 TypeScript环境下ErrorNode未定义问题求助

问题

我编写了一个函数,用于检查某个节点是否存在ErrorNode作为其直接或间接子节点,但ErrorNode始终显示为undefined,执行代码时出现错误:Right-hand side of 'instanceof' is not an object。

函数代码:

function hasErrorNode(node: ParserRuleContext) {
    console.log(ErrorNode) // undefined
    if (node instanceof ErrorNode) { // 报错位置
        return true
    }
    for (const child of node.children!) {
        if (hasErrorNode(child as ParserRuleContext)) {
            return true
        }
    }
    return false
}

导入语句:

import { CommonTokenStream, ParserRuleContext, TerminalNode, ErrorNode, Interval, CharStream } from 'antlr4';

注:代码通过webpack编译为cjs格式

已用madge工具确认不存在循环依赖,推测问题出在ErrorNode未正确导入/定义。

解决思路
  • 调整ErrorNode的导入路径:ANTLR4的核心包中,ErrorNode实际在antlr4/tree模块下,而非根模块。修改导入语句:
    import { ErrorNode } from 'antlr4/tree';
    // 其他保持原导入不变
    import { CommonTokenStream, ParserRuleContext, TerminalNode, Interval, CharStream } from 'antlr4';
    
  • 替换instanceof判断方式:如果导入问题仍存在,可通过节点的内置方法或构造函数名判断:
    1. 利用ANTLR节点自带的isErrorNode方法(大部分生成的节点实例都会实现):
      if (node.isErrorNode?.()) {
          return true;
      }
      
    2. 检查构造函数名称:
      if (node.constructor.name === 'ErrorNode') {
          return true;
      }
      
  • 排查webpack编译配置:CJS编译模式下,webpack的tree-shaking可能误删未被直接引用的导出。可以在webpack配置中调整optimization.usedExports为false,或者将antlr4设为外部依赖:
    // webpack.config.js
    module.exports = {
        // ...其他配置
        externals: {
            antlr4: 'commonjs antlr4'
        }
    };
    
  • 确认ErrorNode的实际来源:如果是自定义语法生成的ErrorNode,它可能存在于你自己生成的语法文件中(比如YourGrammarParser.js),需要从该文件导入,而非antlr4核心包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:07:07