1
0

複数行IFに対応

This commit is contained in:
otya128
2015-06-06 17:44:17 +09:00
parent 828631c70e
commit 46b7b2ede3
2 changed files with 39 additions and 6 deletions

View File

@@ -12,6 +12,11 @@ int main(string[] argv)
"@A\nA=1+2+3+4\nPRINT 1+1,2+3;10-5,A:A=A*2:PRINT A
IF 1 THEN PRINT 2
IF 0 THEN PRINT 4 ELSE PRINT 5
IF 0 THEN
PRINT 111
ELSE
PRINT 222
ENDIF
");
auto vm = parser.compile();
vm.run();

View File

@@ -307,7 +307,7 @@ class Parser
}
return statements;
}
Statements ifstatements()
Statements ifStatements()
{
auto statements = new Statements();
while(!lex.empty())
@@ -324,6 +324,22 @@ class Parser
}
return statements;
}
Statements multilineIfStatements()
{
auto statements = new Statements();
while(!lex.empty())
{
auto type = lex.front().type;
if(type == TokenType.Else) break;
if(type == TokenType.Endif) break;
auto statement = statement();
if(statement != Statement.NOP)
{
statements.addStatement(statement);
}
}
return statements;
}
void syntaxError()
{
stderr.writeln("Syntax error (", lex.getLine(), ')', " Mysterious ", lex.front().type);
@@ -397,13 +413,18 @@ class Parser
lex.popFront();
token = lex.front();
}
Statements then;
bool multiline = false;
if(token.type == TokenType.NewLine)
{
writeln("NotImpl: Multi line if");
syntaxError();
return null;
multiline = true;
lex.popFront();
then = multilineIfStatements();
}
else
{
then = ifStatements();
}
auto then = ifstatements();
token = lex.front();
lex.popFront();
Statements else_;
@@ -414,7 +435,14 @@ class Parser
//3.1現在だとエラー
syntaxError();
}
else_ = ifstatements();
if(multiline)
{
else_ = multilineIfStatements();
}
else
{
else_ = ifStatements();
}
}
auto if_ = new If(expr, then, else_);
return if_;