实现原理
解析blockly语法树,使用js管理状态,实际使用lua执行,c/c++函数调用使用lua调用c/c++函数的能力
可以单行执行
已实现if功能
TODO
for循环功能 函数功能
单步执行效果图
直接执行效果图
源代码
//0 暂停 1 单步执行 2 断点
//创建枚举
var AstStatus = {
PAUSE : 0,
STEP :1,
BREAK : 2,
PASS:3
}
class ASTInterpreter {
constructor(ast,funcs) {
//执行状态,暂停 单步执行 断点
this.status = AstStatus.STEP;
//当前节点
this.currentBlock = null;
this.ast = ast;
this.variables = {
};
this.userFuns={
};
this.functions=new Set();
this.initVariables();
this.initFunc(funcs);
this.callback=console.log
}
addEventCallback(func){
this.callback=func
}
initFunc(funcs){
for (let item of funcs) {
this.addFunction(item)
}
}
initVariables() {
let vars = this.ast.variables;
for (let i = 0; i < vars.length; i++) {
const varDef = vars[i];
const varId = varDef.id;
const varName = varDef.name;
this.variables[varId] = varName;
}
}
stepFunc(){
this.executeBlock(this.currentBlock)
}
addFunction(key) {
this.functions.add(key);
}
getBlockType(block){
let type = block.type
if(this.functions.has(type)){
//说明是自定义函数
return 'function'
}else{
return type
}
}
execute() {
if (this.ast && this.ast.blocks && this.ast.