Hydrogen/include/ast.hpp
2025-06-05 21:29:46 +08:00

120 lines
2.7 KiB
C++

#pragma once
#include <map>
#include <string>
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_expr_op_t, std::string> 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;
};