mirror of
https://github.com/ValKmjolnir/Nasal-Interpreter.git
synced 2026-07-27 05:18:46 +08:00
prepare to use new ast
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
#include "nasal_new_ast.h"
|
||||
|
||||
bool stmt::accept(ast_visitor* visitor) {
|
||||
visitor->visit_stmt(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool expr::accept(ast_visitor* visitor) {
|
||||
visitor->visit_expr(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ast_visitor::visit_stmt(stmt* node) {
|
||||
node->accept(this);
|
||||
}
|
||||
|
||||
void ast_visitor::visit_expr(expr* node) {
|
||||
node->accept(this);
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
#pragma once
|
||||
|
||||
#include "nasal.h"
|
||||
#include "nasal_err.h"
|
||||
|
||||
enum class ast_node_type:u32 {
|
||||
ast_null=0, // null node
|
||||
ast_stmt,
|
||||
ast_expr,
|
||||
ast_root, // mark the root node of ast
|
||||
ast_block, // expression block
|
||||
ast_file, // used to store which file the sub-tree is on, only used in main block
|
||||
ast_nil, // nil keyword
|
||||
ast_num, // number, basic value type
|
||||
ast_str, // string, basic value type
|
||||
ast_id, // identifier
|
||||
ast_bool, // bools
|
||||
ast_func, // func keyword
|
||||
ast_hash, // hash, basic value type
|
||||
ast_vec, // vector, basic value type
|
||||
ast_pair, // pair of key and value in hashmap
|
||||
ast_call, // mark a sub-tree of calling an identifier
|
||||
ast_callh, // id.name
|
||||
ast_callv, // id[index]
|
||||
ast_callf, // id()
|
||||
ast_subvec, // id[index:index]
|
||||
ast_params, // mark a sub-tree of function parameters
|
||||
ast_default, // default parameter
|
||||
ast_dynamic, // dynamic parameter
|
||||
ast_and, // and keyword
|
||||
ast_or, // or keyword
|
||||
ast_equal, // =
|
||||
ast_addeq, // +=
|
||||
ast_subeq, // -=
|
||||
ast_multeq, // *=
|
||||
ast_diveq, // /=
|
||||
ast_lnkeq, // ~=
|
||||
ast_btandeq, // &=
|
||||
ast_btoreq, // |=
|
||||
ast_btxoreq, // ^=
|
||||
ast_cmpeq, // ==
|
||||
ast_neq, // !=
|
||||
ast_less, // <
|
||||
ast_leq, // <=
|
||||
ast_grt, // >
|
||||
ast_geq, // >=
|
||||
ast_add, // +
|
||||
ast_sub, // -
|
||||
ast_mult, // *
|
||||
ast_div, // /
|
||||
ast_link, // ~
|
||||
ast_neg, // unary -
|
||||
ast_lnot, // unary !
|
||||
ast_bnot, // unary ~ bitwise not
|
||||
ast_bitor, // bitwise or
|
||||
ast_bitxor, // bitwise xor
|
||||
ast_bitand, // bitwise and
|
||||
ast_trino, // ?:
|
||||
ast_for, // for keyword
|
||||
ast_forindex, // forindex keyword
|
||||
ast_foreach, // foreach keyword
|
||||
ast_while, // while
|
||||
ast_iter, // iterator, used in forindex/foreach
|
||||
ast_cond, // mark a sub-tree of conditional expression
|
||||
ast_if, // if keyword
|
||||
ast_elsif, // elsif keyword
|
||||
ast_else, // else keyword
|
||||
ast_multi_id, // multi identifiers sub-tree
|
||||
ast_tuple, // tuple, only used in multiple assignment
|
||||
ast_def, // definition
|
||||
ast_multi_assign,// multi assignment sub-tree
|
||||
ast_continue, // continue keyword, only used in loop
|
||||
ast_break, // break keyword, only used in loop
|
||||
ast_ret // return keyword, only used in function block
|
||||
};
|
||||
|
||||
class ast_visitor;
|
||||
|
||||
class ast_node {
|
||||
private:
|
||||
span nd_loc;
|
||||
ast_node_type nd_type;
|
||||
public:
|
||||
ast_node(const span& location,ast_node_type node_type):
|
||||
nd_loc(location), nd_type(node_type) {}
|
||||
~ast_node() = default;
|
||||
virtual bool accept(ast_visitor*) = 0;
|
||||
};
|
||||
|
||||
class stmt:public ast_node {
|
||||
public:
|
||||
stmt(const span& location,ast_node_type node_type):
|
||||
ast_node(location, node_type) {}
|
||||
~stmt() = default;
|
||||
virtual bool accept(ast_visitor*);
|
||||
};
|
||||
|
||||
class expr:public ast_node {
|
||||
private:
|
||||
|
||||
public:
|
||||
expr(const span& location,ast_node_type node_type):
|
||||
ast_node(location, node_type) {}
|
||||
~expr() = default;
|
||||
virtual bool accept(ast_visitor*);
|
||||
};
|
||||
|
||||
class ast_visitor {
|
||||
public:
|
||||
virtual void visit_stmt(stmt*);
|
||||
virtual void visit_expr(expr*);
|
||||
};
|
||||
Reference in New Issue
Block a user