Diff for /parser3/src/main/compile.tab.C between versions 1.81.2.11 and 1.83.2.1

version 1.81.2.11, 2003/03/12 10:47:12 version 1.83.2.1, 2003/09/01 12:27:27
Line 57 Line 57
                 -#:     in iis make up specialized Pool object for that                  -#:     in iis make up specialized Pool object for that
 */  */
   
 #define YYSTYPE  ArrayOperationPtr  #define YYSTYPE  Array/*<Operation>*/ *
 #define YYPARSE_PARAM  pc  #define YYPARSE_PARAM  pc
 #define YYLEX_PARAM  pc  #define YYLEX_PARAM  pc
 #define YYDEBUG  1  #define YYDEBUG  1
Line 82  static int yylex(YYSTYPE *lvalp, void *p Line 82  static int yylex(YYSTYPE *lvalp, void *p
   
   
 // local convinient inplace typecast & var  // local convinient inplace typecast & var
   #undef PC
 #define PC  (*(parse_control *)pc)  #define PC  (*(parse_control *)pc)
 #define POOL  (*PC.pool)  #define POOL  (*PC.pool)
   #undef NEW
   #define NEW new(POOL)
 #ifndef DOXYGEN  #ifndef DOXYGEN
 #ifndef YYSTYPE  #ifndef YYSTYPE
 #define YYSTYPE int  #define YYSTYPE int
Line 208  static const short yyrhs[] = {    62, Line 211  static const short yyrhs[] = {    62,
   
 #if YYDEBUG != 0  #if YYDEBUG != 0
 static const short yyrline[] = { 0,  static const short yyrline[] = { 0,
    113,   121,   123,   123,   124,   126,   126,   128,   200,   200,     116,   126,   128,   128,   129,   131,   131,   133,   200,   200,
    201,   201,   202,   203,   203,   205,   234,   234,   235,   236,     201,   201,   202,   203,   203,   205,   234,   234,   235,   236,
    236,   237,   237,   239,   239,   243,   243,   245,   245,   246,     236,   237,   237,   239,   239,   243,   243,   245,   245,   246,
    246,   247,   247,   247,   251,   258,   259,   259,   260,   261,     246,   247,   247,   247,   251,   258,   259,   259,   260,   261,
Line 1030  yyreduce: Line 1033  yyreduce:
   switch (yyn) {    switch (yyn) {
   
 case 1:  case 1:
 #line 114 "compile.y"  #line 117 "compile.y"
 {  {
         MethodPtr method(new Method(main_method_name, Method::CT_ANY,          Method& method=*NEW Method(POOL, 
                   PC.request->main_method_name, 
                   Method::CT_ANY,
                 0, 0, /*min, max numbered_params_count*/                  0, 0, /*min, max numbered_params_count*/
                 ArrayStringPtr(0)/*param_names*/, ArrayStringPtr(0)/*local_names*/,                   0/*param_names*/, 0/*local_names*/, 
                 yyvsp[0]/*parser_code*/, 0/*native_code*/));                  yyvsp[0]/*parser_code*/, 0/*native_code*/);
         PC.cclass->add_method(main_method_name, method);          PC.cclass->add_method(PC.request->main_method_name, method);
 ;  ;
     break;}      break;}
 case 8:  case 8:
 #line 129 "compile.y"  #line 134 "compile.y"
 {  {
         StringPtr command=LA2S(*yyvsp[-2]);          const String& command=*LA2S(yyvsp[-2]);
         YYSTYPE strings_code=yyvsp[0];          YYSTYPE strings_code=yyvsp[0];
         if(strings_code->count()<1*2) {          if(strings_code->size()<1*2) {
                 strcpy(PC.error, "@");                  strcpy(PC.error, "@");
                 strcat(PC.error, command->cstr());                  strcat(PC.error, command.cstr());
                 strcat(PC.error, " is empty");                  strcat(PC.error, " is empty");
                 YYERROR;                  YYERROR;
         }          }
         if(*command==CLASS_NAME) {          if(command==CLASS_NAME) {
                 if(PC.cclass->base_class()) { // already changed from default?                  if(PC.cclass->base_class()) { // already changed from default?
                         strcpy(PC.error, "class already have a name '");                          strcpy(PC.error, "class already have a name '");
                         strncat(PC.error, PC.cclass->name()->cstr(), 100);                          strncat(PC.error, PC.cclass->name().cstr(), 100);
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->size()==1*2) {
                         // new class' name                          // new class' name
                         StringPtr name=LA2S(*strings_code);                          const String *name=LA2S(strings_code);
                         // creating the class                          // creating the class
                         VStateless_classPtr cclass(new VClass);                          PC.cclass=NEW VClass(POOL);
                         PC.cclass=cclass.get();                          PC.cclass->set_name(*name);
                         PC.cclass->set_name(name);  
                         // append to request's classes                          // append to request's classes
                         PC.request->classes().put(name, cclass);                          PC.request->classes().put(*name, PC.cclass);
                 } else {                  } else {
                         strcpy(PC.error, "@"CLASS_NAME" must contain sole name");                          strcpy(PC.error, "@"CLASS_NAME" must contain sole name");
                         YYERROR;                          YYERROR;
                 }                  }
         } else if(*command==USE_CONTROL_METHOD_NAME) {          } else if(command==USE_CONTROL_METHOD_NAME) {
                 for(int i=0; i<strings_code->count(); i+=2)                   for(int i=0; i<strings_code->size(); i+=2) 
                         PC.request->use_file(*PC.request->main_class, LA2S(*strings_code, i));                          PC.request->use_file(PC.request->main_class, *LA2S(strings_code, i));
         } else if(*command==BASE_NAME) {          } else if(command==BASE_NAME) {
                 if(PC.cclass->base_class()) { // already changed from default?                  if(PC.cclass->base_class()) { // already changed from default?
                         strcpy(PC.error, "class already have a base '");                          strcpy(PC.error, "class already have a base '");
                         strncat(PC.error, PC.cclass->base_class()->name()->cstr(), 100);                          strncat(PC.error, PC.cclass->base_class()->name().cstr(), 100);
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->size()==1*2) {
                         StringPtr base_name=LA2S(*strings_code);                          const String& base_name=*LA2S(strings_code);
                         if(ValuePtr base_class_value=PC.request->classes().get(base_name)) {                          Value *vbase_class=static_cast<VClass *>(
                                 // @CLASS == @BASE sanity check                                  PC.request->classes().get(base_name));
                                 if(VStateless_class *base_class=base_class_value->get_class()) {                          VStateless_class *base_class=vbase_class?vbase_class->get_class():0;
                                         if(PC.cclass==base_class) {                          if(!base_class) {
                                                 strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);                                  strcpy(PC.error, base_name.cstr());
                                                 YYERROR;  
                                         }  
                                         PC.cclass->get_class()->set_base(base_class);  
                                 } else { // they asked to derive from a class without methods ['env' & co]  
                                         strcpy(PC.error, base_name->cstr());  
                                         strcat(PC.error, ": you can not derive from this class in @"BASE_NAME);  
                                         YYERROR;  
                                 }  
                         } else {  
                                 strcpy(PC.error, base_name->cstr());  
                                 strcat(PC.error, ": undefined class in @"BASE_NAME);                                  strcat(PC.error, ": undefined class in @"BASE_NAME);
                                 YYERROR;                                  YYERROR;
                         }                          }
                           // @CLASS == @BASE sanity check
                           if(PC.cclass==base_class) {
                                   strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);
                                   YYERROR;
                           }
                           PC.cclass->set_base(base_class);
                 } else {                  } else {
                         strcpy(PC.error, "@"BASE_NAME" must contain sole name");                          strcpy(PC.error, "@"BASE_NAME" must contain sole name");
                         YYERROR;                          YYERROR;
                 }                  }
         } else {          } else {
                 strcpy(PC.error, "'");                  strcpy(PC.error, "'");
                 strncat(PC.error, command->cstr(), MAX_STRING/2);                  strncat(PC.error, command.cstr(), MAX_STRING/2);
                 strcat(PC.error, "' invalid special name. valid names are "                  strcat(PC.error, "' invalid special name. valid names are "
                         "'"CLASS_NAME"', '"USE_CONTROL_METHOD_NAME"' and '"BASE_NAME"'");                          "'"CLASS_NAME"', '"USE_CONTROL_METHOD_NAME"' and '"BASE_NAME"'");
                 YYERROR;                  YYERROR;
Line 1115  case 8: Line 1115  case 8:
     break;}      break;}
 case 12:  case 12:
 #line 201 "compile.y"  #line 201 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 16:  case 16:
 #line 206 "compile.y"  #line 206 "compile.y"
 {  {
         StringPtr name=LA2S(*yyvsp[-5]);          const String *name=LA2S(yyvsp[-5]);
   
         YYSTYPE params_names_code=yyvsp[-4];          YYSTYPE params_names_code=yyvsp[-4];
         ArrayStringPtr params_names;          Array *params_names=0;
         if(int size=params_names_code->count()) {          if(int size=params_names_code->size()) {
                 params_names=ArrayStringPtr(new ArrayString);                  params_names=NEW Array(POOL);
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=2)
                         *params_names+=LA2S(*params_names_code, i);                          *params_names+=LA2S(params_names_code, i);
         }          }
   
         YYSTYPE locals_names_code=yyvsp[-3];          YYSTYPE locals_names_code=yyvsp[-3];
         ArrayStringPtr locals_names;          Array *locals_names=0;
         if(int size=locals_names_code->count()) {          if(int size=locals_names_code->size()) {
                 locals_names=ArrayStringPtr(new ArrayString);                  locals_names=NEW Array(POOL);
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=2)
                         *locals_names+=LA2S(*locals_names_code, i);                          *locals_names+=LA2S(locals_names_code, i);
         }          }
   
         MethodPtr method(new Method(          Method& method=*NEW Method(POOL, 
                 name,                   *name, 
                 Method::CT_ANY,                  Method::CT_ANY,
                 0, 0/*min,max numbered_params_count*/,                   0, 0/*min,max numbered_params_count*/, 
                 params_names, locals_names,                   params_names, locals_names, 
                 yyvsp[0], 0));                  yyvsp[0], 0);
         PC.cclass->add_method(name, method);          PC.cclass->add_method(*name, method);
 ;  ;
     break;}      break;}
 case 19:  case 19:
Line 1153  case 19: Line 1153  case 19:
     break;}      break;}
 case 23:  case 23:
 #line 237 "compile.y"  #line 237 "compile.y"
 { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 29:  case 29:
 #line 245 "compile.y"  #line 245 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 35:  case 35:
 #line 251 "compile.y"  #line 251 "compile.y"
 {  {
         yyval=yyvsp[0]; /* stack: resulting value */           yyval=yyvsp[0]; /* stack: resulting value */ 
         changetail_or_append(*yyval,           changetail_or_append(yyval, 
                 OP_GET_ELEMENT, false,  /*->*/OP_GET_ELEMENT__WRITE,                  OP_GET_ELEMENT, false,  /*->*/OP_GET_ELEMENT__WRITE,
                 /*or */OP_WRITE_VALUE                  /*or */OP_WRITE_VALUE
                 ); /* value=pop; wcontext.write(value) */                  ); /* value=pop; wcontext.write(value) */
Line 1180  case 39: Line 1180  case 39:
 case 42:  case 42:
 #line 264 "compile.y"  #line 264 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         ArrayOperationPtr diving_code=yyvsp[0];          Array *diving_code=yyvsp[0];
         StringPtr first_name=LA2S(*diving_code);          const String *first_name=LA2S(diving_code);
         // self.xxx... -> xxx...          // self.xxx... -> xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // 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(*yyval, OP_WITH_SELF); /* stack: starting context */                  O(yyval, OP_WITH_SELF); /* stack: starting context */
                 P(*yyval, *diving_code,                   P(yyval, diving_code, 
                         /* skip over... */                          /* skip over... */
                         diving_code->count()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);
         } else {          } else {
                 O(*yyval, OP_WITH_READ); /* stack: starting context */                  O(yyval, OP_WITH_READ); /* stack: starting context */
   
                 // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR                  // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR
                 // OP_VALUE+string+OP_GET_ELEMENT. -> OP_VALUE+string+OP_GET_ELEMENT_OR_OPERATOR.                  // OP_VALUE+string+OP_GET_ELEMENT. -> OP_VALUE+string+OP_GET_ELEMENT_OR_OPERATOR.
                 if(PC.in_call_value && diving_code->count()==3)                  if(PC.in_call_value && diving_code->size()==3)
                         (*diving_code)[2].code=OP_GET_ELEMENT_OR_OPERATOR;                          diving_code->put_int(2, OP_GET_ELEMENT_OR_OPERATOR);
                 P(*yyval, *diving_code);                  P(yyval, diving_code);
         }          }
         /* diving code; stack: current context */          /* diving code; stack: current context */
 ;  ;
     break;}      break;}
 case 43:  case 43:
 #line 286 "compile.y"  #line 286 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 45:  case 45:
 #line 287 "compile.y"  #line 287 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 46:  case 46:
 #line 291 "compile.y"  #line 291 "compile.y"
 {  {
         yyval=yyvsp[-1]; /* stack: context,name */          yyval=yyvsp[-1]; /* stack: context,name */
         P(*yyval, *yyvsp[0]); /* stack: context,name,constructor_value */          P(yyval, yyvsp[0]); /* stack: context,name,constructor_value */
 ;  ;
     break;}      break;}
 case 50:  case 50:
 #line 299 "compile.y"  #line 299 "compile.y"
 {  {
         yyval=N();          yyval=N(POOL);
         ArrayOperationPtr diving_code=yyvsp[0];          Array *diving_code=yyvsp[0];
         StringPtr first_name=LA2S(*diving_code);          const String *first_name=LA2S(diving_code);
         // $self.xxx... -> $xxx...          // $self.xxx... -> $xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // 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(*yyval, OP_WITH_SELF); /* stack: starting context */                  O(yyval, OP_WITH_SELF); /* stack: starting context */
                 P(*yyval, *diving_code,                   P(yyval, diving_code, 
                         /* skip over... */                          /* skip over... */
                         diving_code->count()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);
         } else {          } else {
                 O(*yyval, OP_WITH_ROOT); /* stack: starting context */                  O(yyval, OP_WITH_ROOT); /* stack: starting context */
                 P(*yyval, *diving_code);                  P(yyval, diving_code);
         }          }
         /* diving code; stack: current context */          /* diving code; stack: current context */
 ;  ;
Line 1240  case 50: Line 1240  case 50:
 case 51:  case 51:
 #line 316 "compile.y"  #line 316 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         O(*yyval, OP_WITH_WRITE); /* stack: starting context */          O(yyval, OP_WITH_WRITE); /* stack: starting context */
         P(*yyval, *yyvsp[0]); /* diving code; stack: context,name */          P(yyval, yyvsp[0]); /* diving code; stack: context,name */
 ;  ;
     break;}      break;}
 case 52:  case 52:
 #line 321 "compile.y"  #line 321 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 56:  case 56:
 #line 328 "compile.y"  #line 328 "compile.y"
 {  {
         // stack: context, name          // stack: context, name
         yyval=yyvsp[-1]; // stack: context, name, value          yyval=yyvsp[-1]; // stack: context, name, value
         O(*yyval, OP_CONSTRUCT_VALUE); /* value=pop; name=pop; context=pop; construct(context,name,value) */          O(yyval, OP_CONSTRUCT_VALUE); /* value=pop; name=pop; context=pop; construct(context,name,value) */
 ;  ;
     break;}      break;}
 case 57:  case 57:
 #line 334 "compile.y"  #line 334 "compile.y"
 {   { 
         yyval=N();           yyval=N(POOL); 
         O(*yyval, OP_PREPARE_TO_EXPRESSION);          O(yyval, OP_PREPARE_TO_EXPRESSION);
         // stack: context, name          // stack: context, name
         P(*yyval, *yyvsp[-1]); // stack: context, name, value          P(yyval, yyvsp[-1]); // stack: context, name, value
         O(*yyval, OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */          O(yyval, OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */
 ;  ;
     break;}      break;}
 case 58:  case 58:
 #line 342 "compile.y"  #line 342 "compile.y"
 {  {
         // stack: context, name          // stack: context, name
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_CURLY_CODE__CONSTRUCT, yyvsp[-1]); /* code=pop; name=pop; context=pop; construct(context,name,junction(code)) */          OA(yyval, OP_CURLY_CODE__CONSTRUCT, yyvsp[-1]); /* code=pop; name=pop; context=pop; construct(context,name,junction(code)) */
 ;  ;
     break;}      break;}
 case 62:  case 62:
 #line 353 "compile.y"  #line 353 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_OBJECT_POOL, yyvsp[0]); /* stack: empty write context */          OA(yyval, OP_OBJECT_POOL, yyvsp[0]); /* stack: empty write context */
         /* some code that writes to that context */          /* some code that writes to that context */
         /* context=pop; stack: context.value() */          /* context=pop; stack: context.value() */
 ;  ;
     break;}      break;}
 case 65:  case 65:
 #line 360 "compile.y"  #line 360 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 66:  case 66:
 #line 364 "compile.y"  #line 364 "compile.y"
 {  {
         yyval=yyvsp[0]; /* stack: value */          yyval=yyvsp[0]; /* stack: value */
         changetail_or_append(*yyval,           changetail_or_append(yyval, 
                 OP_CALL, true,  /*->*/ OP_CALL__WRITE,                  OP_CALL, true,  /*->*/ OP_CALL__WRITE,
                 /*or */OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */                  /*or */OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */
 ;  ;
Line 1315  case 69: Line 1315  case 69:
         yyval=yyvsp[-3]; /* with_xxx,diving code; stack: context,method_junction */          yyval=yyvsp[-3]; /* with_xxx,diving code; stack: context,method_junction */
   
         YYSTYPE params_code=yyvsp[-1];          YYSTYPE params_code=yyvsp[-1];
         if(params_code->count()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM]          if(params_code->size()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM]
                 if(ValuePtr 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=YYSTYPE(0); // ^zzz[] case. don't append lone empty param.                                  params_code=0; // ^zzz[] case. don't append lone empty param.
         }          }
         /* stack: context, method_junction */          /* stack: context, method_junction */
         OA(*yyval, OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value          OA(yyval, OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value
 ;  ;
     break;}      break;}
 case 72:  case 72:
 #line 391 "compile.y"  #line 391 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 76:  case 76:
 #line 397 "compile.y"  #line 397 "compile.y"
Line 1342  case 78: Line 1342  case 78:
     break;}      break;}
 case 80:  case 80:
 #line 402 "compile.y"  #line 402 "compile.y"
 { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 82:  case 82:
 #line 406 "compile.y"  #line 406 "compile.y"
 { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 84:  case 84:
 #line 410 "compile.y"  #line 410 "compile.y"
 { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 85:  case 85:
 #line 412 "compile.y"  #line 412 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(*yyval, OP_STORE_PARAM);          O(yyval, OP_STORE_PARAM);
 ;  ;
     break;}      break;}
 case 86:  case 86:
 #line 416 "compile.y"  #line 416 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_EXPR_CODE__STORE_PARAM, yyvsp[0]);          OA(yyval, OP_EXPR_CODE__STORE_PARAM, yyvsp[0]);
 ;  ;
     break;}      break;}
 case 87:  case 87:
 #line 420 "compile.y"  #line 420 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_CURLY_CODE__STORE_PARAM, yyvsp[0]);          OA(yyval, OP_CURLY_CODE__STORE_PARAM, yyvsp[0]);
 ;  ;
     break;}      break;}
 case 91:  case 91:
 #line 429 "compile.y"  #line 429 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         O(*yyval, OP_PREPARE_TO_EXPRESSION);          O(yyval, OP_PREPARE_TO_EXPRESSION);
         P(*yyval, *yyvsp[0]);          P(yyval, yyvsp[0]);
         O(*yyval, OP_WRITE_EXPR_RESULT);          O(yyval, OP_WRITE_EXPR_RESULT);
 ;  ;
     break;}      break;}
 case 93:  case 93:
 #line 438 "compile.y"  #line 438 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 95:  case 95:
 #line 440 "compile.y"  #line 440 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 97:  case 97:
 #line 442 "compile.y"  #line 442 "compile.y"
