From d9049c5ef68c5524896a73bab476099ce3e12725 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 17 Jun 2020 01:18:04 -0700 Subject: [PATCH] update --- version3.0/nasal.ebnf | 41 ++++------ version3.0/nasal_enum.h | 31 +++---- version3.0/nasal_parse.h | 170 ++++++++++++++++++++++++++++----------- 3 files changed, 155 insertions(+), 87 deletions(-) diff --git a/version3.0/nasal.ebnf b/version3.0/nasal.ebnf index d5d0aa2..6379c1a 100644 --- a/version3.0/nasal.ebnf +++ b/version3.0/nasal.ebnf @@ -39,14 +39,10 @@ expressions::= '{' {expr} '}' ; calculation::= - |scalar - |trinocular + calculation '?' calculation ':' calculation |or_expr |calculation ('=' | '+=' | '-=' | '*=' | '/=' | '~=') calculation ; -trinocular::= - calculation '?' calculation ':' calculation -; or_expr::= and_expr or and_expr ; @@ -66,30 +62,27 @@ unary::= ('-'|'!') scalar ; scalar::= - function_call - |identifier_call - |vector_call - |hash_call + function {call_scalar} + |identifier {call_scalar} + |vector {call_scalar} + |hash {call_scalar} |number |string - |'(' calculation ')' -; -function_call::= - function {call_scalar} -; -identifier_call::= - id {call_scalar} -; -vector_call::= - vector {call_scalar} -; -hash_call::= - hash {call_scalar} + |'(' calculation ')' {call_scalar} ; call_scalar::= + call_hash + |call_vector + |call_func +; +call_hash::= '.' id - |'[' {(calculation | subvec) ','} ']' - |'(' {calculation ','} ')' +; +call_vector::= + '[' {(calculation | subvec) ','} ']' +; +call_func::= + '(' {calculation ','} ')' |'(' {hashmember ','} ')' ; subvec::= diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index ed4fec5..2be5177 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -23,13 +23,14 @@ 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_hashmember,ast_call,ast_call_hash,ast_call_vec,ast_call_func, 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, ast_cmp_equal,ast_cmp_not_equal,ast_less_than,ast_less_equal,ast_greater_than,ast_greater_equal, ast_add,ast_sub,ast_mult,ast_div,ast_link, ast_unary_sub,ast_unary_not, + ast_trinocular, ast_for,ast_forindex,ast_foreach,ast_while, ast_definition,ast_multi_assign,ast_calculation, ast_continue,ast_break,ast_return, @@ -39,7 +40,6 @@ enum parse_error { unknown, error_token, - lack_id, lack_left_curve, lack_right_curve, lack_left_bracket, @@ -50,6 +50,7 @@ enum parse_error lack_colon, lack_scalar, lack_identifier, + lack_calculation, }; void error_info(int line,int error_type,std::string error_str="") @@ -59,19 +60,19 @@ void error_info(int line,int error_type,std::string error_str="") std::cout<=tok_list_size || tok_list[ptr].type!=tok_colon) + { + ++error; + error_info(tmp.get_line(),lack_colon); + return node; + } + ++ptr; + if(ptr=tok_list_size || tok_list[ptr].type!=tok_right_curve) { @@ -525,31 +577,53 @@ nasal_ast nasal_parse::scalar() error_info(curve_line,lack_right_curve); } } - return node; -} -nasal_ast nasal_parse::func_call() -{ - nasal_ast node; - return node; -} -nasal_ast nasal_parse::id_call() -{ - nasal_ast node; - return node; -} -nasal_ast nasal_parse::vector_call() -{ - nasal_ast node; - return node; -} -nasal_ast nasal_parse::hash_call() -{ - nasal_ast node; + ++ptr; + if(ptr