add new ast nodes

This commit is contained in:
ValKmjolnir 2023-06-07 00:10:00 +08:00
parent 9bf4eacc62
commit 19480f7f26
2 changed files with 35 additions and 32 deletions

View File

@ -1,19 +1,10 @@
#include "nasal_new_ast.h" #include "nasal_new_ast.h"
bool stmt::accept(ast_visitor* visitor) {
visitor->visit_stmt(this);
return true;
}
bool expr::accept(ast_visitor* visitor) { bool expr::accept(ast_visitor* visitor) {
visitor->visit_expr(this); visitor->visit_expr(this);
return true; return true;
} }
void ast_visitor::visit_stmt(stmt* node) {
node->accept(this);
}
void ast_visitor::visit_expr(expr* node) { void ast_visitor::visit_expr(expr* node) {
node->accept(this); node->accept(this);
} }

View File

@ -3,7 +3,7 @@
#include "nasal.h" #include "nasal.h"
#include "nasal_err.h" #include "nasal_err.h"
enum class ast_node_type:u32 { enum class expr_type:u32 {
ast_null=0, // null node ast_null=0, // null node
ast_stmt, ast_stmt,
ast_expr, ast_expr,
@ -76,37 +76,49 @@ enum class ast_node_type:u32 {
class ast_visitor; class ast_visitor;
class ast_node { class expr {
private: private:
span nd_loc; span nd_loc;
ast_node_type nd_type; expr_type nd_type;
public: public:
ast_node(const span& location,ast_node_type node_type): expr(const span& location,expr_type node_type):
nd_loc(location), nd_type(node_type) {} nd_loc(location), nd_type(node_type) {}
~ast_node() = default; ~expr() = default;
virtual bool accept(ast_visitor*) = 0; virtual bool accept(ast_visitor*) = 0;
}; };
class stmt:public ast_node { class null_expr:public expr {};
public: class nil_expr:public expr {};
stmt(const span& location,ast_node_type node_type): class number_literal:public expr {};
ast_node(location, node_type) {} class string_literal:public expr {};
~stmt() = default; class identifier:public expr {};
virtual bool accept(ast_visitor*); class bool_literal:public expr {};
}; class vector_expr:public expr {};
class hash_expr:public expr {};
class expr:public ast_node { class hash_pair:public expr {};
private: class function:public expr {};
class parameter:public expr {};
public: class ternary_operator:public expr {};
expr(const span& location,ast_node_type node_type): class binary_operator:public expr {};
ast_node(location, node_type) {} class unary_operator:public expr {};
~expr() = default; class call_expr:public expr {};
virtual bool accept(ast_visitor*); class call_hash:public expr {};
}; class call_vector:public expr {};
class call_function:public expr {};
class slice_vector:public expr {};
class definition:public expr {};
class multi_define:public expr {};
class while_expr:public expr {};
class for_expr:public expr {};
class foreach_expr:public expr {};
class forindex_expr:public expr {};
class condition_expr:public expr {};
class if_expr:public expr {};
class continue_expr:public expr {};
class break_expr:public expr {};
class return_expr:public expr {};
class ast_visitor { class ast_visitor {
public: public:
virtual void visit_stmt(stmt*);
virtual void visit_expr(expr*); virtual void visit_expr(expr*);
}; };