Line 1398  case 97: Line 1398  case 97:
   
         /* stack: context */          /* stack: context */
         yyval=yyvsp[0]; /* stack: context,name */          yyval=yyvsp[0]; /* stack: context,name */
         O(*yyval, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */          O(yyval, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */
 ;  ;
     break;}      break;}
 case 98:  case 98:
Line 1406  case 98: Line 1406  case 98:
 {  {
         /* stack: context */          /* stack: context */
         yyval=yyvsp[0]; /* stack: context,name */          yyval=yyvsp[0]; /* stack: context,name */
         O(*yyval, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */          O(yyval, OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */
 ;  ;
     break;}      break;}
 case 104:  case 104:
 #line 463 "compile.y"  #line 463 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(*yyval, OP_GET_ELEMENT);          O(yyval, OP_GET_ELEMENT);
 ;  ;
     break;}      break;}
 case 105:  case 105:
 #line 467 "compile.y"  #line 467 "compile.y"
 {  {
         ArrayOperationPtr code;          Array *code;
         {          {
                 change_string_literal_to_write_string_literal(*(code=yyvsp[-1]));                  change_string_literal_to_write_string_literal(code=yyvsp[-1]);
                 P(*code, *yyvsp[0]);                  P(code, yyvsp[0]);
         }          }
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_STRING_POOL, code);          OA(yyval, OP_STRING_POOL, code);
 ;  ;
     break;}      break;}
 case 106:  case 106:
 #line 476 "compile.y"  #line 476 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         OA(*yyval, OP_OBJECT_POOL, yyvsp[-1]); /* stack: empty write context */          OA(yyval, OP_OBJECT_POOL, yyvsp[-1]); /* stack: empty write context */
         /* some code that writes to that context */          /* some code that writes to that context */
         /* context=pop; stack: context.value() */          /* context=pop; stack: context.value() */
 ;  ;
