# HG changeset patch # User Anders Halager # Date 1208511960 -7200 # Node ID 2c5a8f4c254a866fc58dd8cb54530a40f4fdc8f0 # Parent c09464468e1d6d3d69f179249a60fbdd42f7e4ce Added very simple if support. * No else * Still no logical operators, always tests != 0 diff -r c09464468e1d -r 2c5a8f4c254a ast/Stmt.d --- a/ast/Stmt.d Fri Apr 18 11:07:46 2008 +0200 +++ b/ast/Stmt.d Fri Apr 18 11:46:00 2008 +0200 @@ -11,6 +11,7 @@ Decl, Exp, Return, + If, } class Stmt @@ -55,3 +56,17 @@ public Exp exp; } + +class IfStmt : Stmt +{ + this(Exp cond, Stmt[] then) + { + super(StmtType.If); + this.cond = cond; + this.then = then; + } + + Exp cond; + Stmt[] then; +} + diff -r c09464468e1d -r 2c5a8f4c254a gen/LLVMGen.d --- a/gen/LLVMGen.d Fri Apr 18 11:07:46 2008 +0200 +++ b/gen/LLVMGen.d Fri Apr 18 11:46:00 2008 +0200 @@ -23,6 +23,7 @@ "byte" : "i8", "short" : "i16", "long" : "i64", + "bool" : "i8", "float" : "float", "double" : "double", "void" : "void", @@ -310,7 +311,38 @@ auto expStmt = cast(ExpStmt)stmt; genExpression(expStmt.exp); break; + case StmtType.If: + auto ifStmt = cast(IfStmt)stmt; + Ref val = genExpression(ifStmt.cond); + auto cond = table.find("%.cond"); + printBeginLine(cond); + print(" = icmp ne "); + print(val); + printEndLine(", 0"); + auto then_branch = table.find("then"); + auto else_branch = table.find("else"); + printBeginLine("br i1 "); + print(cond); + print(", label %"); + print(then_branch); + print(", label %"); + printEndLine(else_branch); + + printBeginLine(then_branch); + printEndLine(":"); + + indent(); + foreach (s; ifStmt.then) + genStmt(s); + printBeginLine("br label %"); + printEndLine(else_branch); + dedent(); + + printBeginLine(else_branch); + printEndLine(":"); + + break; } } diff -r c09464468e1d -r 2c5a8f4c254a lexer/Keyword.d --- a/lexer/Keyword.d Fri Apr 18 11:07:46 2008 +0200 +++ b/lexer/Keyword.d Fri Apr 18 11:46:00 2008 +0200 @@ -20,6 +20,7 @@ "float" : Tok.Float, "double" : Tok.Double, + "if" : Tok.If, "return" : Tok.Return ]; } diff -r c09464468e1d -r 2c5a8f4c254a lexer/Token.d --- a/lexer/Token.d Fri Apr 18 11:07:46 2008 +0200 +++ b/lexer/Token.d Fri Apr 18 11:46:00 2008 +0200 @@ -67,6 +67,9 @@ Float, Double, + Bool, + + If, Return, } @@ -83,6 +86,7 @@ Tok.Short:"Short", Tok.Int:"Int", Tok.Long:"Long", + Tok.Bool:"Bool", Tok.OpenParentheses:"OpenParentheses", Tok.CloseParentheses:"CloseParentheses", Tok.OpenBrace:"OpenBrace", @@ -92,7 +96,9 @@ Tok.Sub:"Sub", Tok.Mul:"Mul", Tok.Div:"Div", - Tok.Integer:"Interger", + Tok.Integer:"Integer", + Tok.If:"If", + Tok.Return:"Return", Tok.Seperator:"Seperator" ]; } diff -r c09464468e1d -r 2c5a8f4c254a parser/Parser.d --- a/parser/Parser.d Fri Apr 18 11:07:46 2008 +0200 +++ b/parser/Parser.d Fri Apr 18 11:46:00 2008 +0200 @@ -92,6 +92,26 @@ ret.exp = parseExpression(); require(Tok.Seperator); return ret; + + case Tok.If: + lexer.next; + require(Tok.OpenParentheses); + auto condition = parseExpression(); + require(Tok.CloseParentheses); + + Stmt[] stmts; + if (lexer.peek.type == Tok.OpenBrace) + { + lexer.next; + while(lexer.peek.type != Tok.CloseBrace) + stmts ~= parseStatement(); + lexer.next; + } + else + stmts ~= parseStatement(); + + return new IfStmt(condition, stmts); + case Tok.Identifier: Token n = lexer.peek(1); switch(n.type) diff -r c09464468e1d -r 2c5a8f4c254a sema/Visitor.d --- a/sema/Visitor.d Fri Apr 18 11:07:46 2008 +0200 +++ b/sema/Visitor.d Fri Apr 18 11:46:00 2008 +0200 @@ -45,6 +45,8 @@ return visitDeclStmt(cast(DeclStmt)stmt); case StmtType.Exp: return visitExpStmt(cast(ExpStmt)stmt); + case StmtType.If: + return visitIfStmt(cast(IfStmt)stmt); default: throw new Exception("Unknown statement type"); } @@ -119,6 +121,17 @@ return StmtT.init; } + StmtT visitIfStmt(IfStmt s) + { + visitExp(s.cond); + foreach (stmt; s.then) + visitStmt(stmt); + static if (is(StmtT == void)) + return; + else + return StmtT.init; + } + StmtT visitExpStmt(ExpStmt s) { visitExp(s.exp); diff -r c09464468e1d -r 2c5a8f4c254a test.td --- a/test.td Fri Apr 18 11:07:46 2008 +0200 +++ b/test.td Fri Apr 18 11:46:00 2008 +0200 @@ -5,14 +5,15 @@ { long var1 = 1; short var2 = 2; - nice(var1, var2); - return var2; + return nice(var1, var2); } int nice(long s, short t) { byte x = 5 + t; - t = 5 + 1 * 5 * s + t; + if (x) + if (s) + t = 5 + 1 * 5 * s + t; return 2 * (t + -1) - x; } diff -r c09464468e1d -r 2c5a8f4c254a tests/code/basic_1.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/code/basic_1.d Fri Apr 18 11:46:00 2008 +0200 @@ -0,0 +1,19 @@ + +int x = 4; + +int main() +{ + long var1 = 1; + short var2 = 2; + nice(var1, var2); + return var2; +} + +int nice(long s, short t) +{ + byte x = 5 + t; + t = 5 + 1 * 5 * s + t; + return 2 * (t + -1) - x; +} + + diff -r c09464468e1d -r 2c5a8f4c254a tests/code/if_1.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/code/if_1.d Fri Apr 18 11:46:00 2008 +0200 @@ -0,0 +1,19 @@ + +int x = 4; + +int main() +{ + long var1 = 1; + short var2 = 2; + return nice(var1, var2); +} + +int nice(long s, short t) +{ + byte x = 5 + t; + if (x) + t = 5 + 1 * 5 * s + t; + return 2 * (t + -1) - x; +} + + diff -r c09464468e1d -r 2c5a8f4c254a tests/code/if_2.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/code/if_2.d Fri Apr 18 11:46:00 2008 +0200 @@ -0,0 +1,20 @@ + +int x = 4; + +int main() +{ + long var1 = 1; + short var2 = 2; + return nice(var1, var2); +} + +int nice(long s, short t) +{ + byte x = 5 + t; + if (x) + if (s) + t = 5 + 1 * 5 * s + t; + return 2 * (t + -1) - x; +} + +