From c050d4e066d55fd2d9655c1fd22c9cde21784aa4 Mon Sep 17 00:00:00 2001 From: otya128 Date: Thu, 11 Jun 2015 19:29:34 +0900 Subject: [PATCH] =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=AE=A3=E8=A8=80=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/main.d | 1 + SMILEBASIC/node.d | 18 +++++++++++++++ SMILEBASIC/parser.d | 55 +++++++++++++++++++++++++++++++++++---------- SMILEBASIC/token.d | 2 ++ 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index f3c99b8..8b39052 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -53,6 +53,7 @@ FOR I=0 TO 10 IF I==1 THEN CONTINUE ?I NEXT +VAR V GOSUB @A END @A diff --git a/SMILEBASIC/node.d b/SMILEBASIC/node.d index 57840e1..9ebb255 100644 --- a/SMILEBASIC/node.d +++ b/SMILEBASIC/node.d @@ -28,6 +28,7 @@ enum NodeType End, Break, Continue, + Var, DefineVariable, DefineArray, } @@ -291,6 +292,23 @@ class Continue : Statement this.type = NodeType.Continue; } } +class Var : Statement +{ + Statement[] define; + this() + { + this.type = NodeType.Var; + this.define = new Statement[0]; + } + void addDefineVar(DefineVariable dv) + { + this.define ~= dv; + } + void addDefineArray(DefineArray da) + { + this.define ~= da; + } +} class DefineVariable : Statement { wstring name; diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 0ece249..dd7c4e7 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -36,6 +36,8 @@ class Lexical table['<'] = TokenType.Less; table['>'] = TokenType.Greater; table['!'] = TokenType.LogicalNot; + table['['] = TokenType.LBracket; + table[']'] = TokenType.RBracket; reserved["OR"] = TokenType.Or; reserved["AND"] = TokenType.And; reserved["XOR"] = TokenType.Xor; @@ -534,7 +536,7 @@ class Parser case TokenType.Var: lex.popFront(); node = var(); - break; + return node; default: syntaxError(); break; @@ -544,30 +546,59 @@ class Parser } Statement var() { - Token token = lex.front(); - if(token.type != TokenType.Iden) + Var var = new Var(); + Token token; + while(true) { - //TODO:VAR("A")の実装 - syntaxError(); - return null; + token = lex.front(); + if(token.type != TokenType.Iden) + { + //TODO:VAR("A")の実装 + syntaxError(); + return null; + } + auto v = defineVar(); + var.addDefineVar(cast(DefineVariable)v); + //VARの評価順は順番通り + //VAR iden[=expr], + if(token.type == TokenType.Comma) + { + lex.popFront(); + writeln("NOTIMPL"); + syntaxError(); + } + else + { + break; + } } + return var; + } + Statement defineVar() + { + Token token = lex.front(); wstring name = token.value.stringValue; lex.popFront(); token = lex.front(); Expression expr; + //VAR iden[ + if(token.type == TokenType.LBracket) + { + lex.popFront(); + while(true) + { + expr = expression(); + token = lex.front(); + } + } //VAR iden=expr if(token.type == TokenType.Equal) { lex.popFront(); expr = expression(); + token = lex.front(); } DefineVariable node = new DefineVariable(name, expr); - //VARの評価順は順番通り - //VAR iden[=expr], - if(token.type == TokenType.Comma) - { - lex.popFront(); - } return node; } For forStatement() diff --git a/SMILEBASIC/token.d b/SMILEBASIC/token.d index 1c10c52..2385c39 100644 --- a/SMILEBASIC/token.d +++ b/SMILEBASIC/token.d @@ -50,6 +50,8 @@ enum TokenType Break, Continue, Var, + LBracket,//[ + RBracket,//] } struct Token