|
@@ -1,6 +1,8 @@
|
|
#include "AstVisitor.h"
|
|
#include "AstVisitor.h"
|
|
#include "Ast.h"
|
|
#include "Ast.h"
|
|
|
|
|
|
|
|
+#include "Util.h"
|
|
|
|
+
|
|
using namespace qlow;
|
|
using namespace qlow;
|
|
|
|
|
|
|
|
|
|
@@ -82,7 +84,23 @@ std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::DoEndBlock& as
|
|
{
|
|
{
|
|
auto body = std::make_unique<sem::DoEndBlock>();
|
|
auto body = std::make_unique<sem::DoEndBlock>();
|
|
for (auto& statement : ast.statements) {
|
|
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;
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|