#pragma once #include #include #include #include namespace oraset3 { // Token类型 enum class TokenType { // 关键字 VAR, LET, CONST, FUNC, STRUCT, INTERFACE, UNION, ENUM, IF, ELSE, FOR, WHILE, RETURN, BREAK, CONTINUE, IMPORT, EXPORT, TRUE, FALSE, NIL, // 标识符和字面量 IDENTIFIER, INTEGER, FLOAT, STRING, // 运算符 PLUS, MINUS, MUL, DIV, MOD, EQ, NEQ, LT, GT, LE, GE, AND, OR, NOT, ASSIGN, COLON_ASSIGN, ADD_ASSIGN, SUB_ASSIGN, MUL_ASSIGN, DIV_ASSIGN, SHL, SHR, BIT_AND, BIT_OR, BIT_XOR, BIT_NOT, // 位操作符 POINTER, // * 用于指针声明和解引用 ADDRESS, // & 用于取地址 // 标点符号 LPAREN, RPAREN, LBRACE, RBRACE, LBRACKET, RBRACKET, COMMA, SEMICOLON, COLON, DOUBLE_COLON, DOT, // 特殊 END_OF_FILE, IMPORT_DIRECTIVE }; // Token结构 struct Token { TokenType type; std::string value; int line; int column; Token(TokenType t, const std::string& v, int l, int c) : type(t), value(v), line(l), column(c) {} }; // AST节点类型 enum class NodeType { PROGRAM, VAR_DECL, FUNC_DECL, STRUCT_DECL, INTERFACE_DECL, UNION_DECL, // 联合体声明 ENUM_DECL, // 枚举声明 IF_STMT, FOR_STMT, WHILE_STMT, RETURN_STMT, EXPR_STMT, ASSIGN_EXPR, BINARY_EXPR, UNARY_EXPR, CALL_EXPR, INDEX_EXPR, MEMBER_EXPR, LITERAL_EXPR, IDENTIFIER_EXPR, STRUCT_INIT, CAST_EXPR // 类型转换表达式 }; // AST节点基类 class ASTNode { public: virtual ~ASTNode() = default; virtual NodeType getType() const = 0; virtual void accept(class ASTVisitor& visitor) = 0; }; // AST访问者模式 class ASTVisitor { public: virtual ~ASTVisitor() = default; virtual void visit(class ProgramNode& node) = 0; virtual void visit(class VarDeclNode& node) = 0; virtual void visit(class FuncDeclNode& node) = 0; virtual void visit(class StructDeclNode& node) = 0; virtual void visit(class InterfaceDeclNode& node) = 0; virtual void visit(class UnionDeclNode& node) = 0; virtual void visit(class EnumDeclNode& node) = 0; virtual void visit(class IfStmtNode& node) = 0; virtual void visit(class ForStmtNode& node) = 0; virtual void visit(class WhileStmtNode& node) = 0; virtual void visit(class ReturnStmtNode& node) = 0; virtual void visit(class ExprStmtNode& node) = 0; virtual void visit(class AssignExprNode& node) = 0; virtual void visit(class BinaryExprNode& node) = 0; virtual void visit(class UnaryExprNode& node) = 0; virtual void visit(class CallExprNode& node) = 0; virtual void visit(class IndexExprNode& node) = 0; virtual void visit(class MemberExprNode& node) = 0; virtual void visit(class LiteralExprNode& node) = 0; virtual void visit(class IdentifierExprNode& node) = 0; virtual void visit(class StructInitNode& node) = 0; virtual void visit(class CastExprNode& node) = 0; }; // 具体AST节点类型定义 class ProgramNode : public ASTNode { public: std::vector> declarations; NodeType getType() const override { return NodeType::PROGRAM; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class VarDeclNode : public ASTNode { public: std::string name; std::string type; std::unique_ptr initializer; NodeType getType() const override { return NodeType::VAR_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class FuncDeclNode : public ASTNode { public: std::string name; std::vector> params; std::string returnType; std::vector> body; NodeType getType() const override { return NodeType::FUNC_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class StructDeclNode : public ASTNode { public: std::string name; std::vector> fields; NodeType getType() const override { return NodeType::STRUCT_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class InterfaceDeclNode : public ASTNode { public: std::string name; std::vector> methods; NodeType getType() const override { return NodeType::INTERFACE_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class IfStmtNode : public ASTNode { public: std::unique_ptr condition; std::vector> thenBranch; std::vector> elseBranch; NodeType getType() const override { return NodeType::IF_STMT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class ForStmtNode : public ASTNode { public: std::unique_ptr init; std::unique_ptr condition; std::unique_ptr update; std::vector> body; NodeType getType() const override { return NodeType::FOR_STMT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class WhileStmtNode : public ASTNode { public: std::unique_ptr condition; std::vector> body; NodeType getType() const override { return NodeType::WHILE_STMT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class ReturnStmtNode : public ASTNode { public: std::unique_ptr expr; NodeType getType() const override { return NodeType::RETURN_STMT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class ExprStmtNode : public ASTNode { public: std::unique_ptr expr; NodeType getType() const override { return NodeType::EXPR_STMT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class AssignExprNode : public ASTNode { public: std::unique_ptr left; std::unique_ptr right; std::string op; NodeType getType() const override { return NodeType::ASSIGN_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class BinaryExprNode : public ASTNode { public: std::unique_ptr left; std::unique_ptr right; std::string op; NodeType getType() const override { return NodeType::BINARY_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class UnaryExprNode : public ASTNode { public: std::unique_ptr operand; std::string op; NodeType getType() const override { return NodeType::UNARY_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class CallExprNode : public ASTNode { public: std::unique_ptr callee; std::vector> args; NodeType getType() const override { return NodeType::CALL_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class IndexExprNode : public ASTNode { public: std::unique_ptr base; std::unique_ptr index; NodeType getType() const override { return NodeType::INDEX_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class MemberExprNode : public ASTNode { public: std::unique_ptr object; std::string property; std::string op; NodeType getType() const override { return NodeType::MEMBER_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class StructInitNode : public ASTNode { public: std::string typeName; std::vector>> fields; NodeType getType() const override { return NodeType::STRUCT_INIT; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class LiteralExprNode : public ASTNode { public: std::string value; std::string type; NodeType getType() const override { return NodeType::LITERAL_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; class IdentifierExprNode : public ASTNode { public: std::string name; NodeType getType() const override { return NodeType::IDENTIFIER_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; // 联合体声明节点 class UnionDeclNode : public ASTNode { public: std::string name; std::vector> fields; NodeType getType() const override { return NodeType::UNION_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; // 枚举声明节点 class EnumDeclNode : public ASTNode { public: std::string name; std::vector> values; // name -> value NodeType getType() const override { return NodeType::ENUM_DECL; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; // 类型转换表达式节点 class CastExprNode : public ASTNode { public: std::string targetType; std::unique_ptr expr; NodeType getType() const override { return NodeType::CAST_EXPR; } void accept(ASTVisitor& visitor) override { visitor.visit(*this); } }; // 词法分析器 class Lexer { public: Lexer(const std::string& source); std::unique_ptr nextToken(); private: std::string source; size_t pos; int line; int column; char currentChar(); void advance(); void skipWhitespace(); std::string readIdentifier(); std::string readNumber(); std::string readString(char quote); }; // 语法分析器 class Parser { public: Parser(std::vector> tokens); std::unique_ptr parse(); private: std::vector> tokens; size_t pos; Token* currentToken(); Token* peekToken(); void advance(); bool match(TokenType type); bool consume(TokenType type); std::unique_ptr parseDeclaration(); std::unique_ptr parseVarDecl(); std::unique_ptr parseFuncDecl(); std::unique_ptr parseStructDecl(); std::unique_ptr parseInterfaceDecl(); std::unique_ptr parseUnionDecl(); std::unique_ptr parseEnumDecl(); std::unique_ptr parseStatement(); std::unique_ptr parseIfStmt(); std::unique_ptr parseForStmt(); std::unique_ptr parseWhileStmt(); std::unique_ptr parseReturnStmt(); std::unique_ptr parseBlock(); std::unique_ptr parseExpression(); std::unique_ptr parseAssignment(); std::unique_ptr parseLogicalOr(); std::unique_ptr parseLogicalAnd(); std::unique_ptr parseEquality(); std::unique_ptr parseComparison(); std::unique_ptr parseShift(); std::unique_ptr parseAdditive(); std::unique_ptr parseMultiplicative(); std::unique_ptr parseUnary(); std::unique_ptr parsePostfix(); std::unique_ptr parsePrimary(); }; // 语义分析器 class SemanticAnalyzer : public ASTVisitor { public: SemanticAnalyzer(bool sysui = false) : sysuiImported(sysui) {} void analyze(ProgramNode& program); bool hasErrors() const { return !errors.empty(); } const std::vector& getErrors() const { return errors; } private: std::vector errors; std::map symbolTable; bool sysuiImported; void visit(ProgramNode& node) override; void visit(VarDeclNode& node) override; void visit(FuncDeclNode& node) override; void visit(StructDeclNode& node) override; void visit(InterfaceDeclNode& node) override; void visit(UnionDeclNode& node) override; void visit(EnumDeclNode& node) override; void visit(CastExprNode& node) override; void visit(IfStmtNode& node) override; void visit(ForStmtNode& node) override; void visit(WhileStmtNode& node) override; void visit(ReturnStmtNode& node) override; void visit(ExprStmtNode& node) override; void visit(AssignExprNode& node) override; void visit(BinaryExprNode& node) override; void visit(UnaryExprNode& node) override; void visit(CallExprNode& node) override; void visit(IndexExprNode& node) override; void visit(MemberExprNode& node) override; void visit(LiteralExprNode& node) override; void visit(IdentifierExprNode& node) override; void visit(StructInitNode& node) override; }; // 代码生成器 class CodeGenerator : public ASTVisitor { public: CodeGenerator(bool sysui = false) : sysuiImported(sysui) {} std::string generate(ProgramNode& program); private: std::string code; int indent; bool sysuiImported; void emit(const std::string& str); void emitLine(const std::string& str); void indentUp(); void indentDown(); void visit(ProgramNode& node) override; void visit(VarDeclNode& node) override; void visit(FuncDeclNode& node) override; void visit(StructDeclNode& node) override; void visit(InterfaceDeclNode& node) override; void visit(UnionDeclNode& node) override; void visit(EnumDeclNode& node) override; void visit(CastExprNode& node) override; void visit(IfStmtNode& node) override; void visit(ForStmtNode& node) override; void visit(WhileStmtNode& node) override; void visit(ReturnStmtNode& node) override; void visit(ExprStmtNode& node) override; void visit(AssignExprNode& node) override; void visit(BinaryExprNode& node) override; void visit(UnaryExprNode& node) override; void visit(CallExprNode& node) override; void visit(IndexExprNode& node) override; void visit(MemberExprNode& node) override; void visit(LiteralExprNode& node) override; void visit(IdentifierExprNode& node) override; void visit(StructInitNode& node) override; }; // 编译器类 class Compiler { public: std::string compile(const std::string& source); }; } // namespace oraset3