| 
					
				 | 
			
			
				@@ -1,6 +1,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "AstVisitor.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "Ast.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "Util.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using namespace qlow; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -82,7 +84,23 @@ std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::DoEndBlock& as 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     auto body = std::make_unique<sem::DoEndBlock>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (auto& statement : ast.statements) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        body->statements.push_back(unique_dynamic_cast<sem::Statement>(visit(*statement, classes))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (ast::NewVariableStatement* nvs = dynamic_cast<ast::NewVariableStatement*>(statement.get()); nvs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            auto var = std::make_unique<sem::Variable>(getType(nvs->type, classes), nvs->name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (var->type == nullptr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw sem::SemanticException(sem::SemanticException::UNKNOWN_TYPE, nvs->type, nvs->pos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            body->variables.push_back(std::move(var)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        auto v = visit(*statement, classes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (dynamic_cast<sem::FeatureCallExpression*>(v.get()) != nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            body->statements.push_back(std::make_unique<sem::FeatureCallStatement>(unique_dynamic_cast<sem::FeatureCallExpression>(std::move(v)))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            body->statements.push_back(unique_dynamic_cast<sem::Statement>(std::move(v))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -100,11 +118,19 @@ std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::Expression& as 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::FeatureCall& ast, const sem::SymbolTable<sem::Class>& classes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto fce = std::make_unique<sem::FeatureCallExpression>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //fce->callee = unique_dynamic_cast<sem::Expression>(visit(*ast.target, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return fce; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::AssignmentStatement& ast, const sem::SymbolTable<sem::Class>& classes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto as = std::make_unique<sem::AssignmentStatement>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    as->value = unique_dynamic_cast<sem::Expression>(visit(*ast.expr, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    as->target = unique_dynamic_cast<sem::Expression>(visit(*ast.target, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return as; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -115,11 +141,21 @@ std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::NewVariableSta 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::UnaryOperation& ast, const sem::SymbolTable<sem::Class>& classes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto ret = std::make_unique<sem::UnaryOperation>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->op = ast.op; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->side = ast.side; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->arg = unique_dynamic_cast<sem::Expression>(visit(*ast.expr, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::BinaryOperation& ast, const sem::SymbolTable<sem::Class>& classes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto ret = std::make_unique<sem::BinaryOperation>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->op = ast.op; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->left = unique_dynamic_cast<sem::Expression>(visit(*ast.left, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ret->right = unique_dynamic_cast<sem::Expression>(visit(*ast.right, classes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |