複数行IFに対応
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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_;
|
||||||
|
|||||||
Reference in New Issue
Block a user