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判断方式:如果导入问题仍存在,可通过节点的内置方法或构造函数名判断:
- 利用ANTLR节点自带的
isErrorNode方法(大部分生成的节点实例都会实现):if (node.isErrorNode?.()) { return true; } - 检查构造函数名称:
if (node.constructor.name === 'ErrorNode') { return true; }
- 利用ANTLR节点自带的
- 排查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
相关产品推荐
相关产品推荐

