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 IF I==1 THEN CONTINUE
?I ?I
NEXT NEXT
VAR V
GOSUB @A GOSUB @A
END END
@A @A

View File

@@ -28,6 +28,7 @@ enum NodeType
End, End,
Break, Break,
Continue, Continue,
Var,
DefineVariable, DefineVariable,
DefineArray, DefineArray,
} }
@@ -291,6 +292,23 @@ class Continue : Statement
this.type = NodeType.Continue; 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 class DefineVariable : Statement
{ {
wstring name; wstring name;

View File

@@ -36,6 +36,8 @@ class Lexical
table['<'] = TokenType.Less; table['<'] = TokenType.Less;
table['>'] = TokenType.Greater; table['>'] = TokenType.Greater;
table['!'] = TokenType.LogicalNot; table['!'] = TokenType.LogicalNot;
table['['] = TokenType.LBracket;
table[']'] = TokenType.RBracket;
reserved["OR"] = TokenType.Or; reserved["OR"] = TokenType.Or;
reserved["AND"] = TokenType.And; reserved["AND"] = TokenType.And;
reserved["XOR"] = TokenType.Xor; reserved["XOR"] = TokenType.Xor;
@@ -534,7 +536,7 @@ class Parser
case TokenType.Var: case TokenType.Var:
lex.popFront(); lex.popFront();
node = var(); node = var();
break; return node;
default: default:
syntaxError(); syntaxError();
break; break;
@@ -544,30 +546,59 @@ class Parser
} }
Statement var() Statement var()
{ {
Token token = lex.front(); Var var = new Var();
Token token;
while(true)
{
token = lex.front();
if(token.type != TokenType.Iden) if(token.type != TokenType.Iden)
{ {
//TODO:VAR("A")の実装 //TODO:VAR("A")の実装
syntaxError(); syntaxError();
return null; return null;
} }
wstring name = token.value.stringValue; auto v = defineVar();
lex.popFront(); var.addDefineVar(cast(DefineVariable)v);
token = lex.front();
Expression expr;
//VAR iden=expr
if(token.type == TokenType.Equal)
{
lex.popFront();
expr = expression();
}
DefineVariable node = new DefineVariable(name, expr);
//VARの評価順は順番通り //VARの評価順は順番通り
//VAR iden[=expr], //VAR iden[=expr],
if(token.type == TokenType.Comma) if(token.type == TokenType.Comma)
{ {
lex.popFront(); 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);
return node; return node;
} }
For forStatement() For forStatement()

View File

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