|
|
| version 1.177, 2002/01/31 16:39:01 | version 1.186.2.1, 2002/05/07 07:23:10 |
|---|---|
| Line 107 static int yylex(YYSTYPE *lvalp, void *p | Line 107 static int yylex(YYSTYPE *lvalp, void *p |
| all: | all: |
| one_big_piece { | one_big_piece { |
| Method& method=*NEW Method(POOL, | Method& method=*NEW Method(POOL, |
| *main_method_name, | PC.request->main_method_name, |
| Method::CT_ANY, | Method::CT_ANY, |
| 0, 0, /*min, max numbered_params_count*/ | 0, 0, /*min, max numbered_params_count*/ |
| 0/*param_names*/, 0/*local_names*/, | 0/*param_names*/, 0/*local_names*/, |
| $1/*parser_code*/, 0/*native_code*/); | $1/*parser_code*/, 0/*native_code*/); |
| PC.cclass->add_method(*main_method_name, method); | PC.cclass->add_method(PC.request->main_method_name, method); |
| } | } |
| | methods; | | methods; |
| Line 239 action: get | put | call; | Line 239 action: get | put | call; |
| /* get */ | /* get */ |
| get: get_value { | get: get_value { |
| $$=$1; /* stack: resulting value */ | $$=$1; /* stack: resulting value */ |
| O($$, OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */ | changetail_or_append($$, |
| OP_GET_ELEMENT, false, /*->*/OP_GET_ELEMENT__WRITE, | |
| /*or */OP_WRITE_VALUE | |
| ); /* value=pop; wcontext.write(value) */ | |
| }; | }; |
| get_value: '$' get_name_value { $$=$2 }; | get_value: '$' get_name_value { $$=$2 }; |
| get_name_value: name_without_curly_rdive EON | name_in_curly_rdive; | get_name_value: name_without_curly_rdive EON | name_in_curly_rdive; |
| Line 252 name_without_curly_rdive_read: name_with | Line 255 name_without_curly_rdive_read: name_with |
| $$=N(POOL); | $$=N(POOL); |
| Array *diving_code=$1; | Array *diving_code=$1; |
| const String *first_name=LA2S(diving_code); | const String *first_name=LA2S(diving_code); |
| // self.xxx... -> xxx... | |
| // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+... | |
| if(first_name && *first_name==SELF_ELEMENT_NAME) { | if(first_name && *first_name==SELF_ELEMENT_NAME) { |
| O($$, OP_WITH_SELF); /* stack: starting context */ | O($$, OP_WITH_SELF); /* stack: starting context */ |
| P($$, diving_code, | P($$, diving_code, |
| /* skip over... */ | /* skip over... */ |
| diving_code->size()>2?3/*OP_+string+get_element*/:2/*OP_+string*/); | diving_code->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/); |
| } else { | } else { |
| O($$, OP_WITH_READ); /* stack: starting context */ | O($$, OP_WITH_READ); /* stack: starting context */ |
| // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR | |
| // OP_VALUE+string+OP_GET_ELEMENT. -> OP_VALUE+string+OP_GET_ELEMENT_OR_OPERATOR. | |
| if(PC.in_call_value && diving_code->size()==3) | |
| diving_code->put_int(2, OP_GET_ELEMENT_OR_OPERATOR); | |
| P($$, diving_code); | P($$, diving_code); |
| } | } |
| /* diving code; stack: current context */ | /* diving code; stack: current context */ |
| Line 280 name_expr_wdive_root: name_expr_dive_cod | Line 290 name_expr_wdive_root: name_expr_dive_cod |
| $$=N(POOL); | $$=N(POOL); |
| Array *diving_code=$1; | Array *diving_code=$1; |
| const String *first_name=LA2S(diving_code); | const String *first_name=LA2S(diving_code); |
| // $self.xxx... -> $xxx... | |
| // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+... | |
| if(first_name && *first_name==SELF_ELEMENT_NAME) { | if(first_name && *first_name==SELF_ELEMENT_NAME) { |
| O($$, OP_WITH_SELF); /* stack: starting context */ | O($$, OP_WITH_SELF); /* stack: starting context */ |
| P($$, diving_code, | P($$, diving_code, |
| /* skip over... */ | /* skip over... */ |
| diving_code->size()>2?3/*OP_+string+get_element*/:2/*OP_+string*/); | diving_code->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/); |
| } else { | } else { |
| O($$, OP_WITH_ROOT); /* stack: starting context */ | O($$, OP_WITH_ROOT); /* stack: starting context */ |
| P($$, diving_code); | P($$, diving_code); |
| Line 310 construct_square: '[' any_constructor_co | Line 322 construct_square: '[' any_constructor_co |
| } | } |
| ; | ; |
| construct_round: '(' expr_value ')' { | construct_round: '(' expr_value ')' { |
| $$=N(POOL); | |
| O($$, OP_PREPARE_TO_EXPRESSION); | |
| // stack: context, name | // stack: context, name |
| $$=$2; // stack: context, name, value | P($$, $2); // stack: context, name, value |
| O($$, OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */ | O($$, OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */ |
| } | } |
| ; | ; |
| construct_curly: '{' maybe_codes '}' { | construct_curly: '{' maybe_codes '}' { |
| // stack: context, name | // stack: context, name |
| $$=N(POOL); | $$=N(POOL); |
| CCA($$, $2); /* code=pop; name=pop; context=pop; construct(context,name,junction(code)) */ | OA($$, OP_CURLY_CODE__CONSTRUCT, $2); /* code=pop; name=pop; context=pop; construct(context,name,junction(code)) */ |
| }; | }; |
| any_constructor_code_value: | any_constructor_code_value: |
| Line 328 any_constructor_code_value: | Line 342 any_constructor_code_value: |
| ; | ; |
| constructor_code_value: constructor_code { | constructor_code_value: constructor_code { |
| $$=N(POOL); | $$=N(POOL); |
| O($$, OP_CREATE_EWPOOL); /* stack: empty write context */ | OA($$, OP_OBJECT_POOL, $1); /* stack: empty write context */ |
| P($$, $1); /* some code that writes to that context */ | /* some code that writes to that context */ |
| O($$, OP_REDUCE_EWPOOL); /* context=pop; stack: context.value() */ | /* context=pop; stack: context.value() */ |
| }; | }; |
| constructor_code: codes__excluding_sole_str_literal; | constructor_code: codes__excluding_sole_str_literal; |
| codes__excluding_sole_str_literal: action | code codes { $$=$1; P($$, $2) }; | codes__excluding_sole_str_literal: action | code codes { $$=$1; P($$, $2) }; |
| Line 339 codes__excluding_sole_str_literal: actio | Line 353 codes__excluding_sole_str_literal: actio |
| call: call_value { | call: call_value { |
| $$=$1; /* stack: value */ | $$=$1; /* stack: value */ |
| O($$, OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */ | changetail_or_append($$, |
| OP_CALL, true, /*->*/ OP_CALL__WRITE, | |
| /*or */OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */ | |
| }; | }; |
| call_value: '^' { | call_value: '^' { |
| PC.object_constructor_allowed=true; | PC.in_call_value=true; |
| push_OCA(PC, true); | |
| } | } |
| call_name { | call_name { |
| PC.object_constructor_allowed=false; | PC.in_call_value=false; |
| pop_OCA(PC); | |
| } | } |
| store_params EON { /* ^field.$method{vasya} */ | store_params EON { /* ^field.$method{vasya} */ |
| $$=$3; /* with_xxx,diving code; stack: context,method_junction */ | $$=$3; /* with_xxx,diving code; stack: context,method_junction */ |
| O($$, OP_GET_METHOD_FRAME); /* stack: context,method_frame */ | |
| YYSTYPE params_code=$5; | YYSTYPE params_code=$5; |
| if(params_code->size()==3) // probably [] case. [OP_VALUE + Void + STORE_PARAM] | if(params_code->size()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM] |
| if(Value *value=LA2V(params_code)) // it is OP_VALUE + value? | if(Value *value=LA2V(params_code)) // it is OP_VALUE + value? |
| if(!value->is_defined()) // value is VVoid? | if(!value->is_defined()) // value is VVoid? |
| params_code=0; // ^zzz[] case. don't append lone empty param. | params_code=0; // ^zzz[] case. don't append lone empty param. |
| if(params_code) | } |
| P($$, params_code); // filling method_frame.store_params | /* stack: context, method_junction */ |
| O($$, OP_CALL); // method_frame=pop; ncontext=pop; call(ncontext,method_frame) stack: value | OA($$, OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value |
| }; | }; |
| call_name: name_without_curly_rdive; | call_name: name_without_curly_rdive; |
| Line 392 store_code_param_part: code_param_value | Line 405 store_code_param_part: code_param_value |
| }; | }; |
| store_expr_param_part: write_expr_value { | store_expr_param_part: write_expr_value { |
| $$=N(POOL); | $$=N(POOL); |
| PEA($$, $1); | OA($$, OP_EXPR_CODE__STORE_PARAM, $1); |
| }; | }; |
| store_curly_param_part: maybe_codes { | store_curly_param_part: maybe_codes { |
| $$=N(POOL); | $$=N(POOL); |
| PCA($$, $1); | OA($$, OP_CURLY_CODE__STORE_PARAM, $1); |
| }; | }; |
| code_param_value: | code_param_value: |
| void_value /* optimized [;...] case */ | void_value /* optimized [;...] case */ |
| Line 404 code_param_value: | Line 417 code_param_value: |
| | constructor_code_value /* [something complex] */ | | constructor_code_value /* [something complex] */ |
| ; | ; |
| write_expr_value: expr_value { | write_expr_value: expr_value { |
| $$=$1; | $$=N(POOL); |
| O($$, OP_PREPARE_TO_EXPRESSION); | |
| P($$, $1); | |
| O($$, OP_WRITE_EXPR_RESULT); | O($$, OP_WRITE_EXPR_RESULT); |
| }; | }; |
| Line 425 name_advance1: name_expr_value { | Line 440 name_advance1: name_expr_value { |
| name_advance2: name_expr_value { | name_advance2: name_expr_value { |
| /* stack: context */ | /* stack: context */ |
| $$=$1; /* stack: context,name */ | $$=$1; /* stack: context,name */ |
| O($$, PC.operator_call_allowed?OP_GET_ELEMENT_OR_OPERATOR:OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */ | O($$, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */ |
| // only ^FIRST.part.allowed.to.be.an.operator | |
| PC.operator_call_allowed=false; | |
| } | } |
| | STRING BOGUS | | STRING BOGUS |
| ; | ; |
| Line 442 name_expr_subvar_value: '$' subvar_ref_n | Line 455 name_expr_subvar_value: '$' subvar_ref_n |
| O($$, OP_GET_ELEMENT); | O($$, OP_GET_ELEMENT); |
| }; | }; |
| name_expr_with_subvar_value: STRING subvar_get_writes { | name_expr_with_subvar_value: STRING subvar_get_writes { |
| Array *code; | |
| { | |
| change_string_literal_to_write_string_literal(code=$1); | |
| P(code, $2); | |
| } | |
| $$=N(POOL); | $$=N(POOL); |
| O($$, OP_CREATE_EWPOOL); | OA($$, OP_STRING_POOL, code); |
| P($$, $1); | |
| O($$, OP_WRITE_VALUE); | |
| P($$, $2); | |
| O($$, OP_REDUCE_EWPOOL); | |
| }; | }; |
| name_square_code_value: '[' codes ']' { | name_square_code_value: '[' codes ']' { |
| $$=N(POOL); | $$=N(POOL); |
| O($$, OP_CREATE_EWPOOL); | OA($$, OP_OBJECT_POOL, $2); /* stack: empty write context */ |
| P($$, $2); | /* some code that writes to that context */ |
| O($$, OP_REDUCE_EWPOOL); | /* context=pop; stack: context.value() */ |
| }; | }; |
| subvar_ref_name_rdive: STRING { | subvar_ref_name_rdive: STRING { |
| $$=N(POOL); | $$=N(POOL); |
| Line 476 class_static_prefix: STRING ':' { | Line 490 class_static_prefix: STRING ':' { |
| }; | }; |
| class_constructor_prefix: class_static_prefix ':' { | class_constructor_prefix: class_static_prefix ':' { |
| $$=$1; | $$=$1; |
| if(!PC.object_constructor_allowed) { | if(!PC.in_call_value) { |
| strcpy(PC.error, ":: not allowed here"); | strcpy(PC.error, ":: not allowed here"); |
| YYERROR; | YYERROR; |
| } | } |
| Line 487 class_constructor_prefix: class_static_p | Line 501 class_constructor_prefix: class_static_p |
| /* expr */ | /* expr */ |
| expr_value: expr { | expr_value: expr { |
| // see OP_PREPARE_TO_EXPRESSION!! | |
| if(($$=$1)->size()==2) // only one string literal in there? | if(($$=$1)->size()==2) // only one string literal in there? |
| change_string_literal_to_double_literal($$); // make that string literal Double | change_string_literal_to_double_literal($$); // make that string literal Double |
| }; | }; |
| Line 516 expr: | Line 531 expr: |
| | expr '&' expr { $$=$1; P($$, $3); O($$, OP_BIN_AND) } | | expr '&' expr { $$=$1; P($$, $3); O($$, OP_BIN_AND) } |
| | expr '|' expr { $$=$1; P($$, $3); O($$, OP_BIN_OR) } | | expr '|' expr { $$=$1; P($$, $3); O($$, OP_BIN_OR) } |
| | expr '#' expr { $$=$1; P($$, $3); O($$, OP_BIN_XOR) } | | expr '#' expr { $$=$1; P($$, $3); O($$, OP_BIN_XOR) } |
| | expr "&&" expr { $$=$1; PNC($$, $3); O($$, OP_LOG_AND) } | | expr "&&" expr { $$=$1; OA($$, OP_NESTED_CODE, $3); O($$, OP_LOG_AND) } |
| | expr "||" expr { $$=$1; PNC($$, $3); O($$, OP_LOG_OR) } | | expr "||" expr { $$=$1; OA($$, OP_NESTED_CODE, $3); O($$, OP_LOG_OR) } |
| | expr "##" expr { $$=$1; P($$, $3); O($$, OP_LOG_XOR) } | | expr "##" expr { $$=$1; P($$, $3); O($$, OP_LOG_XOR) } |
| | expr '<' expr { $$=$1; P($$, $3); O($$, OP_NUM_LT) } | | expr '<' expr { $$=$1; P($$, $3); O($$, OP_NUM_LT) } |
| | expr '>' expr { $$=$1; P($$, $3); O($$, OP_NUM_GT) } | | expr '>' expr { $$=$1; P($$, $3); O($$, OP_NUM_GT) } |
| Line 536 expr: | Line 551 expr: |
| string_inside_quotes_value: maybe_codes { | string_inside_quotes_value: maybe_codes { |
| $$=N(POOL); | $$=N(POOL); |
| O($$, OP_CREATE_SWPOOL); /* stack: empty write context */ | OA($$, OP_STRING_POOL, $1); /* stack: empty write context */ |
| P($$, $1); /* some code that writes to that context */ | /* some code that writes to that context */ |
| O($$, OP_REDUCE_SWPOOL); /* context=pop; stack: context.get_string() */ | /* context=pop; stack: context.get_string() */ |
| }; | }; |
| /* basics */ | /* basics */ |
| Line 938 default: | Line 953 default: |
| if( | if( |
| PC.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON || | PC.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON || |
| PC.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) { | PC.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) { |
| // name in expr ends also before binary operators | // name in expr ends also before |
| switch(c) { | switch(c) { |
| // expression minus | |
| case '-': | case '-': |
| // expression integer division | |
| case '\\': | |
| pop_LS(PC); | pop_LS(PC); |
| PC.source--; if(--PC.col<0) { PC.line--; PC.col=-1; } | PC.source--; if(--PC.col<0) { PC.line--; PC.col=-1; } |
| result=EON; | result=EON; |