Line 1440  case 106: Line 1440  case 106:
 case 107:  case 107:
 #line 482 "compile.y"  #line 482 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         O(*yyval, OP_WITH_READ);          O(yyval, OP_WITH_READ);
         P(*yyval, *yyvsp[0]);          P(yyval, yyvsp[0]);
 ;  ;
     break;}      break;}
 case 109:  case 109:
 #line 487 "compile.y"  #line 487 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;
     break;}      break;}
 case 110:  case 110:
 #line 488 "compile.y"  #line 488 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(*yyval, OP_GET_ELEMENT__WRITE);          O(yyval, OP_GET_ELEMENT__WRITE);
 ;  ;
     break;}      break;}
 case 113:  case 113:
 #line 497 "compile.y"  #line 497 "compile.y"
 {  {
         yyval=yyvsp[-1]; // stack: class name string          yyval=yyvsp[-1]; // stack: class name string
         if(*LA2S(*yyval) == BASE_NAME) { // pseude BASE class          if(*LA2S(yyval) == BASE_NAME) { // pseude BASE class
                 if(VStateless_class* base=PC.cclass->base_class()) {                  if(VStateless_class *base=PC.cclass->base_class()) {
                         change_string_literal_value(*yyval, base->name());                          change_string_literal_value(yyval, base->name());
                 } else {                  } else {
                         strcpy(PC.error, "no base class declared");                          strcpy(PC.error, "no base class declared");
                         YYERROR;                          YYERROR;
                 }                  }
         }          }
         O(*yyval, OP_GET_CLASS);          O(yyval, OP_GET_CLASS);
 ;  ;
     break;}      break;}
 case 114:  case 114:
