変数宣言実装中
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ enum TokenType
|
|||||||
Break,
|
Break,
|
||||||
Continue,
|
Continue,
|
||||||
Var,
|
Var,
|
||||||
|
LBracket,//[
|
||||||
|
RBracket,//]
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Token
|
struct Token
|
||||||
|
|||||||
Reference in New Issue
Block a user