120 lines
2.7 KiB
C++
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;
|
|
};
|
|
|
|
|