#ifndef EXPR_ASTNODE_H #define EXPR_ASTNODE_H #include #include #include #include "astnode.h" class Expr_ASTNode : public ASTNodeBase { friend Visitor; ExprTypeInfo expr_type_info; public: virtual ~Expr_ASTNode() = default; }; class BasicExpr_ASTNode : public Expr_ASTNode {}; // This is a virtual class class NewArrayExpr_ASTNode : public Expr_ASTNode { friend Visitor; bool has_initial_value; std::vector> dim_size; std::shared_ptr initial_value; }; class NewConstructExpr_ASTNode : public Expr_ASTNode { friend Visitor; }; class NewExpr_ASTNode : public Expr_ASTNode { friend Visitor; }; class AccessExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; IdentifierType member; bool is_function; std::vector> arguments; }; class IndexExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; std::vector> indices; }; class SuffixExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr base; }; class PrefixExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr base; }; class OppositeExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; }; class LNotExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; }; class BNotExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; }; class MDMExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class PMExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class RLExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class GGLLExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class NEExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class BAndExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class BXorExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class BOrExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class LAndExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class LOrExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr left; std::shared_ptr right; }; class TernaryExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr condition; std::shared_ptr src1; std::shared_ptr src2; }; class AssignExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::string op; std::shared_ptr dest; std::shared_ptr src; }; class ThisExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; }; class ParenExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; std::shared_ptr expr; }; class IDExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; IdentifierType id; }; class FunctionCallExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; IdentifierType func_name; std::vector> arguments; }; class FormattedStringExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; std::vector literals; std::vector> exprs; }; struct NullType {}; using AtomicConstantType = std::variant; struct ArrayConstantType { friend Visitor; std::vector, NullType, AtomicConstantType>> elements; size_t level; }; class ConstantExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; std::variant value; }; #endif // EXPR_ASTNODE_H