diff --git a/version0.11/bnf.bison b/version0.11/bnf.bison index b4c9ad0..59702f1 100644 --- a/version0.11/bnf.bison +++ b/version0.11/bnf.bison @@ -95,8 +95,10 @@ call_list call_hash :id.id |id.call + |id.scalar |call.id |call.call + |call.scalar ; call_function :id() @@ -107,30 +109,142 @@ call_function |id(hash) |id(function) |id(datas) + calculation - :id operator id - |id operator scalar - |id operator call - |scalar operator id - |scalar operator scalar - |scalar operator call - |call operator id - |call operator scalar - |call operator call + :id two_operator id + |id two_operator scalar + |id two_operator call + |scalar two_operator id + |scalar two_operator scalar + |scalar two_operator call + |call two_operator id + |call two_operator scalar + |call two_operator call |(id) |(scalar) |(call) |! id |! scalar |! call - |+-id - |+-scalar - |+-call + |__add0 -id + |__add0 -scalar + |__add0 -call + |__add0 +id + |__add0 +scalar + |__add0 +call + ; +two_operator + :+ + |- + |* + |/ + |~ + |== + |> + |>= + |< + |<= + |!= + |and + |or + ; +assignment_operator + :+= + |-= + |*= + |/= + |~= ; +function + :func{} + |func{statement} + |func{statements} + |func(){} + |func(){statement} + |func(){statements} + |func(id){} + |func(id){statement} + |func(id){statements} + |func(scalar){} + |func(scalar){statement} + |func(scalar){statements} + |func(call){} + |func(call){statement} + |func(call){statements} + |func(list){} + |func(list){statement} + |func(list){statements} + |func(hash){} + |func(hash){statement} + |func(hash){statements} + |func(function){} + |func(function){statement} + |func(function){statements} + |func(dynamic_id){} + |func(dynamic_id){statement} + |func(dynamic_id){statements} + |func(datas){} + |func(datas){statement} + |func(datas){statements} +choose + :if(id){} + |if(scalar){} + |if(call){statement} + |if(id){statement} + |if(scalar){statement} + |if(call){statement} + |if(id){statements} + |if(scalar){statements} + |if(call){statements} + |else if(id){} + |else if(scalar){} + |else if(call){statement} + |else if(id){statement} + |else if(scalar){statement} + |else if(call){statement} + |else if(id){statements} + |else if(scalar){statements} + |else if(call){statements} + |elsif(id){} + |elsif(scalar){} + |elsif(call){statement} + |elsif(id){statement} + |elsif(scalar){statement} + |elsif(call){statement} + |elsif(id){statements} + |elsif(scalar){statements} + |elsif(call){statements} + |else{} + |else{statement} + |else{statements} - +loop + :while(id){} + |while(scalar){} + |while(call){} + |while(id){statement} + |while(scalar){statement} + |while(call){statement} + |while(id){statements} + |while(scalar){statements} + |while(call){statements} + |forindex|foreach(statement id){} + |forindex|foreach(statement scalar){} + |forindex|foreach(statement call){} + |forindex|foreach(statement list){} + |forindex|foreach(statement id){statement} + |forindex|foreach(statement scalar){statement} + |forindex|foreach(statement call){statement} + |forindex|foreach(statement list){statement} + |forindex|foreach(statement id){statements} + |forindex|foreach(statement scalar){statements} + |forindex|foreach(statement call){statements} + |forindex|foreach(statement list){statements} + |for(statement pre_assignment){} + |for(statement pre_assignment){statement} + |for(statement pre_assignment){statements} definition :var id = id; @@ -138,31 +252,44 @@ definition |var id = call; |var id = list; |var id = hash; - |var id = function + |var id = function; |var id; -assignment - :id = id; - |id = scalar; - |id = call; +pre_assignment + :id = id + |id = scalar + |id = call |id = function - |id = list; - |id = hash; - |call = id; - |call = scalar; - |call = call; + |id = list + |id = hash + |call = id + |call = scalar + |call = call |call = function - |call = list; - |call = hash; + |call = list + |call = hash + |id assignment_operator id + |id assignment_operator scalar + |id assignment_operator call + |call assignment_operator id + |call assignment_operator scalar + |call assignment_operator call ; -statement - :return id; +assignment + :pre_assignment ; + ; +return_scalar + :return id; |return scalar; |return call; |return function; |return list; |return hash; - |continue; + |return; + ; +statement + :continue; |break; + |return_scalar |definition |assignment |loop diff --git a/version0.11/nasal_parser.h b/version0.11/nasal_parser.h index 3f658ca..b00576f 100644 --- a/version0.11/nasal_parser.h +++ b/version0.11/nasal_parser.h @@ -42,8 +42,8 @@ enum token_type __call_list, __call_hash, __call, - __definition, - __assignment,__pre_assignment, + __definition,__return_scalar, + __assignment,__pre_assignment,__assignment_operator, __calculation, __loop, __choose,__if_choose,__elsif_choose,__else_choose, @@ -60,6 +60,24 @@ struct cmp_seq cmp_seq par[]= { {{__program,__statement}, __program}, + {{__add_operator},__two_operator}, + {{__sub_operator},__two_operator}, + {{__mul_operator},__two_operator}, + {{__div_operator},__two_operator}, + {{__link_operator},__two_operator}, + {{__and_operator},__two_operator}, + {{__or_operator},__two_operator}, + {{__cmp_equal},__two_operator}, + {{__cmp_not_equal},__two_operator}, + {{__cmp_less},__two_operator}, + {{__cmp_less_or_equal},__two_operator}, + {{__cmp_more},__two_operator}, + {{__cmp_more_or_equal},__two_operator}, + {{__add_equal},__assignment_operator}, + {{__sub_equal},__assignment_operator}, + {{__mul_equal},__assignment_operator}, + {{__div_equal},__assignment_operator}, + {{__link_equal},__assignment_operator}, {{__number},__scalar}, {{__string},__scalar}, @@ -121,14 +139,12 @@ cmp_seq par[]= {{__hash_member,__comma,__hash_member},__hash_member_list}, {{__hash_member_list,__comma,__hash_member},__hash_member_list}, - {{__right_bracket,__left_bracket},__list}, {{__right_bracket,__id,__left_bracket},__list}, {{__right_bracket,__scalar,__left_bracket},__list}, {{__right_bracket,__call,__left_bracket},__list}, {{__right_bracket,__function,__left_bracket},__list}, {{__right_bracket,__data_list,__left_bracket},__list}, - {{__right_brace,__left_brace},__hash}, {{__right_brace,__hash_member,__left_brace},__hash}, {{__right_brace,__hash_member_list,__left_brace},__hash}, @@ -145,6 +161,8 @@ cmp_seq par[]= {{__id,__dot,__id},__call_hash}, {{__id,__dot,__call},__call_hash}, + {{__scalar,__dot,__id},__call_hash}, + {{__scalar,__dot,__call},__call_hash}, {{__call,__dot,__id},__call_hash}, {{__call,__dot,__call},__call_hash}, @@ -156,6 +174,155 @@ cmp_seq par[]= {{__right_curve,__hash,__left_curve,__id},__call_function}, {{__right_curve,__function,__left_curve,__id},__call_function}, {{__right_curve,__data_list,__left_curve,__id},__call_function}, + + {{__id,__two_operator,__id},__calculation}, + {{__id,__two_operator,__scalar},__calculation}, + {{__id,__two_operator,__call},__calculation}, + {{__scalar,__two_operator,__id},__calculation}, + {{__scalar,__two_operator,__scalar},__calculation}, + {{__scalar,__two_operator,__call},__calculation}, + {{__call,__two_operator,__id},__calculation}, + {{__call,__two_operator,__scalar},__calculation}, + {{__call,__two_operator,__call},__calculation}, + {{__id,__nor_operator},__calculation}, + {{__scalar,__nor_operator},__calculation}, + {{__call,__nor_operator},__calculation}, + {{__right_curve,__id,__left_curve},__calculation}, + {{__right_curve,__scalar,__left_curve},__calculation}, + {{__right_curve,__call,__left_curve},__calculation}, + + {{__semi,__id,__return},__return_scalar}, + {{__semi,__scalar,__return},__return_scalar}, + {{__semi,__call,__return},__return_scalar}, + {{__semi,__function,__return},__return_scalar}, + {{__semi,__list,__return},__return_scalar}, + {{__semi,__hash,__return},__return_scalar}, + {{__semi,__return},__return_scalar}, + + {{__right_brace,__left_brace,__func},__function}, + {{__right_brace,__statement,__left_brace,__func},__function}, + + {{__right_brace,__left_brace,__right_curve,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__left_curve,__func},__function}, + + {{__right_brace,__left_brace,__right_curve,__id,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__call,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__list,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__list,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__hash,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__hash,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__function,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__function,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__dynamic_id,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__dynamic_id,__left_curve,__func},__function}, + {{__right_brace,__left_brace,__right_curve,__data_list,__left_curve,__func},__function}, + {{__right_brace,__statement,__left_brace,__right_curve,__data_list,__left_curve,__func},__function}, + + {{__right_brace,__left_brace,__right_curve,__id,__left_curve,__if},__choose}, + {{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__if},__choose}, + {{__right_brace,__left_brace,__right_curve,__call,__left_curve,__if},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__if},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__if},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__if},__choose}, + {{__right_brace,__left_brace,__right_curve,__id,__left_curve,__if,__else},__choose}, + {{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__if,__else},__choose}, + {{__right_brace,__left_brace,__right_curve,__call,__left_curve,__if,__else},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__if,__else},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__if,__else},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__if,__else},__choose}, + {{__right_brace,__left_brace,__right_curve,__id,__left_curve,__elsif},__choose}, + {{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__elsif},__choose}, + {{__right_brace,__left_brace,__right_curve,__call,__left_curve,__elsif},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__elsif},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__elsif},__choose}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__elsif},__choose}, + {{__right_brace,__left_brace,__else},__choose}, + {{__right_brace,__statement,__left_brace,__else},__choose}, + + {{__semi,__id,__equal,__id,__var},__definition}, + {{__semi,__right_bracket,__left_bracket,__equal,__id,__var},__definition}, + {{__semi,__right_brace,__left_brace,__equal,__id,__var},__definition}, + {{__semi,__scalar,__equal,__id,__var},__definition}, + {{__semi,__call,__equal,__id,__var},__definition}, + {{__semi,__function,__equal,__id,__var},__definition}, + {{__semi,__list,__equal,__id,__var},__definition}, + {{__semi,__hash,__equal,__id,__var},__definition}, + {{__semi,__id,__var},__definition}, + + {{__id,__equal,__id},__pre_assignment}, + {{__scalar,__equal,__id},__pre_assignment}, + {{__call,__equal,__id},__pre_assignment}, + {{__function,__equal,__id},__pre_assignment}, + {{__list,__equal,__id},__pre_assignment}, + {{__hash,__equal,__id},__pre_assignment}, + {{__id,__equal,__call},__pre_assignment}, + {{__scalar,__equal,__call},__pre_assignment}, + {{__call,__equal,__call},__pre_assignment}, + {{__function,__equal,__call},__pre_assignment}, + {{__list,__equal,__call},__pre_assignment}, + {{__hash,__equal,__call},__pre_assignment}, + {{__id,__assignment_operator,__id},__pre_assignment}, + {{__scalar,__assignment_operator,__id},__pre_assignment}, + {{__call,__assignment_operator,__id},__pre_assignment}, + {{__id,__assignment_operator,__call},__pre_assignment}, + {{__scalar,__assignment_operator,__call},__pre_assignment}, + {{__call,__assignment_operator,__call},__pre_assignment}, + {{__semi,__pre_assignment},__assignment}, + + {{__right_brace,__left_brace,__right_curve,__id,__left_curve,__while},__loop}, + {{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__while},__loop}, + {{__right_brace,__left_brace,__right_curve,__call,__left_curve,__while},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__while},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__while},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__while},__loop}, + {{__right_brace,__left_brace,__right_curve,__id,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__left_brace,__right_curve,__call,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__left_brace,__right_curve,__list,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__list,__statement,__left_curve,__forindex},__loop}, + {{__right_brace,__left_brace,__right_curve,__id,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__left_brace,__right_curve,__call,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__left_brace,__right_curve,__list,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__id,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__call,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__list,__statement,__left_curve,__foreach},__loop}, + {{__right_brace,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop}, + {{__right_brace,__statement,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop}, + + {{__return_scalar},__statement}, + {{__semi,__continue},__statement}, + {{__semi,__break},__statement}, + + {{__semi,__id,__semi},__semi}, + {{__semi,__call,__semi},__semi}, + {{__semi,__scalar,__semi},__semi}, + {{__semi,__list,__semi},__semi}, + {{__semi,__hash,__semi},__semi}, + {{__semi,__id,__right_brace},__right_brace}, + {{__semi,__call,__right_brace},__right_brace}, + {{__semi,__scalar,__right_brace},__right_brace}, + {{__semi,__list,__right_brace},__right_brace}, + {{__semi,__hash,__right_brace},__right_brace}, + {{__semi,__id,__left_brace},__left_brace}, + {{__semi,__call,__left_brace},__left_brace}, + {{__semi,__scalar,__left_brace},__left_brace}, + {{__semi,__list,__left_brace},__left_brace}, + {{__semi,__hash,__left_brace},__left_brace}, + {{__semi,__id,__left_curve},__left_curve}, + {{__semi,__call,__left_curve},__left_curve}, + {{__semi,__scalar,__left_curve},__left_curve}, + {{__semi,__list,__left_curve},__left_curve}, + {{__semi,__hash,__left_curve},__left_curve}, + + {{__loop},__statement}, + {{__choose},__statement}, + {{__definition},__statement}, + {{__assignment},__statement}, }; int num_of_par=sizeof(par)/sizeof(cmp_seq); @@ -342,10 +509,10 @@ void print_token(int type) context="call_hash"; break; case __definition: - context="definition"; + context="definition;"; break; case __assignment: - context="assignment"; + context="assignment;"; break; case __calculation: context="calc"; @@ -384,6 +551,12 @@ void print_token(int type) case __two_operator: context="operator"; break; + case __assignment_operator: + context="operator"; + break; + case __return_scalar: + context="return_scl;"; + break; default: context="unknown_type"; break; @@ -410,6 +583,9 @@ class PDA while(!comp_stack.empty()) comp_stack.pop(); main_stack.push(__stack_end); + main_stack.push(__var); + main_stack.push(__id); + main_stack.push(__semi); comp_stack.push(__stack_end); comp_stack.push(__program); } @@ -504,17 +680,21 @@ class PDA { comp_stack.push(main_stack.top()); main_stack.pop(); - // if((comp_stack.top()==__left_bracket) && (!main_stack.empty()) && (main_stack.top()==__id)) - // { - // comp_stack.push(main_stack.top()); - // main_stack.pop(); - // } - if((comp_stack.top()==__left_curve) && (!main_stack.empty()) && ((main_stack.top()==__id) || (main_stack.top()==__if) || (main_stack.top()==__elsif) || (main_stack.top()==__while) || (main_stack.top()==__func))) + if((comp_stack.top()==__left_curve) && ((main_stack.top()==__id) || (main_stack.top()==__if) || (main_stack.top()==__elsif) || (main_stack.top()==__while) || (main_stack.top()==__func))) { comp_stack.push(main_stack.top()); main_stack.pop(); } - else if((comp_stack.top()==__id) && (!main_stack.top()) && (main_stack.top()==__var)) + else if((comp_stack.top()==__id) && (main_stack.top()==__var)) + { + comp_stack.push(main_stack.top()); + main_stack.pop(); + } + else if(((comp_stack.top()==__sub_operator) || (comp_stack.top()==__add_operator)) && (main_stack.top()!=__id) && (main_stack.top()!=__right_curve) && (main_stack.top()!=__right_bracket)) + { + main_stack.push(__number); + } + if((comp_stack.top()==__if) && (main_stack.top()==__else)) { comp_stack.push(main_stack.top()); main_stack.pop();