TypeError:无法读取属性'';未定义javascript错误的定义
所以我制作了一个解析器,当我试图在解析器类中调用我的binOp函数时,它会给我这个错误。TypeError:无法读取属性'';未定义javascript错误的定义,javascript,Javascript,所以我制作了一个解析器,当我试图在解析器类中调用我的binOp函数时,它会给我这个错误。 已编辑以显示完整的解析器代码: 我的代码: //index.js 常数fs=要求('fs'); const Lexer=require('./Lexer/Lexer'); const Parser=require(“./Parser”); 班级计划{ 构造函数(args){ this.args=args this.args.shift(); this.args.shift(); } 读取文件(路径){ va
已编辑以显示完整的解析器代码: 我的代码:
//index.js
常数fs=要求('fs');
const Lexer=require('./Lexer/Lexer');
const Parser=require(“./Parser”);
班级计划{
构造函数(args){
this.args=args
this.args.shift();
this.args.shift();
}
读取文件(路径){
var fileValue=fs.readFileSync(路径,{encoding:'utf-8'});
返回文件值;
}
renderCommands(){
开关(此.args[0]){
案例“编译”:
this.launch(this.args[0]、this.readFile(this.args[1]);
打破
}
}
启动(文件、数据){
var lexer=新lexer(文件、数据);
var tokens=lexer.makeTokens();
如果(!(令牌==null)){
//假设代币为['INT:10','PLUS','INT:22']
var parser=新的解析器(令牌);
var ast=parser.parse();
console.log(ast.node)
}
}
}
var程序=新程序(process.argv);
program.renderCommands()
//Parser.js
类解析器{
构造函数(令牌){
this.tokens=令牌
this.tokIdx=-1
这是预付款
}
预付款{
这个.tokIdx++;
if(this.tokIdx
ParseResult只有一个错误和节点属性,
当调用寄存器时,它会查看res是否有错误,
调用success时,它会将节点设置为ParseResult的节点
当调用failure时,它将检查错误,然后设置错误
完整错误消息:
C:\Users\adnit\Desktop\Amethyst\src\parser\Parser.js:66
return this.binOp(this.factor, [TokenTypes.MUL, TokenTypes.DIV]);
^
TypeError: Cannot read property 'binOp' of undefined
at term (C:\Users\MiccDev\Desktop\Amethyst\src\parser\Parser.js:66:21)
at Parser.binOp (C:\Users\MiccDev\Desktop\Amethyst\src\parser\Parser.js:81:33)
at Parser.expr (C:\Users\MiccDev\Desktop\Amethyst\src\parser\Parser.js:70:21)
at Parser.parse (C:\Users\MiccDev\Desktop\Amethyst\src\parser\Parser.js:22:24)
at Program.launch (C:\Users\MiccDev\Desktop\Amethyst\src\index.js:31:30) at Program.renderCommands (C:\Users\MiccDev\Desktop\Amethyst\src\index.js:20:22)
at Object.<anonymous> (C:\Users\MiccDev\Desktop\Amethyst\src\index.js:39:9)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
C:\Users\adnit\Desktop\Amethyst\src\parser\parser.js:66
返回this.binOp(this.factor,[TokenTypes.MUL,TokenTypes.DIV]);
^
TypeError:无法读取未定义的属性“binOp”
术语(C:\Users\MiccDev\Desktop\Amethyst\src\parser\parser.js:66:21)
在Parser.binOp(C:\Users\MiccDev\Desktop\Amethyst\src\Parser\Parser.js:81:33)
在Parser.expr(C:\Users\MiccDev\Desktop\Amethyst\src\Parser\Parser.js:70:21)
在Parser.parse(C:\Users\MiccDev\Desktop\Amethyst\src\Parser\Parser.js:22:24)
在Program.renderCommands(C:\Users\MiccDev\Desktop\Amethyst\src\index.js:31:30)在Program.renderCommands(C:\Users\MiccDev\Desktop\Amethyst\src\index.js:20:22)启动时
at对象。(C:\Users\MiccDev\Desktop\Amethyst\src\index.js:39:9)
at模块编译(内部/modules/cjs/loader.js:1063:30)
在Object.Module._extensions..js(internal/modules/cjs/loader.js:1092:10)
在Module.load(内部/modules/cjs/loader.js:928:32)
检查类代码时,类方法binOp(func,ops)
的参数func
可能是通过其他类方法term()
和expr()
的类方法。为了使用正确的实例上下文运行func()
,请更新binOp(func,ops)
方法,如下所示:
binOp(函数,操作){
var res=new ParseResult();
//var left=res.register(func());
var left=res.register(函数应用(this));
如果(res.error)返回res
while(操作包括(此currentTok.类型)){
var opTok=此.currentTok;
res.register(this.advance())
//var res=res.register(func());
var res=res.register(函数apply(this));
如果(res.error)返回res;
左=新的双节点(左、光电、右);
}
返回res.success(左);
}
您能显示完整的错误消息吗?消息中现在有错误。请尝试将binOp移到“term”之上。@heartleth否,这不起作用。看来调用term()方法时没有任何提示