From ec1985b3cc53fcd3a79b3f309e568477de2879f5 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 14 Jun 2023 00:01:15 +0800 Subject: [PATCH] :sparkles: update --- ast/ast_visitor.cpp | 21 +++++++ ast/ast_visitor.h | 12 ++++ ast/nasal_new_ast.cpp | 21 ++++++- ast/nasal_new_ast.h | 127 ++++++++++++++++++++++++++++------------ ast/nasal_new_parse.cpp | 36 ++++++++++++ ast/nasal_new_parse.h | 36 +----------- makefile | 7 ++- 7 files changed, 185 insertions(+), 75 deletions(-) create mode 100644 ast/ast_visitor.cpp create mode 100644 ast/ast_visitor.h diff --git a/ast/ast_visitor.cpp b/ast/ast_visitor.cpp new file mode 100644 index 0000000..4e6df01 --- /dev/null +++ b/ast/ast_visitor.cpp @@ -0,0 +1,21 @@ +#include "ast_visitor.h" + +void ast_visitor::visit_expr(expr* node) { + node->accept(this); +} + +void ast_visitor::visit_null_expr(null_expr* node) { + node->accept(this); +} + +void ast_visitor::visit_nil_expr(nil_expr* node) { + node->accept(this); +} + +void ast_visitor::visit_number_literal(number_literal* node) { + node->accept(this); +} + +void ast_visitor::visit_string_literal(string_literal* node) { + node->accept(this); +} \ No newline at end of file diff --git a/ast/ast_visitor.h b/ast/ast_visitor.h new file mode 100644 index 0000000..d077d52 --- /dev/null +++ b/ast/ast_visitor.h @@ -0,0 +1,12 @@ +#pragma once + +#include "nasal_new_ast.h" + +class ast_visitor { +public: + virtual void visit_expr(expr*); + virtual void visit_null_expr(null_expr*); + virtual void visit_nil_expr(nil_expr*); + virtual void visit_number_literal(number_literal*); + virtual void visit_string_literal(string_literal*); +}; \ No newline at end of file diff --git a/ast/nasal_new_ast.cpp b/ast/nasal_new_ast.cpp index 13b5afc..5bf617f 100644 --- a/ast/nasal_new_ast.cpp +++ b/ast/nasal_new_ast.cpp @@ -1,10 +1,27 @@ #include "nasal_new_ast.h" +#include "ast_visitor.h" bool expr::accept(ast_visitor* visitor) { visitor->visit_expr(this); return true; } -void ast_visitor::visit_expr(expr* node) { - node->accept(this); +bool null_expr::accept(ast_visitor* visitor) { + visitor->visit_null_expr(this); + return true; +} + +bool nil_expr::accept(ast_visitor* visitor) { + visitor->visit_nil_expr(this); + return true; +} + +bool number_literal::accept(ast_visitor* visitor) { + visitor->visit_number_literal(this); + return true; +} + +bool string_literal::accept(ast_visitor* visitor) { + visitor->visit_string_literal(this); + return true; } \ No newline at end of file diff --git a/ast/nasal_new_ast.h b/ast/nasal_new_ast.h index f125444..8121270 100644 --- a/ast/nasal_new_ast.h +++ b/ast/nasal_new_ast.h @@ -5,8 +5,7 @@ enum class expr_type:u32 { ast_null=0, // null node - ast_stmt, - ast_expr, + ast_expr, // expression node 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 @@ -81,44 +80,98 @@ private: span nd_loc; expr_type nd_type; public: - expr(const span& location,expr_type node_type): + expr(const span& location, expr_type node_type): nd_loc(location), nd_type(node_type) {} ~expr() = default; virtual bool accept(ast_visitor*) = 0; }; -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 { +class null_expr:public expr { public: - virtual void visit_expr(expr*); -}; \ No newline at end of file + null_expr(const span& location): + expr(location, expr_type::ast_null) {} + ~null_expr() = default; + virtual bool accept(ast_visitor*); +}; + +class nil_expr:public expr { +public: + nil_expr(const span& location): + expr(location, expr_type::ast_nil) {} + ~nil_expr() = default; + virtual bool accept(ast_visitor*); +}; + +class number_literal:public expr { +private: + f64 number; + +public: + number_literal(const span& location, const f64 num): + expr(location, expr_type::ast_num), number(num) {} + ~number_literal() = default; + virtual bool accept(ast_visitor*); +}; + +class string_literal:public expr { +private: + string content; + +public: + string_literal(const span& location, const string& str): + expr(location, expr_type::ast_str), content(str) {} + ~string_literal() = default; + virtual bool accept(ast_visitor*); +}; + +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 {}; diff --git a/ast/nasal_new_parse.cpp b/ast/nasal_new_parse.cpp index 653c3f4..5d7fc44 100644 --- a/ast/nasal_new_parse.cpp +++ b/ast/nasal_new_parse.cpp @@ -18,6 +18,42 @@ const error& parse::compile(const lexer& lexer) { return err; } +void parse::easter_egg() const { + std::clog + << " _,,,_ \n" + << " .' `'. \n" + << " / ____ \\ Fucking Nasal Parser \n" + << " | .-'_ _\\/ / \n" + << " \\_/ a a| / \n" + << " (,` \\ | .----. \n" + << " | -' | /| '--. \n" + << " \\ '= / || ]| `-. \n" + << " /`-.__.' || ]| ::| \n" + << " .-'`-.__ \\__ || ]| ::| \n" + << " / `` `. || ]| ::| \n" + << " _ | \\ \\ \\ \\| ]| .-' \n" + << " / \\| \\ | \\ L.__ .--'( \n" + << " | |\\ `. | \\ ,---|_ \\---------, \n" + << " | | '. './\\ \\/ .--._|=- |_ /| \n" + << " | \\ '. `'.'. /`\\/ .-' '. / | \n" + << " | | `'. `;-:-;`)| |-./ | \n" + << " | /_ `'--./_ ` )/'-------------')/) | \n" + << " \\ | `\"\"\"\"----\"`\\//`\"\"`/,===..'`````````/ ( |\n" + << " | | / `---` `===' / ) | \n" + << " / \\ / / ( | \n" + << " | '------. |'--------------------'| ) | \n" + << " \\ `-| | / | \n" + << " `--...,______| | ( | \n" + << " | | | | ) ,| \n" + << " | | | | ( /|| \n" + << " | | | | )/ `\" \n" + << " / \\ | | (/ \n" + << " .' /I\\ '.| | /) \n" + << " .-'_.'/ \\'. | | / \n" + << " ``` `\"\"\"` `| .-------------------.|| \n" + << " `\"` `\"` \n"; +} + void parse::die(const span& loc, string info) { err.err("parse", loc, info); } diff --git a/ast/nasal_new_parse.h b/ast/nasal_new_parse.h index d2bc242..acf8212 100644 --- a/ast/nasal_new_parse.h +++ b/ast/nasal_new_parse.h @@ -8,41 +8,6 @@ #include "nasal_ast.h" #include "nasal_err.h" -/* - _,,,_ - .' `'. - / ____ \ Fucking Nasal Parser - | .-'_ _\/ / - \_/ a a| / - (,` \ | .----. - | -' | /| '--. - \ '= / || ]| `-. - /`-.__.' || ]| ::| - .-'`-.__ \__ || ]| ::| - / `` `. || ]| ::| - _ | \ \ \ \| ]| .-' - / \| \ | \ L.__ .--'( - | |\ `. | \ ,---|_ \---------, - | | '. './\ \/ .--._|=- |_ /| - | \ '. `'.'. /`\/ .-' '. / | - | | `'. `;-:-;`)| |-./ | - | /_ `'--./_ ` )/'-------------')/) | - \ | `""""----"`\//`""`/,===..'`````````/ ( | - | | / `---` `===' / ) | - / \ / / ( | - | '------. |'--------------------'| ) | - \ `-| | / | - `--...,______| | ( | - | | | | ) ,| - | | | | ( /|| - | | | | )/ `" - / \ | | (/ - .' /I\ '.| | /) - .-'_.'/ \'. | | / - ``` `"""` `| .-------------------.|| - `"` `"` -*/ - class parse { #define thisspan (toks[ptr].loc) @@ -181,4 +146,5 @@ public: root({0, 0, 0, 0, ""}, ast_root), err(e) {} const error& compile(const lexer&); + void easter_egg() const; }; \ No newline at end of file diff --git a/makefile b/makefile index 73a9ba3..b141816 100644 --- a/makefile +++ b/makefile @@ -18,8 +18,9 @@ SRC=\ STD=c++14 -nasal:$(SRC) nasal_new_ast.o nasal_new_parse.o +nasal:$(SRC) nasal_new_ast.o nasal_new_parse.o ast_visitor.o $(CXX) -std=$(STD) -O3 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall + nasal.exe:$(SRC) $(CXX) -std=$(STD) -O3 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static @@ -29,8 +30,12 @@ nasal_new_ast.o: ast/nasal_new_ast.h ast/nasal_new_ast.cpp nasal.h nasal_new_parse.o: ast/nasal_new_parse.h ast/nasal_new_parse.cpp nasal.h ast/nasal_new_ast.h $(CXX) -std=$(STD) -c -O3 ast/nasal_new_ast.cpp -fno-exceptions -fPIC -o nasal_new_parse.o -I . +ast_visitor.o: ast/nasal_new_ast.h ast/ast_visitor.h ast/ast_visitor.cpp + $(CXX) -std=$(STD) -c -O3 ast/ast_visitor.cpp -fno-exceptions -fPIC -o ast_visitor.o -I . + stable-release:$(SRC) $(CXX) -std=$(STD) -O2 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall + stable-release-mingw:$(SRC) $(CXX) -std=$(STD) -O2 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static