From 3752bd8c070b16b6d1c7d4fa350f343c0c30b997 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Mon, 13 Jan 2025 22:35:56 +0800 Subject: [PATCH] :bug: fix formated output --- src/ast_format.cpp | 21 ++++++++++++++++++--- src/ast_format.h | 6 +++++- src/format.cpp | 19 ++++++++----------- src/nasal_ast.h | 8 +++++--- src/nasal_parse.cpp | 3 ++- src/optimizer.cpp | 4 ++-- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/ast_format.cpp b/src/ast_format.cpp index f50b822..a1f310e 100644 --- a/src/ast_format.cpp +++ b/src/ast_format.cpp @@ -19,7 +19,6 @@ bool ast_format::visit_use_stmt(use_stmt* node) { bool ast_format::visit_null_expr(null_expr* node) { dump_formating_node_info(node, "null expression"); - out << "null"; return true; } @@ -31,7 +30,7 @@ bool ast_format::visit_nil_expr(nil_expr* node) { bool ast_format::visit_number_literal(number_literal* node) { dump_formating_node_info(node, "number expression"); - out << node->get_number(); + out << node->get_raw_text(); return true; } @@ -81,7 +80,17 @@ bool ast_format::visit_hash_expr(hash_expr* node) { bool ast_format::visit_hash_pair(hash_pair* node) { dump_formating_node_info(node, "hash pair"); - out << node->get_name(); + bool contain_not_identifier = false; + for (auto c : node->get_name()) { + if (!(std::isdigit(c) || std::isalpha(c) || c == '_')) { + contain_not_identifier = true; + } + } + if (contain_not_identifier) { + out << "\"" << node->get_name() << "\""; + } else { + out << node->get_name(); + } if (node->get_value()) { out << " : "; node->get_value()->accept(this); @@ -99,6 +108,10 @@ bool ast_format::visit_function(function* node) { } } out << ") "; + if (node->get_code_block()->get_expressions().empty()) { + out << "{}"; + return true; + } node->get_code_block()->accept(this); return true; } @@ -138,11 +151,13 @@ bool ast_format::visit_parameter(parameter* node) { bool ast_format::visit_ternary_operator(ternary_operator* node) { dump_formating_node_info(node, "ternary operator"); + out << "("; node->get_condition()->accept(this); out << " ? "; node->get_left()->accept(this); out << " : "; node->get_right()->accept(this); + out << ")"; return true; } diff --git a/src/ast_format.h b/src/ast_format.h index 8f3b23c..e350188 100644 --- a/src/ast_format.h +++ b/src/ast_format.h @@ -44,7 +44,11 @@ private: case expr_type::ast_bool: case expr_type::ast_vec: case expr_type::ast_hash: - case expr_type::ast_call: return true; + case expr_type::ast_call: + case expr_type::ast_multi_assign: + case expr_type::ast_unary: + case expr_type::ast_binary: + case expr_type::ast_ternary: return true; case expr_type::ast_def: { auto dn = reinterpret_cast(n); if (dn->get_value() && diff --git a/src/format.cpp b/src/format.cpp index 755ab83..b4cdc8e 100644 --- a/src/format.cpp +++ b/src/format.cpp @@ -40,17 +40,14 @@ int main(i32 argc, const char* argv[]) { const auto config = nasal::cli::parse({argv+1, argv+argc}); // run directly or show help - if (argc == 2) { - if (config.has(nasal::cli::option::cli_help)) { - std::clog << nasal::cli::nasal_format_help; - } else if (config.has(nasal::cli::option::cli_version)) { - std::clog << nasal::cli::nasal_format_version; - } else if (config.input_file_path.size()) { - execute(config); - } else { - err(); - } - return 0; + if (config.has(nasal::cli::option::cli_help)) { + std::clog << nasal::cli::nasal_format_help; + } else if (config.has(nasal::cli::option::cli_version)) { + std::clog << nasal::cli::nasal_format_version; + } else if (config.input_file_path.size()) { + execute(config); + } else { + err(); } return 0; } \ No newline at end of file diff --git a/src/nasal_ast.h b/src/nasal_ast.h index 1f434a5..716b323 100644 --- a/src/nasal_ast.h +++ b/src/nasal_ast.h @@ -120,12 +120,14 @@ public: class number_literal: public expr { private: f64 number; + std::string raw_text; public: - number_literal(const span& location, const f64 num): - expr(location, expr_type::ast_num), number(num) {} + number_literal(const span& location, const f64 num, const std::string& raw): + expr(location, expr_type::ast_num), number(num), raw_text(raw) {} ~number_literal() override = default; - f64 get_number() const {return number;} + f64 get_number() const { return number; } + const std::string& get_raw_text() const { return raw_text; } void accept(ast_visitor*) override; }; diff --git a/src/nasal_parse.cpp b/src/nasal_parse.cpp index 0776fb4..d2913b5 100644 --- a/src/nasal_parse.cpp +++ b/src/nasal_parse.cpp @@ -235,7 +235,8 @@ nil_expr* parse::nil() { number_literal* parse::num() { auto node = new number_literal( toks[ptr].loc, - util::str_to_num(toks[ptr].str.c_str()) + util::str_to_num(toks[ptr].str.c_str()), + toks[ptr].str ); match(tok::tk_num); return node; diff --git a/src/optimizer.cpp b/src/optimizer.cpp index 073cf47..5b07489 100644 --- a/src/optimizer.cpp +++ b/src/optimizer.cpp @@ -44,7 +44,7 @@ void optimizer::const_number( return; } node->set_optimized_number( - new number_literal(node->get_location(), res) + new number_literal(node->get_location(), res, "") ); } @@ -64,7 +64,7 @@ void optimizer::const_number( return; } node->set_optimized_number( - new number_literal(node->get_location(), res) + new number_literal(node->get_location(), res, "") ); }