Nicolas Winkler 6 年 前
コミット
ea29da8862
4 ファイル変更36 行追加3 行削除
  1. 20 0
      src/Ast.h
  2. 1 1
      src/CodegenVisitor.cpp
  3. 14 1
      src/parser.y
  4. 1 1
      src/test.qlw

+ 20 - 0
src/Ast.h

@@ -53,6 +53,8 @@ namespace qlow
 
         struct DoEndBlock;
 
+        struct IfElseBlock;
+
         struct Statement;
         struct Expression;
 
@@ -211,6 +213,24 @@ struct qlow::ast::DoEndBlock : public AstObject
 };
 
 
+struct qlow::ast::IfElseBlock : public AstObject
+{
+    std::unique_ptr<DoEndBlock> ifBlock;
+    std::unique_ptr<DoEndBlock> elseBlock;
+    
+    inline IfElseBlock(std::unique_ptr<DoEndBlock> ifBlock,
+                       std::unique_ptr<DoEndBlock> elseBlock,
+                       const CodePosition& cp) :
+        AstObject{ cp },
+        ifBlock{ std::move(ifBlock) },
+        elseBlock{ std::move(elseBlock) }
+    {
+    }
+
+    virtual std::unique_ptr<sem::SemanticObject> accept(StructureVisitor& v, sem::Scope&);
+};
+
+
 struct qlow::ast::Statement : public virtual AstObject
 {
     inline Statement(const CodePosition& cp) :

+ 1 - 1
src/CodegenVisitor.cpp

@@ -12,7 +12,7 @@ using namespace qlow;
 std::pair<llvm::Value*, sem::Type> ExpressionVisitor::visit(sem::LocalVariableExpression& lve, llvm::IRBuilder<>& builder)
 {
     assert(lve.var->allocaInst != nullptr);
-    if (dynamic_cast<llvm::AllocaInst*>(lve.var->allocaInst)) {
+    if (llvm::dyn_cast<llvm::AllocaInst>(lve.var->allocaInst)) {
         llvm::Value* val = builder.CreateLoad(lve.var->allocaInst);
         return { val, lve.var->type };
     }

+ 14 - 1
src/parser.y

@@ -66,6 +66,7 @@ std::unique_ptr<ClassList> parsedClasses;
     std::vector<std::unique_ptr<qlow::ast::Expression>>* expressionList;
     qlow::ast::ArgumentDeclaration* argumentDeclaration;
     qlow::ast::DoEndBlock* doEndBlock;    
+    qlow::ast::ifElseBlock* ifElseBlock;    
     qlow::ast::Statement* statement;
     qlow::ast::Expression* expression;
     qlow::ast::Operation::Operator op;
@@ -88,7 +89,7 @@ std::unique_ptr<ClassList> parsedClasses;
 
 %token <string> IDENTIFIER
 %token <string> INT_LITERAL
-%token <token> CLASS DO END IF RETURN
+%token <token> CLASS DO END IF ELSE RETURN
 %token <token> NEW_LINE
 %token <token> SEMICOLON COLON COMMA DOT ASSIGN OPERATOR
 %token <token> ROUND_LEFT ROUND_RIGHT
@@ -102,6 +103,7 @@ std::unique_ptr<ClassList> parsedClasses;
 %type <expressionList> expressionList
 %type <argumentDeclaration> argumentDeclaration
 %type <doEndBlock> doEndBlock
+%type <ifElseBlock> ifElseBlock 
 %type <statement> statement
 %type <expression> expression operationExpression paranthesesExpression
 %type <op> operator
@@ -213,6 +215,17 @@ doEndBlock:
         $$ = new DoEndBlock(std::move(*$2), @$);
         delete $2; $2 = nullptr;
     };
+    
+    
+ifElseBlock:
+    IF expression doEndBlock {
+        $$ = new IfElseBlock($3, new DoEndBlock(@$), @$);
+        $2 = nullptr;
+    }
+    |
+    IF DO statements ELSE statements END {
+    
+    };
 
 
 statements:

+ 1 - 1
src/test.qlw

@@ -45,7 +45,7 @@ class FF
         variable: Integer
         variable2: FF
         variable := verdoppel(51)
-        return variable2.field1
+        return variable
     end
 end