diff --git a/version3.0/nasal.ebnf b/version3.0/nasal.ebnf index 6379c1a..e93e53e 100644 --- a/version3.0/nasal.ebnf +++ b/version3.0/nasal.ebnf @@ -79,16 +79,14 @@ call_hash::= '.' id ; call_vector::= - '[' {(calculation | subvec) ','} ']' + '[' {(subvec) ','} ']' ; call_func::= '(' {calculation ','} ')' |'(' {hashmember ','} ')' ; subvec::= - calculation ':' calculation - |calculation ':' - |':' calculation + [calculation] ':' [calculation] ; definition::= var id '=' calculation diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index 2be5177..3840461 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -23,7 +23,7 @@ enum ast_node { ast_null=0,ast_root,ast_block, ast_nil,ast_number,ast_string,ast_identifier,ast_function,ast_hash,ast_vector, - ast_hashmember,ast_call,ast_call_hash,ast_call_vec,ast_call_func, + ast_hashmember,ast_call,ast_call_hash,ast_call_vec,ast_call_func,ast_subvec, ast_args,ast_default_arg,ast_dynamic_id, ast_and,ast_or, ast_equal,ast_add_equal,ast_sub_equal,ast_mult_equal,ast_div_equal,ast_link_equal, @@ -32,6 +32,7 @@ enum ast_node ast_unary_sub,ast_unary_not, ast_trinocular, ast_for,ast_forindex,ast_foreach,ast_while, + ast_if,ast_elsif,ast_else, ast_definition,ast_multi_assign,ast_calculation, ast_continue,ast_break,ast_return, }; diff --git a/version3.0/nasal_parse.h b/version3.0/nasal_parse.h index b95dd0a..2708fb8 100644 --- a/version3.0/nasal_parse.h +++ b/version3.0/nasal_parse.h @@ -11,6 +11,7 @@ private: std::vector tok_list; void reset(); bool check_function_end(nasal_ast&); + bool check_special_call(); nasal_ast nil_gen(); nasal_ast number_gen(); nasal_ast string_gen(); @@ -40,6 +41,9 @@ private: nasal_ast multi_scalar(); nasal_ast multi_assgin(); nasal_ast loop(); + nasal_ast while_loop(); + nasal_ast for_loop(); + nasal_ast forei_loop(); nasal_ast conditional(); nasal_ast continue_expr(); nasal_ast break_expr(); @@ -106,6 +110,23 @@ bool nasal_parse::check_function_end(nasal_ast& node) return false; } +bool nasal_parse::check_special_call() +{ + int tmp=ptr+1; + int curve_cnt=1; + bool ret=false; + while(tmp=tok_list_size || tok_list[ptr].type!=tok_right_bracket) + { + ++error; + error_info(node.get_line(),lack_comma); + break; + } + } return node; } nasal_ast nasal_parse::call_func() @@ -624,11 +664,50 @@ nasal_ast nasal_parse::call_func() nasal_ast node; node.set_line(tok_list[ptr].line); node.set_type(ast_call_func); + bool special_call=check_special_call(); + ++ptr; + while(ptr=tok_list_size || tok_list[ptr].type!=tok_comma || tok_list[ptr].type!=tok_right_curve) + { + ++error; + error_info(node.get_line(),lack_comma); + } + } return node; } nasal_ast nasal_parse::subvec() { nasal_ast node; + if(tok_list[ptr].type==tok_colon) + { + --ptr; + node=nil_gen(); + } + else node=calculation(); + ++ptr; + if(ptr