changeset 5:2c5a8f4c254a

Added very simple if support. * No else * Still no logical operators, always tests != 0
author Anders Halager <halager@gmail.com>
date Fri, 18 Apr 2008 11:46:00 +0200
parents c09464468e1d
children 606a57c90a0b
files ast/Stmt.d gen/LLVMGen.d lexer/Keyword.d lexer/Token.d parser/Parser.d sema/Visitor.d test.td tests/code/basic_1.d tests/code/if_1.d tests/code/if_2.d
diffstat 10 files changed, 150 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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;
+}
+
--- 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;
         }
     }
 
--- 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
     ];
 }
--- 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"
     ];
 }
--- 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)
--- 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);
--- 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;
 }
 
--- /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;
+}
+
+
--- /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;
+}
+
+
--- /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;
+}
+
+