diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index c780e0d..00e4e07 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -43,6 +43,7 @@ enum CodeType Goto, Gosub, Print, + PopG, } abstract class Code { @@ -108,6 +109,19 @@ class PushG : Code vm.push(vm.global[var]); } } +class PopG : Code +{ + int var; + this(int var) + { + this.type = CodeType.PopG; + this.var = var; + } + override void execute(VM vm) + { + vm.pop(vm.global[var]); + } +} class Operate : Code { TokenType operator; diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 1bcd5cd..0642587 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -24,10 +24,38 @@ class Compiler { code ~= new PushG(ind); } + void genCodePopGlobal(int ind) + { + code ~= new PopG(ind); + } void genCodeOP(TokenType op) { code ~= new Operate(op); } + int defineGlobalVarIndex(wstring name) + { + int global = this.global.get(name, 0); + if(global == 0) + { + this.global[name] = ++globalIndex = global; + } + else + { + //error:二重定義 + } + return global; + } + int getGlobalVarIndex(wstring name) + { + int global = this.global.get(name, 0); + if(global == 0) + { + //local変数をあたる + //それでもだめならOPTION STRICTならエラー + this.global[name] = ++globalIndex = global; + } + return global; + } void compileExpression(Expression exp) { @@ -46,14 +74,7 @@ class Compiler break; case NodeType.Variable: auto var = cast(Variable)exp; - int global = this.global.get(var.name, 0); - if(global == 0) - { - //local変数をあたる - //それでもだめならOPTION STRICTならエラー - this.global[var.name] = ++globalIndex = global; - } - genCodePushGlobal(global); + genCodePushGlobal(getGlobalVarIndex(var.name)); break; case NodeType.CallFunction: { @@ -100,6 +121,13 @@ class Compiler code ~= new PrintCode(print.args.length); } break; + case NodeType.Assign: + { + auto assign = cast(Assign)i; + compileExpression(assign.expression); + genCodePopGlobal(getGlobalVarIndex(assign.name)); + } + break; default: stderr.writeln("Compile:NotImpl ", i.type); } diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index eb91f41..4a7e94f 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -8,7 +8,7 @@ int main(string[] argv) writeln(parser.calc()); } - auto parser = new Parser("A=1\nPRINT 1+1,2+3;10-5,A"); + auto parser = new Parser("A=1+2+3+4\nPRINT 1+1,2+3;10-5,A"); auto vm = parser.compile(); vm.run(); readln(); diff --git a/SMILEBASIC/node.d b/SMILEBASIC/node.d index 77d267b..79dbc94 100644 --- a/SMILEBASIC/node.d +++ b/SMILEBASIC/node.d @@ -163,11 +163,11 @@ class Print : Statement class Assign : Statement { wstring name; - Expression expr; + Expression expression; this(wstring name, Expression expr) { this.type = NodeType.Assign; this.name = name; - this.expr = expr; + this.expression = expr; } }