ANTLR4场景下ES5.1给类赋值匿名函数报常量错误如何解决
问题原因
- ANTLR 4.9.2 版本默认生成的JavaScript解析器代码中,导出的
Python3Lexer类是通过const关键字声明的常量,直接对常量变量重新赋值就会触发TypeError: Assignment to constant variable报错。 - 你写的这段代码的作用是对原生生成的Lexer类做扩展:保留原构造逻辑的基础上,给所有新实例自动执行
reset()初始化操作,属于装饰器模式的一种实现。
解决方案
方案1:ES6+环境推荐写法(类继承)
不要直接修改原常量,通过继承扩展自定义Lexer即可,后续所有用到Lexer的地方改用你自定义的类:
// 导入时可以给原Lexer重命名避免命名冲突 import { Python3Lexer as OriginalPython3Lexer } from './你生成的解析器文件路径'; class Python3Lexer extends OriginalPython3Lexer { constructor(...args) { // 执行原类的构造逻辑 super(...args); // 额外执行初始化 this.reset(); } }
方案2:ES5环境兼容写法
如果你的运行环境仅支持ES5语法,同样不要修改原常量,自定义新的构造函数并继承原Lexer的原型链:
var oldLexer = Python3Lexer; // 自定义构造函数 function CustomPython3Lexer() { oldLexer.apply(this, arguments); this.reset.call(this); } // 继承原型链,避免原类的方法丢失 CustomPython3Lexer.prototype = Object.create(oldLexer.prototype); CustomPython3Lexer.prototype.constructor = CustomPython3Lexer; // 后续所有用到Lexer的位置改用CustomPython3Lexer即可
额外说明
如果需要生成适配ES5的解析器代码,运行ANTLR生成命令时增加-Dantlr-js-es5=true参数,生成的代码中导出的类会用var声明,不会有常量赋值限制,但依然不建议直接修改原类,继承扩展的方式更易维护。
内容的提问来源于stack exchange,提问作者Daltimus
相关产品推荐
相关产品推荐

