#include "AstVisitor.h" #include "Ast.h" using namespace qlow; sem::Class* StructureVisitor::getType(const std::string& type, const sem::SymbolTable& classes) { auto t = classes.find(type); if (t != classes.end()) return t->second.get(); else return nullptr; } std::unique_ptr StructureVisitor::visit(ast::Class& ast, const sem::SymbolTable& classes) { auto c = std::make_unique(); c->name = ast.name; return c; } std::unique_ptr StructureVisitor::visit(ast::FeatureDeclaration& ast, const sem::SymbolTable& classes) { // not needed, because } std::unique_ptr StructureVisitor::visit(ast::FieldDeclaration& ast, const sem::SymbolTable& classes) { auto f = std::make_unique(); f->name = ast.name; f->type = getType(ast.type, classes); if (f->type == nullptr) { throw sem::SemanticException(sem::SemanticException::UNKNOWN_TYPE, ast.type, ast.pos ); } return f; } std::unique_ptr StructureVisitor::visit(ast::MethodDefinition& ast, const sem::SymbolTable& classes) { auto m = std::make_unique(); m->name = ast.name; m->returnType = getType(ast.type, classes); if (m->returnType == nullptr) { throw sem::SemanticException(sem::SemanticException::UNKNOWN_TYPE, ast.type, ast.pos ); } return m; } std::unique_ptr StructureVisitor::visit(ast::VariableDeclaration& ast, const sem::SymbolTable& classes) { auto v = std::make_unique(); v->name = ast.name; v->type = getType(ast.type, classes); if (v->type == nullptr) { throw sem::SemanticException(sem::SemanticException::UNKNOWN_TYPE, ast.type, ast.pos ); } return v; } std::unique_ptr StructureVisitor::visit(ast::ArgumentDeclaration& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::DoEndBlock& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::Statement& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::Expression& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::FeatureCall& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::AssignmentStatement& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::NewVariableStatement& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::UnaryOperation& ast, const sem::SymbolTable& classes) { } std::unique_ptr StructureVisitor::visit(ast::BinaryOperation& ast, const sem::SymbolTable& classes) { }