--- parser3/src/main/compile.y 2002/01/31 15:04:38 1.176 +++ parser3/src/main/compile.y 2002/02/07 11:16:28 1.179 @@ -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.176 2002/01/31 15:04:38 paf Exp $ + $Id: compile.y,v 1.179 2002/02/07 11:16:28 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(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); @@ -311,9 +320,7 @@ construct_square: '[' any_constructor_co ; construct_round: '(' expr_value ')' { // stack: context, name - $$=N(POOL); - O($$, OP_PREPARE_TO_CONSTRUCT_EXPR); /* drop change execution state */ - P($$, $2); // stack: context, name, value + $$=$2; // stack: context, name, value O($$, OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */ } ; @@ -343,8 +350,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.object_constructor_allowed=true; + } + call_name { + PC.object_constructor_allowed=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 */ @@ -411,6 +422,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) */ @@ -562,7 +576,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;