diff --git a/version3.0/main.cpp b/version3.0/main.cpp index ddd1392..a351861 100644 --- a/version3.0/main.cpp +++ b/version3.0/main.cpp @@ -45,6 +45,7 @@ void par_func() if(!lexer.get_error()) { parse.set_toklist(lexer.get_token_list()); + parse.main_process(); if(parse.get_error()) std::cout<<">> [parse] error occurred,stop.\n"; } else std::cout<<">> [lexer] error occurred,stop.\n"; diff --git a/version3.0/nasal.ebnf b/version3.0/nasal.ebnf index 7de9ee0..d867bcc 100644 --- a/version3.0/nasal.ebnf +++ b/version3.0/nasal.ebnf @@ -26,16 +26,19 @@ argument_list::= '(' [{id ','} ([id '...']|{id '=' calculation ','})] ')' ; expressions::= - '{' {definition|assignment|calculation|loop|conditional} '}' + '{' {definition|assignment|calculation|loop|conditional|return_expr|continue_expr|break_expr} '}' |definition ';' |multi_assignment ';' |calculation ';' |loop |conditional + |return_expr + |continue_expr + |break_expr ; calculation::= '(' calculation ')' - |scalar_gen + |scalar |trinocular |and_expr |calculation ('=' | '+=' | '-=' | '*=' | '/=' | '~=') calculation @@ -61,7 +64,7 @@ multive_expr::= unary::= ('-'|'!') calculation ; -scalar_gen::= +scalar::= function_call |identifier_call |vector_call @@ -115,4 +118,13 @@ conditional::= if '(' calculation ')' expressions {elsif '(' calculation ')' expressions} [else expressions] +; +continue_expr::= + continue +; +break_expr::= + break +; +return_expr::= + return [calculation] ; \ No newline at end of file diff --git a/version3.0/nasal_ast.h b/version3.0/nasal_ast.h index 7787fa2..84f64bb 100644 --- a/version3.0/nasal_ast.h +++ b/version3.0/nasal_ast.h @@ -12,6 +12,7 @@ public: nasal_ast(); nasal_ast(const nasal_ast&); ~nasal_ast(); + nasal_ast& operator=(const nasal_ast&); void clear(); void set_line(int); void set_type(int); @@ -47,6 +48,15 @@ nasal_ast::~nasal_ast() return; } +nasal_ast& nasal_ast::operator=(const nasal_ast& tmp) +{ + this->line=tmp.line; + this->type=tmp.type; + this->str=tmp.str; + this->children=tmp.children; + return *this; +} + void nasal_ast::clear() { this->line=0; diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index b5eeb23..4b3e97e 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -20,21 +20,24 @@ enum token_type enum ast_node { - ast_null=0, + ast_null=0,ast_root,ast_block, 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_calculation + ast_definition,ast_assignment,ast_calculation, + ast_continue,ast_break,ast_return, }; enum parse_error { unknown, + error_token, lack_id, lack_left_curve, lack_left_bracket, lack_left_brace, + lack_semi, lack_comma, lack_colon, lack_scalar, @@ -47,14 +50,16 @@ void error_info(int line,int error_type) std::cout<& lex_token) void nasal_parse::main_process() { this->reset(); + root.set_line(1); + root.set_type(ast_root); while(ptr> [parse] complete generation. "<=tok_list_size || tok_list[ptr].type!=tok_colon) { error_info(ptr>=tok_list_size?node.get_line():tok_list[ptr].line,lack_colon); + ++error; return node; } ++ptr; if(ptr=tok_list_size) { error_info(node.get_line(),lack_left_curve); + ++error; return node; } if(tok_list[ptr].type==tok_left_curve) { node.add_child(args_list_gen()); + ++error; ++ptr; } if(ptr>=tok_list_size) { error_info(node.get_line(),lack_left_brace); + ++error; return node; } node.add_child(exprs_gen()); @@ -225,11 +262,43 @@ nasal_ast nasal_parse::args_list_gen() nasal_ast nasal_parse::exprs_gen() { nasal_ast node; + node.set_line(tok_list[ptr].line); + node.set_type(ast_block); + while(ptr