Line 1479  case 114: Line 1479  case 114:
                 strcpy(PC.error, ":: not allowed here");                  strcpy(PC.error, ":: not allowed here");
                 YYERROR;                  YYERROR;
         }          }
         O(*yyval, OP_PREPARE_TO_CONSTRUCT_OBJECT);          O(yyval, OP_PREPARE_TO_CONSTRUCT_OBJECT);
 ;  ;
     break;}      break;}
 case 115:  case 115:
 #line 521 "compile.y"  #line 521 "compile.y"
 {  {
         // see OP_PREPARE_TO_EXPRESSION!!          // see OP_PREPARE_TO_EXPRESSION!!
         if((yyval=yyvsp[0])->count()==2) // only one string literal in there?          if((yyval=yyvsp[0])->size()==2) // only one string literal in there?
                 change_string_literal_to_double_literal(*yyval); // make that string literal Double                  change_string_literal_to_double_literal(yyval); // make that string literal Double
 ;  ;
     break;}      break;}
 case 119:  case 119:
Line 1504  case 121: Line 1504  case 121:
     break;}      break;}
 case 122:  case 122:
 #line 534 "compile.y"  #line 534 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_NEG) ;  { yyval=yyvsp[0];  O(yyval, OP_NEG) ;
     break;}      break;}
 case 123:  case 123:
 #line 535 "compile.y"  #line 535 "compile.y"
