Initial commit: Oraset3 programming language with OS-level features

This commit is contained in:
JGZSunShineMod1.0.3
2026-05-22 12:19:05 +08:00
commit 1205365f32
27 changed files with 4191 additions and 0 deletions
+463
View File
@@ -0,0 +1,463 @@
#pragma once
#include <vector>
#include <string>
#include <map>
#include <memory>
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<std::unique_ptr<ASTNode>> 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<ASTNode> 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<std::pair<std::string, std::string>> params;
std::string returnType;
std::vector<std::unique_ptr<ASTNode>> 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<std::pair<std::string, std::string>> 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<std::pair<std::string, std::string>> 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<ASTNode> condition;
std::vector<std::unique_ptr<ASTNode>> thenBranch;
std::vector<std::unique_ptr<ASTNode>> 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<ASTNode> init;
std::unique_ptr<ASTNode> condition;
std::unique_ptr<ASTNode> update;
std::vector<std::unique_ptr<ASTNode>> 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<ASTNode> condition;
std::vector<std::unique_ptr<ASTNode>> 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<ASTNode> 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<ASTNode> 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<ASTNode> left;
std::unique_ptr<ASTNode> 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<ASTNode> left;
std::unique_ptr<ASTNode> 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<ASTNode> 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<ASTNode> callee;
std::vector<std::unique_ptr<ASTNode>> 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<ASTNode> base;
std::unique_ptr<ASTNode> 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<ASTNode> 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<std::pair<std::string, std::unique_ptr<ASTNode>>> 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<std::pair<std::string, std::string>> 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<std::pair<std::string, std::string>> 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<ASTNode> 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<Token> 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<std::unique_ptr<Token>> tokens);
std::unique_ptr<ProgramNode> parse();
private:
std::vector<std::unique_ptr<Token>> tokens;
size_t pos;
Token* currentToken();
Token* peekToken();
void advance();
bool match(TokenType type);
bool consume(TokenType type);
std::unique_ptr<ASTNode> parseDeclaration();
std::unique_ptr<ASTNode> parseVarDecl();
std::unique_ptr<ASTNode> parseFuncDecl();
std::unique_ptr<ASTNode> parseStructDecl();
std::unique_ptr<ASTNode> parseInterfaceDecl();
std::unique_ptr<ASTNode> parseUnionDecl();
std::unique_ptr<ASTNode> parseEnumDecl();
std::unique_ptr<ASTNode> parseStatement();
std::unique_ptr<ASTNode> parseIfStmt();
std::unique_ptr<ASTNode> parseForStmt();
std::unique_ptr<ASTNode> parseWhileStmt();
std::unique_ptr<ASTNode> parseReturnStmt();
std::unique_ptr<ASTNode> parseBlock();
std::unique_ptr<ASTNode> parseExpression();
std::unique_ptr<ASTNode> parseAssignment();
std::unique_ptr<ASTNode> parseLogicalOr();
std::unique_ptr<ASTNode> parseLogicalAnd();
std::unique_ptr<ASTNode> parseEquality();
std::unique_ptr<ASTNode> parseComparison();
std::unique_ptr<ASTNode> parseShift();
std::unique_ptr<ASTNode> parseAdditive();
std::unique_ptr<ASTNode> parseMultiplicative();
std::unique_ptr<ASTNode> parseUnary();
std::unique_ptr<ASTNode> parsePostfix();
std::unique_ptr<ASTNode> 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<std::string>& getErrors() const { return errors; }
private:
std::vector<std::string> errors;
std::map<std::string, std::string> 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