#pragma once #include #include enum ast_type_t { AST_EXPR_LITERAL = 1, // 常数值 => 预计将存储在 data 段中 AST_EXPR_BINARY, // 二元表达式 AST_EXPR_UNARY, // 一元表达式 AST_EXPR_IDENT, // 标识符表达式 AST_EXPR_MAP_ACCESS, AST_EXPR_VEC_ACCESS, AST_EXPR_ARRAY_ACCESS, AST_EXPR_TUPLE_ACCESS, AST_EXPR_STRUCT_SELECT, AST_EXPR_VEC_NEW, // [1, 2, 3] AST_EXPR_ARRAY_NEW, // [1, 2, 3] AST_EXPR_VEC_REPEAT_NEW, // [0;12] AST_EXPR_ARRAY_REPEAT_NEW, // [0;12] AST_EXPR_EMPTY_CURLY_NEW, // {} AST_EXPR_MAP_NEW, // {"a": 1, "b": 2} AST_EXPR_TUPLE_NEW, // (1, 1.1, true) AST_EXPR_TUPLE_DESTR, // (var_a, var_b, (var_c, var_d)) AST_EXPR_STRUCT_NEW, // person {a = 1; b = 2} AST_EXPR_BLOCK, // stmt AST_STMT_EXPR_FAKE, AST_STMT_BREAK, AST_STMT_CONTINUE, AST_STMT_IMPORT, AST_STMT_VARDEF, AST_STMT_VAR_TUPLE_DESTR, AST_STMT_ASSIGN, AST_STMT_GLOBAL_ASSIGN, AST_STMT_RETURN, AST_STMT_IF, AST_STMT_FOR_ITERATOR, AST_STMT_FOR_COND, AST_STMT_FOR_TRADITION, AST_CALL, AST_FNDEF, // fn def (其包含 body) AST_STMT_ENV_CLOSURE, // closure def }; enum ast_expr_op_t { // ARITHMETIC 运算 AST_OP_ADD, // + AST_OP_SUB, // - AST_OP_MUL, // * AST_OP_DIV, // / AST_OP_REM, // % // unary AST_OP_NOT, // unary bool !right, right must bool AST_OP_NEG, // unary number -right AST_OP_BNOT, // unary binary ~right, right must int // 位运算 AST_OP_AND, AST_OP_OR, AST_OP_XOR, AST_OP_LSHIFT, AST_OP_RSHIFT, AST_OP_LT, // < AST_OP_LE, // <= AST_OP_GT, // > AST_OP_GE, // >= AST_OP_EE, // == AST_OP_NE, // != AST_OP_AND_AND, // && AST_OP_OR_OR, // || }; // 将ast_expr_op_t类型转换为string inline std::unordered_map ast_type_map = { // 算术运算符 {AST_OP_ADD, "+"}, {AST_OP_SUB, "-"}, {AST_OP_MUL, "*"}, {AST_OP_DIV, "/"}, {AST_OP_REM, "%"}, // 位运算符 {AST_OP_AND, "&"}, {AST_OP_OR, "|"}, {AST_OP_XOR, "^"}, {AST_OP_BNOT, "~"}, {AST_OP_LSHIFT, "<<"}, {AST_OP_RSHIFT, ">>"}, // 比较运算符 {AST_OP_LT, "<"}, {AST_OP_LE, "<="}, {AST_OP_GT, ">"}, {AST_OP_GE, ">="}, {AST_OP_EE, "=="}, {AST_OP_NE, "!="}, // 逻辑运算符 {AST_OP_OR_OR, "||"}, {AST_OP_AND_AND, "&&"}, {AST_OP_NOT, "!"}, // 一元运算符:逻辑非 {AST_OP_NEG, "-"}, // 一元运算符:负号 }; struct ast_stmt_t { int line; int column; bool error; ast_type_t assert_type; // 声明语句类型 void *value; };