diff --git a/ast/ast_dumper.cpp b/ast/ast_dumper.cpp index 6c26c09..47adbd2 100644 --- a/ast/ast_dumper.cpp +++ b/ast/ast_dumper.cpp @@ -116,18 +116,14 @@ bool ast_dumper::visit_code_block(code_block* node) { bool ast_dumper::visit_parameter(parameter* node) { dump_indent(); - std::cout << "parameter"; + std::cout << "parameter " << node->get_parameter_name(); std::cout << format_location(node->get_location()); - push_indent(); - if (!node->get_default_value()) { - set_last(); - } - node->get_parameter_name()->accept(this); if (node->get_default_value()) { + push_indent(); set_last(); node->get_default_value()->accept(this); + pop_indent(); } - pop_indent(); return true; } diff --git a/ast/ast_visitor.cpp b/ast/ast_visitor.cpp index e641856..7284724 100644 --- a/ast/ast_visitor.cpp +++ b/ast/ast_visitor.cpp @@ -66,7 +66,6 @@ bool ast_visitor::visit_code_block(code_block* node) { } bool ast_visitor::visit_parameter(parameter* node) { - node->get_parameter_name()->accept(this); if (node->get_default_value()) { node->get_default_value()->accept(this); } diff --git a/ast/nasal_new_ast.cpp b/ast/nasal_new_ast.cpp index c6d7c16..4ad8131 100644 --- a/ast/nasal_new_ast.cpp +++ b/ast/nasal_new_ast.cpp @@ -83,9 +83,6 @@ void code_block::accept(ast_visitor* visitor) { } parameter::~parameter() { - if (name) { - delete name; - } if (default_value) { delete default_value; } diff --git a/ast/nasal_new_ast.h b/ast/nasal_new_ast.h index 58ec85d..a16d6a9 100644 --- a/ast/nasal_new_ast.h +++ b/ast/nasal_new_ast.h @@ -51,14 +51,15 @@ class multi_identifier; class code_block; class if_expr; -class ast_abstract_node { +class expr { protected: span nd_loc; expr_type nd_type; public: - ast_abstract_node(const span& location, expr_type node_type): + expr(const span& location, expr_type node_type): nd_loc(location), nd_type(node_type) {} + ~expr() = default; void set_begin(u32 line, u32 column) { nd_loc.begin_line = line; nd_loc.begin_column = column; @@ -69,15 +70,7 @@ public: nd_loc.end_line = location.end_line; nd_loc.end_column = location.end_column; } - virtual void accept(ast_visitor*) = 0; -}; - -class expr:public ast_abstract_node { -public: - expr(const span& location, expr_type node_type): - ast_abstract_node(location, node_type) {} - ~expr() = default; - void accept(ast_visitor*); + virtual void accept(ast_visitor*); }; class null_expr:public expr { @@ -227,19 +220,19 @@ public: private: param_type type; - identifier* name; + std::string name; expr* default_value; public: parameter(const span& location): expr(location, expr_type::ast_param), - name(nullptr), default_value(nullptr) {} + name(""), default_value(nullptr) {} ~parameter(); void set_parameter_type(param_type pt) {type = pt;} - void set_parameter_name(identifier* node) {name = node;} + void set_parameter_name(const std::string& pname) {name = pname;} void set_default_value(expr* node) {default_value = node;} param_type get_type() {return type;} - identifier* get_parameter_name() {return name;} + const std::string& get_parameter_name() const {return name;} expr* get_default_value() {return default_value;} void accept(ast_visitor*) override; }; diff --git a/ast/nasal_new_parse.cpp b/ast/nasal_new_parse.cpp index e175910..a306be5 100644 --- a/ast/nasal_new_parse.cpp +++ b/ast/nasal_new_parse.cpp @@ -284,16 +284,16 @@ void parse::params(function* func_node) { match(tok::lcurve); while(!lookahead(tok::rcurve)) { auto param = new parameter(toks[ptr].loc); - param->set_parameter_name(id()); - if (lookahead(tok::eq) || lookahead(tok::ellipsis)) { - if (lookahead(tok::eq)) { - match(tok::eq); - param->set_parameter_type(parameter::param_type::default_parameter); - param->set_default_value(calc()); - } else { - match(tok::ellipsis); - param->set_parameter_type(parameter::param_type::dynamic_parameter); - } + auto id_node = id(); + param->set_parameter_name(id_node->get_name()); + delete id_node; + if (lookahead(tok::eq)) { + match(tok::eq); + param->set_parameter_type(parameter::param_type::default_parameter); + param->set_default_value(calc()); + } else if (lookahead(tok::ellipsis)) { + match(tok::ellipsis); + param->set_parameter_type(parameter::param_type::dynamic_parameter); } else { param->set_parameter_type(parameter::param_type::normal_parameter); } diff --git a/stl/lib.nas b/stl/lib.nas index b7f734e..07e037f 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -222,8 +222,7 @@ var isfunc=func(f){ } var isghost=func(g){ - die("this runtime has no ghost object"); - return 0; + return typeof(f)=="obj"; } var ishash=func(h){