From 19480f7f26ea01b6e9d799065e948fcb5849b72d Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 7 Jun 2023 00:10:00 +0800 Subject: [PATCH] :sparkles: add new ast nodes --- ast/nasal_new_ast.cpp | 9 ------- ast/nasal_new_ast.h | 58 ++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/ast/nasal_new_ast.cpp b/ast/nasal_new_ast.cpp index 266ed2d..13b5afc 100644 --- a/ast/nasal_new_ast.cpp +++ b/ast/nasal_new_ast.cpp @@ -1,19 +1,10 @@ #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); } \ No newline at end of file diff --git a/ast/nasal_new_ast.h b/ast/nasal_new_ast.h index 154d901..f125444 100644 --- a/ast/nasal_new_ast.h +++ b/ast/nasal_new_ast.h @@ -3,7 +3,7 @@ #include "nasal.h" #include "nasal_err.h" -enum class ast_node_type:u32 { +enum class expr_type:u32 { ast_null=0, // null node ast_stmt, ast_expr, @@ -76,37 +76,49 @@ enum class ast_node_type:u32 { class ast_visitor; -class ast_node { +class expr { private: span nd_loc; - ast_node_type nd_type; + expr_type nd_type; 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) {} - ~ast_node() = default; + ~expr() = 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 null_expr:public expr {}; +class nil_expr:public expr {}; +class number_literal:public expr {}; +class string_literal:public expr {}; +class identifier:public expr {}; +class bool_literal:public expr {}; +class vector_expr:public expr {}; +class hash_expr:public expr {}; +class hash_pair:public expr {}; +class function:public expr {}; +class parameter:public expr {}; +class ternary_operator:public expr {}; +class binary_operator:public expr {}; +class unary_operator:public expr {}; +class call_expr:public expr {}; +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 { public: - virtual void visit_stmt(stmt*); virtual void visit_expr(expr*); }; \ No newline at end of file