diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index dae90cb..7cb7939 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -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(); diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 2e5307f..77719d5 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -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_;