Line 1512  case 123: Line 1512  case 123:
     break;}      break;}
 case 124:  case 124:
 #line 536 "compile.y"  #line 536 "compile.y"
 { yyval=yyvsp[0];        O(*yyval, OP_INV) ;  { yyval=yyvsp[0];        O(yyval, OP_INV) ;
     break;}      break;}
 case 125:  case 125:
 #line 537 "compile.y"  #line 537 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_NOT) ;  { yyval=yyvsp[0];  O(yyval, OP_NOT) ;
     break;}      break;}
 case 126:  case 126:
 #line 538 "compile.y"  #line 538 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_DEF) ;  { yyval=yyvsp[0];  O(yyval, OP_DEF) ;
     break;}      break;}
 case 127:  case 127:
 #line 539 "compile.y"  #line 539 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_IN) ;  { yyval=yyvsp[0];  O(yyval, OP_IN) ;
     break;}      break;}
 case 128:  case 128:
 #line 540 "compile.y"  #line 540 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_FEXISTS) ;  { yyval=yyvsp[0];  O(yyval, OP_FEXISTS) ;
     break;}      break;}
 case 129:  case 129:
 #line 541 "compile.y"  #line 541 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_DEXISTS) ;  { yyval=yyvsp[0];  O(yyval, OP_DEXISTS) ;
     break;}      break;}
 case 130:  case 130:
 #line 543 "compile.y"  #line 543 "compile.y"
 {       yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_SUB) ;  {       yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_SUB) ;
     break;}      break;}
 case 131:  case 131:
 #line 544 "compile.y"  #line 544 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_ADD) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_ADD) ;
     break;}      break;}
 case 132:  case 132:
 #line 545 "compile.y"  #line 545 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MUL) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_MUL) ;
     break;}      break;}
 case 133:  case 133:
 #line 546 "compile.y"  #line 546 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_DIV) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_DIV) ;
     break;}      break;}
 case 134:  case 134:
 #line 547 "compile.y"  #line 547 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MOD) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_MOD) ;
     break;}      break;}
 case 135:  case 135:
 #line 548 "compile.y"  #line 548 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_INTDIV) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_INTDIV) ;
     break;}      break;}
 case 136:  case 136:
 #line 549 "compile.y"  #line 549 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SL) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_SL) ;
     break;}      break;}
 case 137:  case 137:
 #line 550 "compile.y"  #line 550 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SR) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_SR) ;
     break;}      break;}
 case 138:  case 138:
 #line 551 "compile.y"  #line 551 "compile.y"
 { yyval=yyvsp[-2];      P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_AND) ;  { yyval=yyvsp[-2];      P(yyval, yyvsp[0]);  O(yyval, OP_BIN_AND) ;
     break;}      break;}
 case 139:  case 139:
 #line 552 "compile.y"  #line 552 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_OR) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_OR) ;
     break;}      break;}
 case 140:  case 140:
 #line 553 "compile.y"  #line 553 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_XOR) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_XOR) ;
     break;}      break;}
 case 141:  case 141:
 #line 554 "compile.y"  #line 554 "compile.y"
 { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_AND) ;  { yyval=yyvsp[-2];  OA(yyval, OP_NESTED_CODE, yyvsp[0]);  O(yyval, OP_LOG_AND) ;
     break;}      break;}
 case 142:  case 142:
 #line 555 "compile.y"  #line 555 "compile.y"
 { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_OR) ;  { yyval=yyvsp[-2];  OA(yyval, OP_NESTED_CODE, yyvsp[0]);  O(yyval, OP_LOG_OR) ;
     break;}      break;}
 case 143:  case 143:
 #line 556 "compile.y"  #line 556 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_LOG_XOR) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_LOG_XOR) ;
     break;}      break;}
 case 144:  case 144:
 #line 557 "compile.y"  #line 557 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LT) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_LT) ;
     break;}      break;}
 case 145:  case 145:
 #line 558 "compile.y"  #line 558 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GT) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_GT) ;
     break;}      break;}
 case 146:  case 146:
 #line 559 "compile.y"  #line 559 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_LE) ;
     break;}      break;}
 case 147:  case 147:
 #line 560 "compile.y"  #line 560 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_GE) ;
     break;}      break;}
 case 148:  case 148:
 #line 561 "compile.y"  #line 561 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_EQ) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_EQ) ;
     break;}      break;}
 case 149:  case 149:
 #line 562 "compile.y"  #line 562 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_NE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_NE) ;
     break;}      break;}
 case 150:  case 150:
 #line 563 "compile.y"  #line 563 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LT) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_LT) ;
     break;}      break;}
 case 151:  case 151:
 #line 564 "compile.y"  #line 564 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GT) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_GT) ;
     break;}      break;}
 case 152:  case 152:
 #line 565 "compile.y"  #line 565 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_LE) ;
     break;}      break;}
 case 153:  case 153:
 #line 566 "compile.y"  #line 566 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_GE) ;
     break;}      break;}
 case 154:  case 154:
 #line 567 "compile.y"  #line 567 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_EQ) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_EQ) ;
     break;}      break;}
 case 155:  case 155:
 #line 568 "compile.y"  #line 568 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_NE) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_NE) ;
     break;}      break;}
 case 156:  case 156:
 #line 569 "compile.y"  #line 569 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_IS) ;  { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_IS) ;
     break;}      break;}
 case 157:  case 157:
 #line 572 "compile.y"  #line 572 "compile.y"
 {  {
         yyval=N();          yyval=N(POOL);
         OA(*yyval, OP_STRING_POOL, yyvsp[0]); /* stack: empty write context */          OA(yyval, OP_STRING_POOL, yyvsp[0]); /* stack: empty write context */
         /* some code that writes to that context */          /* some code that writes to that context */
         /* context=pop; stack: context.get_string() */          /* context=pop; stack: context.get_string() */
 ;  ;
Line 1655  case 158: Line 1655  case 158:
 #line 581 "compile.y"  #line 581 "compile.y"
 {  {
         // optimized from OP_STRING+OP_WRITE_VALUE to OP_STRING__WRITE          // optimized from OP_STRING+OP_WRITE_VALUE to OP_STRING__WRITE
         change_string_literal_to_write_string_literal(*(yyval=yyvsp[0]))          change_string_literal_to_write_string_literal(yyval=yyvsp[0])
 ;  ;
     break;}      break;}
 case 159:  case 159:
 #line 586 "compile.y"  #line 586 "compile.y"
 { yyval=VL(ValuePtr(new VVoid())) ;  { yyval=VL(NEW VVoid(POOL)) ;
     break;}      break;}
 case 160:  case 160:
 #line 587 "compile.y"  #line 587 "compile.y"
 { yyval=N() ;  { yyval=N(POOL) ;
     break;}      break;}
 }  }
    /* the action file gets copied in in place of this dollarsign */     /* the action file gets copied in in place of this dollarsign */
