From 7e12bb4e740ea11817d7c323677d1418874ee452 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Tue, 9 Jun 2020 10:24:11 -0700 Subject: [PATCH] update --- version3.0/nasal_ast.h | 4 +- version3.0/nasal_enum.h | 38 ++++++- version3.0/nasal_parse.h | 211 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 248 insertions(+), 5 deletions(-) diff --git a/version3.0/nasal_ast.h b/version3.0/nasal_ast.h index c5c5ff6..7787fa2 100644 --- a/version3.0/nasal_ast.h +++ b/version3.0/nasal_ast.h @@ -16,7 +16,7 @@ public: void set_line(int); void set_type(int); void set_str(std::string&); - void add_child(nasal_ast&); + void add_child(nasal_ast); int get_line(); int get_type(); std::string get_str(); @@ -74,7 +74,7 @@ void nasal_ast::set_str(std::string& s) return; } -void nasal_ast::add_child(nasal_ast& ast) +void nasal_ast::add_child(nasal_ast ast) { children.push_back(ast); return; diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index 513d7f1..b5eeb23 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -21,9 +21,43 @@ enum token_type enum ast_node { ast_null=0, - ast_nil,ast_number,ast_string,ast_identifier, + ast_nil,ast_number,ast_string,ast_identifier,ast_function,ast_hash,ast_vector, + ast_hashmember, + ast_args, ast_for,ast_forindex,ast_foreach,ast_while, - ast_definition,ast_assignment + ast_definition,ast_assignment,ast_calculation }; +enum parse_error +{ + unknown, + lack_id, + lack_left_curve, + lack_left_bracket, + lack_left_brace, + lack_comma, + lack_colon, + lack_scalar, +}; + +void error_info(int line,int error_type) +{ + std::string info=">> [parse] error: line "; + std::string detail; + std::cout<=tok_list_size) break; + if(ptr=tok_list_size) break; + if(ptr=tok_list_size || tok_list[ptr].type!=tok_colon) + { + error_info(ptr>=tok_list_size?node.get_line():tok_list[ptr].line,lack_colon); + return node; + } + ++ptr; + if(ptr=tok_list_size) + { + error_info(node.get_line(),lack_left_curve); + return node; + } + if(tok_list[ptr].type==tok_left_curve) + { + node.add_child(args_list_gen()); + ++ptr; + } + if(ptr>=tok_list_size) + { + error_info(node.get_line(),lack_left_brace); + return node; + } + node.add_child(exprs_gen()); + return node; +} +nasal_ast nasal_parse::args_list_gen() +{ + nasal_ast node; + node.set_line(tok_list[ptr].line); + node.set_type(ast_args); + ++ptr; + while(ptr