set up semantic visitor
This commit is contained in:
@ -6,13 +6,6 @@
|
||||
#include "../semantic/visitor.h"
|
||||
#include "scope.hpp"
|
||||
#include "tools.h"
|
||||
class ASTNodeVisitorBase {
|
||||
friend Visitor;
|
||||
|
||||
public:
|
||||
virtual ~ASTNodeVisitorBase() = default;
|
||||
virtual void visit(class ASTNodeBase *context) = 0;
|
||||
};
|
||||
|
||||
class ASTNodeBase {
|
||||
friend Visitor;
|
||||
@ -26,6 +19,14 @@ class ASTNodeBase {
|
||||
|
||||
public:
|
||||
virtual ~ASTNodeBase() = default;
|
||||
// virtual void accept(class ASTNodeVisitorBase *visitor) = 0;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) = 0;
|
||||
};
|
||||
|
||||
class ASTNodeVisitorBase {
|
||||
friend Visitor;
|
||||
|
||||
public:
|
||||
virtual ~ASTNodeVisitorBase() = default;
|
||||
void visit(ASTNodeBase *context) { context->accept(this); }
|
||||
};
|
||||
#endif
|
@ -1,6 +1,106 @@
|
||||
#ifndef ASTNODE_VISITOR_H
|
||||
#define ASTNODE_VISITOR_H
|
||||
#ifndef ASTNODE_ActuralVisitOR_H
|
||||
#define ASTNODE_ActuralVisitOR_H
|
||||
|
||||
#include "astnode.h"
|
||||
#include "expr_astnode.h"
|
||||
class ASTNodeVisitor : public ASTNodeVisitorBase {};
|
||||
#endif
|
||||
#include "statement_astnode.h"
|
||||
#include "structural_astnode.h"
|
||||
|
||||
class ASTNodeVirturalVisitor : public ASTNodeVisitorBase {
|
||||
public:
|
||||
// Structural AST Nodes
|
||||
virtual void ActuralVisit(FuncDef_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ClassDef_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(Program_ASTNode *node) = 0;
|
||||
|
||||
// Statement AST Nodes
|
||||
virtual void ActuralVisit(EmptyStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(DefinitionStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ExprStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(IfStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(WhileStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ForStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(JmpStatement_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(SuiteStatement_ASTNode *node) = 0;
|
||||
|
||||
// Expression AST Nodes
|
||||
virtual void ActuralVisit(NewArrayExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(NewConstructExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(NewExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(AccessExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(IndexExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(SuffixExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(PrefixExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(OppositeExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(LNotExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(BNotExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(MDMExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(PMExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(RLExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(GGLLExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(NEExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(BAndExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(BXorExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(BOrExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(LAndExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(LOrExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(TernaryExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(AssignExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ThisExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ParenExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(IDExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(FunctionCallExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(FormattedStringExpr_ASTNode *node) = 0;
|
||||
virtual void ActuralVisit(ConstantExpr_ASTNode *node) = 0;
|
||||
};
|
||||
|
||||
class ASTSemanticCheckVisitor : public ASTNodeVirturalVisitor {
|
||||
public:
|
||||
ASTSemanticCheckVisitor() = default;
|
||||
// Structural AST Nodes
|
||||
void ActuralVisit(FuncDef_ASTNode *node) override;
|
||||
void ActuralVisit(ClassDef_ASTNode *node) override;
|
||||
void ActuralVisit(Program_ASTNode *node) override;
|
||||
|
||||
// Statement AST Nodes
|
||||
void ActuralVisit(EmptyStatement_ASTNode *node) override;
|
||||
void ActuralVisit(DefinitionStatement_ASTNode *node) override;
|
||||
void ActuralVisit(ExprStatement_ASTNode *node) override;
|
||||
void ActuralVisit(IfStatement_ASTNode *node) override;
|
||||
void ActuralVisit(WhileStatement_ASTNode *node) override;
|
||||
void ActuralVisit(ForStatement_ASTNode *node) override;
|
||||
void ActuralVisit(JmpStatement_ASTNode *node) override;
|
||||
void ActuralVisit(SuiteStatement_ASTNode *node) override;
|
||||
|
||||
// Expression AST Nodes
|
||||
void ActuralVisit(NewArrayExpr_ASTNode *node) override;
|
||||
void ActuralVisit(NewConstructExpr_ASTNode *node) override;
|
||||
void ActuralVisit(NewExpr_ASTNode *node) override;
|
||||
void ActuralVisit(AccessExpr_ASTNode *node) override;
|
||||
void ActuralVisit(IndexExpr_ASTNode *node) override;
|
||||
void ActuralVisit(SuffixExpr_ASTNode *node) override;
|
||||
void ActuralVisit(PrefixExpr_ASTNode *node) override;
|
||||
void ActuralVisit(OppositeExpr_ASTNode *node) override;
|
||||
void ActuralVisit(LNotExpr_ASTNode *node) override;
|
||||
void ActuralVisit(BNotExpr_ASTNode *node) override;
|
||||
void ActuralVisit(MDMExpr_ASTNode *node) override;
|
||||
void ActuralVisit(PMExpr_ASTNode *node) override;
|
||||
void ActuralVisit(RLExpr_ASTNode *node) override;
|
||||
void ActuralVisit(GGLLExpr_ASTNode *node) override;
|
||||
void ActuralVisit(NEExpr_ASTNode *node) override;
|
||||
void ActuralVisit(BAndExpr_ASTNode *node) override;
|
||||
void ActuralVisit(BXorExpr_ASTNode *node) override;
|
||||
void ActuralVisit(BOrExpr_ASTNode *node) override;
|
||||
void ActuralVisit(LAndExpr_ASTNode *node) override;
|
||||
void ActuralVisit(LOrExpr_ASTNode *node) override;
|
||||
void ActuralVisit(TernaryExpr_ASTNode *node) override;
|
||||
void ActuralVisit(AssignExpr_ASTNode *node) override;
|
||||
void ActuralVisit(ThisExpr_ASTNode *node) override;
|
||||
void ActuralVisit(ParenExpr_ASTNode *node) override;
|
||||
void ActuralVisit(IDExpr_ASTNode *node) override;
|
||||
void ActuralVisit(FunctionCallExpr_ASTNode *node) override;
|
||||
void ActuralVisit(FormattedStringExpr_ASTNode *node) override;
|
||||
void ActuralVisit(ConstantExpr_ASTNode *node) override;
|
||||
};
|
||||
|
||||
#endif // ASTNODE_ActuralVisitOR_H
|
@ -7,159 +7,330 @@
|
||||
|
||||
class Expr_ASTNode : public ASTNodeBase {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
ExprTypeInfo expr_type_info;
|
||||
|
||||
public:
|
||||
Expr_ASTNode() = default;
|
||||
virtual ~Expr_ASTNode() = default;
|
||||
};
|
||||
|
||||
class BasicExpr_ASTNode : public Expr_ASTNode {}; // This is a virtual class
|
||||
|
||||
class NewArrayExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
bool has_initial_value;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> dim_size;
|
||||
std::shared_ptr<class ConstantExpr_ASTNode> initial_value;
|
||||
|
||||
public:
|
||||
NewArrayExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class NewConstructExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
public:
|
||||
NewConstructExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class NewExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
public:
|
||||
NewExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class AccessExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
IdentifierType member;
|
||||
bool is_function;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> arguments;
|
||||
|
||||
public:
|
||||
AccessExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class IndexExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> indices;
|
||||
|
||||
public:
|
||||
IndexExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class SuffixExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
|
||||
public:
|
||||
SuffixExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class PrefixExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
|
||||
public:
|
||||
PrefixExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class OppositeExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
|
||||
public:
|
||||
OppositeExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class LNotExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
|
||||
public:
|
||||
LNotExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class BNotExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> base;
|
||||
|
||||
public:
|
||||
BNotExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class MDMExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
MDMExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class PMExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
PMExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class RLExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
RLExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class GGLLExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
GGLLExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class NEExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
NEExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class BAndExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
BAndExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class BXorExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
BXorExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class BOrExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
BOrExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class LAndExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
LAndExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class LOrExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> left;
|
||||
std::shared_ptr<Expr_ASTNode> right;
|
||||
|
||||
public:
|
||||
LOrExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class TernaryExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> condition;
|
||||
std::shared_ptr<Expr_ASTNode> src1;
|
||||
std::shared_ptr<Expr_ASTNode> src2;
|
||||
|
||||
public:
|
||||
TernaryExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class AssignExpr_ASTNode : public Expr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::string op;
|
||||
std::shared_ptr<Expr_ASTNode> dest;
|
||||
std::shared_ptr<Expr_ASTNode> src;
|
||||
|
||||
public:
|
||||
AssignExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class ThisExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
};
|
||||
class ParenExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
std::shared_ptr<Expr_ASTNode> expr;
|
||||
};
|
||||
class IDExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
IdentifierType id;
|
||||
};
|
||||
class FunctionCallExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
IdentifierType func_name;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> arguments;
|
||||
};
|
||||
class FormattedStringExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
std::vector<std::string> literals;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> exprs;
|
||||
};
|
||||
struct NullType {};
|
||||
using AtomicConstantType = std::variant<uint32_t, bool, std::string, NullType>;
|
||||
class ConstantExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
size_t level;
|
||||
std::variant<AtomicConstantType, std::vector<std::shared_ptr<ConstantExpr_ASTNode>>> value;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
public:
|
||||
ThisExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
#endif // EXPR_ASTNODE_H
|
||||
class ParenExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> expr;
|
||||
|
||||
public:
|
||||
ParenExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class IDExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
IdentifierType id;
|
||||
|
||||
public:
|
||||
IDExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class FunctionCallExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
IdentifierType func_name;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> arguments;
|
||||
|
||||
public:
|
||||
FunctionCallExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
class FormattedStringExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::vector<std::string> literals;
|
||||
std::vector<std::shared_ptr<Expr_ASTNode>> exprs;
|
||||
|
||||
public:
|
||||
FormattedStringExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
struct NullType {};
|
||||
|
||||
using AtomicConstantType = std::variant<uint32_t, bool, std::string, NullType>;
|
||||
|
||||
class ConstantExpr_ASTNode : public BasicExpr_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
size_t level;
|
||||
std::variant<AtomicConstantType, std::vector<std::shared_ptr<ConstantExpr_ASTNode>>> value;
|
||||
|
||||
public:
|
||||
ConstantExpr_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
#endif // EXPR_ASTNODE_H
|
||||
|
@ -13,6 +13,7 @@ class ScopeBase {
|
||||
friend class FunctionScope;
|
||||
friend class ClassDefScope;
|
||||
friend class GlobalScope;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
protected:
|
||||
ScopeBase *parent; // cannot use std::shared_ptr<ScopeBase> because of circular dependency
|
||||
@ -118,8 +119,10 @@ class ClassDefScope : public ScopeBase {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (member_functions.find(name) != member_functions.end()) {
|
||||
return false;
|
||||
if (ttl == 0) {
|
||||
if (member_functions.find(name) != member_functions.end()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return parent->VariableNameAvailable(name, ttl + 1);
|
||||
}
|
||||
|
@ -10,43 +10,83 @@ class Statement_ASTNode : public ASTNodeBase {
|
||||
|
||||
class EmptyStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
public:
|
||||
EmptyStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class DefinitionStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
ExprTypeInfo var_type;
|
||||
std::vector<std::pair<IdentifierType, std::shared_ptr<Expr_ASTNode>>> vars;
|
||||
|
||||
public:
|
||||
DefinitionStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class ExprStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> expr;
|
||||
|
||||
public:
|
||||
ExprStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class IfStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
bool has_else_clause;
|
||||
std::shared_ptr<Expr_ASTNode> condition;
|
||||
std::shared_ptr<Statement_ASTNode> if_clause;
|
||||
std::shared_ptr<Statement_ASTNode> else_clause;
|
||||
|
||||
public:
|
||||
IfStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class WhileStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Expr_ASTNode> condition;
|
||||
std::shared_ptr<Statement_ASTNode> loop_body;
|
||||
|
||||
public:
|
||||
WhileStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class ForStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::shared_ptr<Statement_ASTNode> initial;
|
||||
std::shared_ptr<Expr_ASTNode> condition;
|
||||
std::shared_ptr<Statement_ASTNode> update;
|
||||
std::shared_ptr<Statement_ASTNode> loop_body;
|
||||
|
||||
public:
|
||||
ForStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class JmpStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
uint8_t jmp_type; // 0: return, 1: break, 2: continue
|
||||
std::shared_ptr<Expr_ASTNode> return_value;
|
||||
|
||||
public:
|
||||
JmpStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class SuiteStatement_ASTNode : public Statement_ASTNode {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::vector<std::shared_ptr<Statement_ASTNode>> statements;
|
||||
|
||||
public:
|
||||
SuiteStatement_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
|
||||
#endif // STATEMENT_ASTNODE_H
|
@ -4,10 +4,12 @@
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
#include "astnode.h"
|
||||
|
||||
#include "expr_astnode.h"
|
||||
#include "statement_astnode.h"
|
||||
class FuncDef_ASTNode : public ASTNodeBase {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
bool is_constructor;
|
||||
IdentifierType func_name;
|
||||
ExprTypeInfo return_type;
|
||||
@ -16,26 +18,33 @@ class FuncDef_ASTNode : public ASTNodeBase {
|
||||
|
||||
public:
|
||||
FuncDef_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class ClassDef_ASTNode : public ASTNodeBase {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
|
||||
private:
|
||||
std::string class_name;
|
||||
std::vector<std::shared_ptr<DefinitionStatement_ASTNode>> member_variables;
|
||||
std::vector<std::shared_ptr<FuncDef_ASTNode>> member_functions;
|
||||
std::shared_ptr<FuncDef_ASTNode> constructor;
|
||||
std::vector<std::shared_ptr<ASTNodeBase>> sorted_children;
|
||||
|
||||
public:
|
||||
ClassDef_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
class Program_ASTNode : public ASTNodeBase {
|
||||
friend Visitor;
|
||||
friend class ASTSemanticCheckVisitor;
|
||||
std::vector<std::shared_ptr<DefinitionStatement_ASTNode>> global_variables;
|
||||
std::vector<std::shared_ptr<ClassDef_ASTNode>> classes;
|
||||
std::vector<std::shared_ptr<FuncDef_ASTNode>> functions;
|
||||
std::vector<std::shared_ptr<ASTNodeBase>> sorted_children;
|
||||
|
||||
public:
|
||||
Program_ASTNode() = default;
|
||||
virtual void accept(class ASTNodeVisitorBase *visitor) override;
|
||||
};
|
||||
#endif
|
Reference in New Issue
Block a user