--- parser3/src/main/compile.y 2002/01/25 13:48:55 1.175 +++ parser3/src/main/compile.y 2002/02/18 15:21:01 1.182 @@ -5,7 +5,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: compile.y,v 1.175 2002/01/25 13:48:55 paf Exp $ + $Id: compile.y,v 1.182 2002/02/18 15:21:01 paf Exp $ */ /** @@ -252,13 +252,20 @@ name_without_curly_rdive_read: name_with $$=N(POOL); Array *diving_code=$1; 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) { O($$, OP_WITH_SELF); /* stack: starting context */ P($$, diving_code, /* 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 { 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); } /* diving code; stack: current context */ @@ -280,11 +287,13 @@ name_expr_wdive_root: name_expr_dive_cod $$=N(POOL); Array *diving_code=$1; 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) { O($$, OP_WITH_SELF); /* stack: starting context */ P($$, diving_code, /* 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 { O($$, OP_WITH_ROOT); /* stack: starting context */ P($$, diving_code); @@ -310,8 +319,10 @@ construct_square: '[' any_constructor_co } ; construct_round: '(' expr_value ')' { + $$=N(POOL); + O($$, OP_PREPARE_TO_EXPRESSION); // 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) */ } ; @@ -341,8 +352,12 @@ call: call_value { $$=$1; /* stack: value */ O($$, OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */ }; -call_value: '^' { PC.object_constructor_allowed=true } - call_name { PC.object_constructor_allowed=false } +call_value: '^' { + PC.in_call_value=true; + } + call_name { + PC.in_call_value=false; + } store_params EON { /* ^field.$method{vasya} */ $$=$3; /* with_xxx,diving code; stack: context,method_junction */ O($$, OP_GET_METHOD_FRAME); /* stack: context,method_frame */ @@ -398,7 +413,9 @@ code_param_value: | constructor_code_value /* [something complex] */ ; write_expr_value: expr_value { - $$=$1; + $$=N(POOL); + O($$, OP_PREPARE_TO_EXPRESSION); + P($$, $1); O($$, OP_WRITE_EXPR_RESULT); }; @@ -409,6 +426,9 @@ name_expr_dive_code: name_expr_value | n name_path: name_step | name_path name_step { $$=$1; P($$, $2) }; name_step: name_advance1 '.'; name_advance1: name_expr_value { + // we know that name_advance1 not called from ^xxx context + // so we'll not check for operator call possibility as we do in name_advance2 + /* stack: context */ $$=$1; /* stack: context,name */ O($$, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */ @@ -465,7 +485,7 @@ class_static_prefix: STRING ':' { }; class_constructor_prefix: class_static_prefix ':' { $$=$1; - if(!PC.object_constructor_allowed) { + if(!PC.in_call_value) { strcpy(PC.error, ":: not allowed here"); YYERROR; } @@ -476,6 +496,7 @@ class_constructor_prefix: class_static_p /* expr */ expr_value: expr { + // see OP_PREPARE_TO_EXPRESSION!! if(($$=$1)->size()==2) // only one string literal in there? change_string_literal_to_double_literal($$); // make that string literal Double }; @@ -560,7 +581,7 @@ empty: /* empty */ { $$=N(POOL) }; */ static int yylex(YYSTYPE *lvalp, void *pc) { - #define lexical_brackets_nestage PC.brackets_nestages[PC.sp] + #define lexical_brackets_nestage PC.brackets_nestages[PC.ls_sp] #define RC {result=c; goto break2; } register int c; @@ -927,9 +948,12 @@ default: if( PC.ls==LS_EXPRESSION_VAR_NAME_WITH_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) { + // expression minus case '-': + // expression integer division + case '\\': pop_LS(PC); PC.source--; if(--PC.col<0) { PC.line--; PC.col=-1; } result=EON;