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 "@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 1 THEN PRINT 2
IF 0 THEN PRINT 4 ELSE PRINT 5 IF 0 THEN PRINT 4 ELSE PRINT 5
IF 0 THEN
PRINT 111
ELSE
PRINT 222
ENDIF
"); ");
auto vm = parser.compile(); auto vm = parser.compile();
vm.run(); vm.run();

View File

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