1
0

変数宣言実装中

This commit is contained in:
otya128
2015-06-11 19:29:34 +09:00
parent 7c383dff1a
commit c050d4e066
4 changed files with 64 additions and 12 deletions

View File

@@ -53,6 +53,7 @@ FOR I=0 TO 10
IF I==1 THEN CONTINUE
?I
NEXT
VAR V
GOSUB @A
END
@A

View File

@@ -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;

View File

@@ -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()

View File

@@ -50,6 +50,8 @@ enum TokenType
Break,
Continue,
Var,
LBracket,//[
RBracket,//]
}
struct Token