Line 2603  break2: Line 2603  break2:
         }          }
         if(PC.string->size()) { // something accumulated?          if(PC.string->size()) { // something accumulated?
                 // create STRING value: array of OP_VALUE+vstring                  // create STRING value: array of OP_VALUE+vstring
                 *lvalp=VL(ValuePtr(new VString(PC.string)));                  *lvalp=VL(NEW VString(*PC.string));
                 // new pieces storage                  // new pieces storage
                 PC.string=StringPtr(new String);                  PC.string=NEW String(POOL);
                 // make current result be pending for next call, return STRING for now                  // make current result be pending for next call, return STRING for now
                 PC.pending_state=result;  result=STRING;                  PC.pending_state=result;  result=STRING;
         }          }
Line 2622  static int real_yyerror(parse_control *p Line 2622  static int real_yyerror(parse_control *p
   
 static void yyprint(FILE *file, int type, YYSTYPE value) {  static void yyprint(FILE *file, int type, YYSTYPE value) {
         if(type==STRING)          if(type==STRING)
                 fprintf(file, " \"%s\"", LA2S(*value)->cstr().get());                  fprintf(file, " \"%s\"", LA2S(value)->cstr());
 }  }

Removed from v.1.81.2.11  
changed lines
  Added in v.1.83.2.1


E-mail: