Diff for /parser3/src/main/compile.tab.C between versions 1.81.2.13.2.22 and 1.83

version 1.81.2.13.2.22, 2003/04/03 06:16:04 version 1.83, 2003/04/07 07:07:30
Line 57 Line 57
                 -#:     in iis make up specialized Pool object for that                  -#:     in iis make up specialized Pool object for that
 */  */
   
 #define YYSTYPE  ArrayOperation*   #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
 #define YYERROR_VERBOSE 1  #define YYERROR_VERBOSE 1
 #define yyerror(msg)  real_yyerror((Parse_control *)pc, msg)  #define yyerror(msg)  real_yyerror((parse_control *)pc, msg)
 #define YYPRINT(file, type, value)  yyprint(file, type, value)  #define YYPRINT(file, type, value)  yyprint(file, type, value)
   
 // includes  
   
 #include "compile_tools.h"  #include "compile_tools.h"
 #include "pa_value.h"  #include "pa_value.h"
 #include "pa_request.h"  #include "pa_request.h"
Line 76 Line 74
 #include "pa_vvoid.h"  #include "pa_vvoid.h"
 #include "pa_vmethod_frame.h"  #include "pa_vmethod_frame.h"
   
 // defines  
   
 #define USE_CONTROL_METHOD_NAME "USE"  #define USE_CONTROL_METHOD_NAME "USE"
 #define TAB_SIZE 8  
   
 // forwards  
   
 static int real_yyerror(Parse_control *pc, char *s);  static int real_yyerror(parse_control *pc, char *s);
 static void yyprint(FILE *file, int type, YYSTYPE value);  static void yyprint(FILE *file, int type, YYSTYPE value);
 static int yylex(YYSTYPE *lvalp, void *pc);  static int yylex(YYSTYPE *lvalp, void *pc);
   
   
 // local convinient inplace typecast & var  // local convinient inplace typecast & var
 #undef PC  #undef PC
 #define PC  (*(Parse_control *)pc)  #define PC  (*(parse_control *)pc)
 #undef POOL  
 #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 217  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,
    122,   130,   132,   132,   133,   135,   135,   137,   209,   209,     116,   126,   128,   128,   129,   131,   131,   133,   200,   200,
    210,   210,   211,   212,   212,   214,   243,   243,   244,   245,     201,   201,   202,   203,   203,   205,   234,   234,   235,   236,
    245,   246,   246,   248,   248,   252,   252,   254,   254,   255,     236,   237,   237,   239,   239,   243,   243,   245,   245,   246,
    255,   256,   256,   256,   260,   267,   268,   268,   269,   270,     246,   247,   247,   247,   251,   258,   259,   259,   260,   261,
    272,   273,   295,   296,   296,   300,   304,   306,   307,   308,     263,   264,   286,   287,   287,   291,   295,   297,   298,   299,
    325,   330,   332,   334,   335,   337,   343,   351,   357,   359,     316,   321,   323,   325,   326,   328,   334,   342,   348,   350,
    360,   362,   368,   369,   369,   373,   379,   382,   385,   398,     351,   353,   359,   360,   360,   364,   370,   373,   376,   389,
    400,   400,   401,   403,   404,   406,   407,   408,   409,   411,     391,   391,   392,   394,   395,   397,   398,   399,   400,   402,
    413,   415,   417,   419,   421,   425,   429,   433,   435,   436,     404,   406,   408,   410,   412,   416,   420,   424,   426,   427,
    438,   447,   447,   449,   449,   450,   451,   459,   464,   466,     429,   438,   438,   440,   440,   441,   442,   450,   455,   457,
    468,   469,   470,   472,   476,   485,   491,   496,   496,   497,     459,   460,   461,   463,   467,   476,   482,   487,   487,   488,
    502,   504,   506,   518,   530,   535,   537,   538,   539,   540,     493,   495,   497,   509,   521,   526,   528,   529,   530,   531,
    541,   543,   544,   545,   546,   547,   548,   549,   550,   552,     532,   534,   535,   536,   537,   538,   539,   540,   541,   543,
    553,   554,   555,   556,   557,   558,   559,   560,   561,   562,     544,   545,   546,   547,   548,   549,   550,   551,   552,   553,
    563,   564,   565,   566,   567,   568,   569,   570,   571,   572,     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
    573,   574,   575,   576,   577,   578,   581,   590,   595,   596     564,   565,   566,   567,   568,   569,   572,   581,   586,   587
 };  };
 #endif  #endif
   
Line 1039  yyreduce: Line 1033  yyreduce:
   switch (yyn) {    switch (yyn) {
   
 case 1:  case 1:
 #line 123 "compile.y"  #line 117 "compile.y"
 {  {
         Method& 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*/
                 0/*param_names*/, 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 138 "compile.y"  #line 134 "compile.y"
 {  {
         const String& 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");
Line 1066  case 8: Line 1062  case 8:
                         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
                         const String& name=*LA2S(*strings_code);                          const String *name=LA2S(strings_code);
                         // creating the class                          // creating the class
                         VStateless_class* cclass=new VClass;                          PC.cclass=NEW VClass(POOL);
                         PC.cclass=cclass;                          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(size_t 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 '");
Line 1089  case 8: Line 1084  case 8:
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->size()==1*2) {
                         const String& base_name=*LA2S(*strings_code);                          const String& base_name=*LA2S(strings_code);
                         if(Value* 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);  
                                                 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());                                  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;
Line 1123  case 8: Line 1114  case 8:
 ;  ;
     break;}      break;}
 case 12:  case 12:
 #line 210 "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 215 "compile.y"  #line 206 "compile.y"
 {  {
         const String& name=*LA2S(*yyvsp[-5]);          const String *name=LA2S(yyvsp[-5]);
   
         YYSTYPE params_names_code=yyvsp[-4];          YYSTYPE params_names_code=yyvsp[-4];
         ArrayString* params_names=0;          Array *params_names=0;
         if(int size=params_names_code->count()) {          if(int size=params_names_code->size()) {
                 params_names=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];
         ArrayString* locals_names=0;          Array *locals_names=0;
         if(int size=locals_names_code->count()) {          if(int size=locals_names_code->size()) {
                 locals_names=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);
         }          }
   
         Method& 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 244 "compile.y"  #line 235 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 23:  case 23:
 #line 246 "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 254 "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 260 "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) */
 ;  ;
     break;}      break;}
 case 36:  case 36:
 #line 267 "compile.y"  #line 258 "compile.y"
 { yyval=yyvsp[0] ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 39:  case 39:
 #line 269 "compile.y"  #line 260 "compile.y"
 { yyval=yyvsp[-1] ;  { yyval=yyvsp[-1] ;
     break;}      break;}
 case 42:  case 42:
 #line 273 "compile.y"  #line 264 "compile.y"
 {  {
         yyval=N();           yyval=N(POOL); 
         ArrayOperation* diving_code=yyvsp[0];          Array *diving_code=yyvsp[0];
         const String* 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->put(2, 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 295 "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 296 "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 300 "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 308 "compile.y"  #line 299 "compile.y"
 {  {
         yyval=N();          yyval=N(POOL);
         ArrayOperation* diving_code=yyvsp[0];          Array *diving_code=yyvsp[0];
         const String* 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 */
 ;  ;
     break;}      break;}
 case 51:  case 51:
 #line 325 "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 330 "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 337 "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 343 "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 351 "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 362 "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 369 "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 373 "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) */
 ;  ;
     break;}      break;}
 case 67:  case 67:
 #line 379 "compile.y"  #line 370 "compile.y"
 {   { 
                                         PC.in_call_value=true;                                           PC.in_call_value=true; 
                         ;                          ;
     break;}      break;}
 case 68:  case 68:
 #line 382 "compile.y"  #line 373 "compile.y"
 {  {
                                 PC.in_call_value=false;                                  PC.in_call_value=false;
                         ;                          ;
     break;}      break;}
 case 69:  case 69:
 #line 385 "compile.y"  #line 376 "compile.y"
 { /* ^field.$method{vasya} */  { /* ^field.$method{vasya} */
         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(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.
         }          }
         /* 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 400 "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 406 "compile.y"  #line 397 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 77:  case 77:
 #line 407 "compile.y"  #line 398 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 78:  case 78:
 #line 408 "compile.y"  #line 399 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 80:  case 80:
 #line 411 "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 415 "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 419 "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 421 "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 425 "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 429 "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 438 "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 447 "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 449 "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 451 "compile.y"  #line 442 "compile.y"
 {  {
         // we know that name_advance1 not called from ^xxx context          // 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          // so we'll not check for operator call possibility as we do in name_advance2
   
         /* 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 459 "compile.y"  #line 450 "compile.y"
 {  {
         /* 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 472 "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 476 "compile.y"  #line 467 "compile.y"
 {  {
         ArrayOperation* 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 485 "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() */
 ;  ;
     break;}      break;}
 case 107:  case 107:
 #line 491 "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 496 "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 497 "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 506 "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) { // pseudo 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 518 "compile.y"  #line 509 "compile.y"
 {  {
         yyval=yyvsp[-1];          yyval=yyvsp[-1];
         if(!PC.in_call_value) {          if(!PC.in_call_value) {
                 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 530 "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 539 "compile.y"  #line 530 "compile.y"
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 120:  case 120:
 #line 540 "compile.y"  #line 531 "compile.y"
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 121:  case 121:
 #line 541 "compile.y"  #line 532 "compile.y"
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 122:  case 122:
 #line 543 "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 544 "compile.y"  #line 535 "compile.y"
 { yyval=yyvsp[0] ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 124:  case 124:
 #line 545 "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 546 "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 547 "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 548 "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 549 "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 550 "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 552 "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 553 "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 554 "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 555 "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 556 "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 557 "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 558 "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 559 "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 560 "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 561 "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 562 "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 563 "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 564 "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 565 "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 566 "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 567 "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 568 "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 569 "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 570 "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 571 "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 572 "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 573 "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 574 "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 575 "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 576 "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 577 "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 578 "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 581 "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() */
 ;  ;
     break;}      break;}
 case 158:  case 158:
 #line 590 "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 595 "compile.y"  #line 586 "compile.y"
 { yyval=VL(new VVoid(), 0, 0, 0) ;  { yyval=VL(NEW VVoid(POOL)) ;
     break;}      break;}
 case 160:  case 160:
 #line 596 "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 1897  yyerrhandle: Line 1888  yyerrhandle:
     }      }
   return 1;    return 1;
 }  }
 #line 598 "compile.y"  #line 589 "compile.y"
   
 #endif  #endif
   
Line 1917  yyerrhandle: Line 1908  yyerrhandle:
                 4:[^({]=pop                  4:[^({]=pop
 */  */
   
 inline ungetc(Parse_control& pc, uint last_line_end_col) {  static int yylex(YYSTYPE *lvalp, void *pc) {
         pc.source--;          #define lexical_brackets_nestage PC.brackets_nestages[PC.ls_sp]
         if(pc.pos.col==0) {  
                 --pc.pos.line; pc.pos.col=last_line_end_col;  
         } else  
                 --pc.pos.col;  
   
 }  
 static int yylex(YYSTYPE *lvalp, void *apc) {  
         register Parse_control& pc=*static_cast<Parse_control*>(apc);  
   
         #define lexical_brackets_nestage pc.brackets_nestages[pc.ls_sp]  
         #define RC {result=c; goto break2; }          #define RC {result=c; goto break2; }
   
         register int c;      register int c;
         int result;      int result;
                   
         if(pc.pending_state) {          if(PC.pending_state) {
                 result=pc.pending_state;                  result=PC.pending_state;
                 pc.pending_state=0;                  PC.pending_state=0;
                 return result;                  return result;
         }          }
                   
         const char *begin=pc.source;          const char *begin=PC.source;
         Pos begin_pos=pc.pos;  
         uint last_line_end_col=0;  
         const char *end;          const char *end;
           int begin_line=PC.line;
         int skip_analized=0;          int skip_analized=0;
         while(true) {          while(true) {
                 c=*(end=(pc.source++));                  c=*(end=(PC.source++));
 //              fprintf(stderr, "\nchar: %c %02X; nestage: %d, sp=%d", c, c, lexical_brackets_nestage, pc.sp);  //              fprintf(stderr, "\nchar: %c %02X; nestage: %d, sp=%d", c, c, lexical_brackets_nestage, PC.sp);
   
                 if(c=='\n') {                  if(c=='\n') {
                         pc.pos.line++;                          PC.line++;
                         last_line_end_col=pc.pos.col;                          PC.col=0;
                         pc.pos.col=0;  
                 } else                  } else
                         pc.pos.col+=c=='\t'?TAB_SIZE:1;                          PC.col++;
   
                 if(c=='@' && pc.pos.col==0+1) {                  if(c=='@' && PC.col==0+1) {
                         if(pc.ls==LS_DEF_SPECIAL_BODY) {                          if(PC.ls==LS_DEF_SPECIAL_BODY) {
                                 // @SPECIAL                                  // @SPECIAL
                                 // ...                                  // ...
                                 // @<here =                                   // @<here = 
                                 pop_LS(pc); // exiting from LS_DEF_SPECIAL_BODY state                                  pop_LS(PC); // exiting from LS_DEF_SPECIAL_BODY state
                         } // continuing checks                          } // continuing checks
                         if(pc.ls==LS_USER) {                          if(PC.ls==LS_USER) {
                                 push_LS(pc, LS_DEF_NAME);                                  push_LS(PC, LS_DEF_NAME);
                                 RC;                                  RC;
                         } else // @ in first column inside some code [when could that be?]                          } else // @ in first column inside some code [when could that be?]
                                 result=BAD_METHOD_DECL_START;                                  result=BAD_METHOD_DECL_START;
                         goto break2;                          goto break2;
                 } else if(c=='^') {                  } else if(c=='^') {
                         if(pc.ls==LS_METHOD_AFTER) {                          if(PC.ls==LS_METHOD_AFTER) {
                                 // handle after-method situation                                  // handle after-method situation
                                 pop_LS(pc);                                  pop_LS(PC);
                                 result=EON;                                  result=EON;
                                 skip_analized=-1; // return to punctuation afterwards to assure it's literality                                  skip_analized=-1; // return to punctuation afterwards to assure it's literality
                                 goto break2;                                  goto break2;
                         }                          }
                         switch(pc.ls) {                          switch(PC.ls) {
 case LS_EXPRESSION_VAR_NAME_WITH_COLON:  case LS_EXPRESSION_VAR_NAME_WITH_COLON:
 case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:  case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:
 case LS_VAR_NAME_SIMPLE_WITH_COLON:  case LS_VAR_NAME_SIMPLE_WITH_COLON:
Line 1989  case LS_DEF_COMMENT: Line 1968  case LS_DEF_COMMENT:
         // no literals in names, please          // no literals in names, please
         break;          break;
 default:  default:
                         switch(*pc.source) {                          switch(*PC.source) {
                         // ^escaping some punctuators                          // ^escaping some punctuators
                         case '^': case '$': case ';':                          case '^': case '$': case ';':
                         case '(': case ')':                          case '(': case ')':
Line 1997  default: Line 1976  default:
                         case '{': case '}':                          case '{': case '}':
                         case '"':  case ':':                          case '"':  case ':':
                                 if(end!=begin) {                                  if(end!=begin) {
                                         if(!pc.string_start)  
                                                 pc.string_start=begin_pos;  
                                         // append piece till ^                                          // append piece till ^
                                         pc.string.append_strdup(begin, end-begin);                                          PC.string->APPEND_CLEAN(begin, end-begin, PC.file, begin_line);
                                 }                                  }
                                 // reset piece 'begin' position & line                                  // reset piece 'begin' position & line
                                 begin=pc.source; // ->punctuation                                  begin=PC.source; // ->punctuation
                                 begin_pos=pc.pos;                                  begin_line=PC.line;
                                 // skip over _ after ^                                  // skip over _ after ^
                                 pc.source++;  pc.pos.col++;                                  PC.source++;  PC.col++;
                                 // skip analysis = forced literal                                  // skip analysis = forced literal
                                 continue;                                  continue;
   
                         // converting ^#HH into char(hex(HH))                          // converting ^#HH into char(hex(HH))
                         case '#':                          case '#':
                                 if(end!=begin) {                                  if(end!=begin) {
                                         if(!pc.string_start)  
                                                 pc.string_start=begin_pos;  
                                         // append piece till ^                                          // append piece till ^
                                         pc.string.append_strdup(begin, end-begin);                                          PC.string->APPEND_CLEAN(begin, end-begin, PC.file, begin_line);
                                 }                                  }
                                 // #HH ?                                  // #HH ?
                                 if(pc.source[0]=='#' && pc.source[1] && pc.source[2]) {                                  if(PC.source[0]=='#' && PC.source[1] && PC.source[2]) {
                                         char c=                                          char *hex=(char *)POOL.malloc(1);
                                                 hex_value[(unsigned char)pc.source[1]]*0x10+                                          hex[0]=
                                                 hex_value[(unsigned char)pc.source[2]];                                                  hex_value[(unsigned char)PC.source[1]]*0x10+
                                         if(c==0) {                                                  hex_value[(unsigned char)PC.source[2]];
                                           if(hex[0]==0) {
                                                 result=BAD_HEX_LITERAL;                                                  result=BAD_HEX_LITERAL;
                                                 goto break2; // wrong hex value[no ^#00 chars allowed]: bail out                                                  goto break2; // wrong hex value[no ^#00 chars allowed]: bail out
                                         }                                          }
                                         // append char(hex(HH))                                          // append char(hex(HH))
                                         pc.string.append(c);                                          PC.string->APPEND_CLEAN(hex, 1, PC.file, begin_line);
                                         // skip over ^#HH                                          // skip over ^#HH
                                         pc.source+=3;                                          PC.source+=3;
                                         pc.pos.col+=3;                                          PC.col+=3;
                                         // reset piece 'begin' position & line                                          // reset piece 'begin' position & line
                                         begin=pc.source; // ->after ^#HH                                          begin=PC.source; // ->after ^#HH
                                         begin_pos=pc.pos;                                          begin_line=PC.line;
                                         // skip analysis = forced literal                                          // skip analysis = forced literal
                                         continue;                                          continue;
                                 }                                  }
Line 2044  default: Line 2020  default:
                         }                          }
                 }                  }
                 // #comment  start skipping                  // #comment  start skipping
                 if(c=='#' && pc.pos.col==1) {                  if(c=='#' && PC.col==1) {
                         if(end!=begin) {                          if(end!=begin) {
                                 if(!pc.string_start)  
                                         pc.string_start=begin_pos;  
                                 // append piece till #                                  // append piece till #
                                 pc.string.append_strdup(begin, end-begin);                                  PC.string->APPEND_CLEAN(begin, end-begin, PC.file, begin_line);
                         }                          }
                         // fall into COMMENT lexical state [wait for \n]                          // fall into COMMENT lexical state [wait for \n]
                         push_LS(pc, LS_USER_COMMENT);                          push_LS(PC, LS_USER_COMMENT);
                         continue;                          continue;
                 }                  }
                 switch(pc.ls) {                  switch(PC.ls) {
   
                 // USER'S = NOT OURS                  // USER'S = NOT OURS
                 case LS_USER:                  case LS_USER:
                 case LS_NAME_SQUARE_PART: // name.[here].xxx          case LS_NAME_SQUARE_PART: // name.[here].xxx
                         if(pc.trim_bof)                          if(PC.trim_bof)
                                 switch(c) {                                  switch(c) {
                                 case '\n': case ' ': case '\t':                                  case '\n': case ' ': case '\t':
                                         begin=pc.source;                                          begin=PC.source;
                                         begin_pos=pc.pos;                                          begin_line=PC.line;
                                         continue; // skip it                                          continue; // skip it
                                 default:                                  default:
                                         pc.trim_bof=false;                                          PC.trim_bof=false;
                                 }                                  }
                         switch(c) {                          switch(c) {
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 if(pc.ls==LS_NAME_SQUARE_PART)                                  if(PC.ls==LS_NAME_SQUARE_PART)
                                         if(--lexical_brackets_nestage==0) {// $name.[co<]?>de<]?>                                          if(--lexical_brackets_nestage==0) {// $name.[co<]?>de<]?>
                                                 pop_LS(pc); // $name.[co<]>de<]!>                                                  pop_LS(PC); // $name.[co<]>de<]!>
                                                 RC;                                                  RC;
                                         }                                          }
                                 break;                                  break;
                         case '[': // $name.[co<[>de]                          case '[': // $name.[co<[>de]
                                 if(pc.ls==LS_NAME_SQUARE_PART)                                  if(PC.ls==LS_NAME_SQUARE_PART)
                                         lexical_brackets_nestage++;                                          lexical_brackets_nestage++;
                                 break;                                  break;
                         }                          }
Line 2094  default: Line 2068  default:
                 case LS_USER_COMMENT:                  case LS_USER_COMMENT:
                         if(c=='\n') {                          if(c=='\n') {
                                 // skip comment                                  // skip comment
                                 begin=pc.source;                                  begin=PC.source;
                                 begin_pos=pc.pos;                                  begin_line=PC.line;
   
                                 pop_LS(pc);                                  pop_LS(PC);
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2109  default: Line 2083  default:
                         case '"':                          case '"':
                         case '\'':                          case '\'':
                                 if(                                  if(
                                         pc.ls == LS_EXPRESSION_STRING_QUOTED && c=='"' ||                                          PC.ls == LS_EXPRESSION_STRING_QUOTED && c=='"' ||
                                         pc.ls == LS_EXPRESSION_STRING_APOSTROFED && c=='\'') {                                          PC.ls == LS_EXPRESSION_STRING_APOSTROFED && c=='\'') {
                                         pop_LS(pc); //"abc". | 'abc'.                                          pop_LS(PC); //"abc". | 'abc'.
                                         RC;                                          RC;
                                 }                                  }
                                 break;                                  break;
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2128  default: Line 2102  default:
                 case LS_DEF_NAME:                  case LS_DEF_NAME:
                         switch(c) {                          switch(c) {
                         case '[':                          case '[':
                                 pc.ls=LS_DEF_PARAMS;                                  PC.ls=LS_DEF_PARAMS;
                                 RC;                                  RC;
                         case '\n':                          case '\n':
                                 pc.ls=LS_DEF_SPECIAL_BODY;                                  PC.ls=LS_DEF_SPECIAL_BODY;
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2144  default: Line 2118  default:
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 pc.ls=*pc.source=='['?LS_DEF_LOCALS:LS_DEF_COMMENT;                                  PC.ls=*PC.source=='['?LS_DEF_LOCALS:LS_DEF_COMMENT;
                                 RC;                                  RC;
                         case '\n': // wrong. bailing out                          case '\n': // wrong. bailing out
                                 pop_LS(pc);                                  pop_LS(PC);
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2158  default: Line 2132  default:
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 pc.ls=LS_DEF_COMMENT;                                  PC.ls=LS_DEF_COMMENT;
                                 RC;                                  RC;
                         case '\n': // wrong. bailing out                          case '\n': // wrong. bailing out
                                 pop_LS(pc);                                  pop_LS(PC);
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
   
                 case LS_DEF_COMMENT:                  case LS_DEF_COMMENT:
                         if(c=='\n') {                          if(c=='\n') {
                                 pop_LS(pc);                                  pop_LS(PC);
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2184  default: Line 2158  default:
                         switch(c) {                          switch(c) {
                         case ')':                          case ')':
                                 if(--lexical_brackets_nestage==0)                                  if(--lexical_brackets_nestage==0)
                                         if(pc.ls==LS_METHOD_ROUND) // method round param ended                                          if(PC.ls==LS_METHOD_ROUND) // method round param ended
                                                 pc.ls=LS_METHOD_AFTER; // look for method end                                                  PC.ls=LS_METHOD_AFTER; // look for method end
                                         else // pc.ls==LS_VAR_ROUND // variable constructor ended                                          else // PC.ls==LS_VAR_ROUND // variable constructor ended
                                                 pop_LS(pc); // return to normal life                                                  pop_LS(PC); // return to normal life
                                 RC;                                  RC;
                         case '#': // comment start skipping                          case '#': // comment start skipping
                                 if(end!=begin) {                                  if(end!=begin) {
                                         if(!pc.string_start)  
                                                 pc.string_start=begin_pos;  
                                         // append piece till #                                          // append piece till #
                                         pc.string.append_strdup(begin, end-begin);                                          PC.string->APPEND_CLEAN(begin, end-begin, PC.file, begin_line);
                                 }                                  }
                                 // fall into COMMENT lexical state [wait for \n]                                  // fall into COMMENT lexical state [wait for \n]
                                 push_LS(pc, LS_EXPRESSION_COMMENT);                                  push_LS(PC, LS_EXPRESSION_COMMENT);
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 continue;                                  continue;
                         case '$':                          case '$':
                                 push_LS(pc, LS_EXPRESSION_VAR_NAME_WITH_COLON);                                                           push_LS(PC, LS_EXPRESSION_VAR_NAME_WITH_COLON);                         
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case '(':                          case '(':
                                 lexical_brackets_nestage++;                                  lexical_brackets_nestage++;
                                 RC;                                  RC;
                         case '-':                          case '-':
                                 switch(*pc.source) {                                  switch(*PC.source) {
                                 case 'f': // -f                                  case 'f': // -f
                                         skip_analized=1;                                          skip_analized=1;
                                         result=FEXISTS;                                          result=FEXISTS;
Line 2229  default: Line 2201  default:
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case '&': case '|':                          case '&': case '|':
                                 if(*pc.source==c) { // && ||                                  if(*PC.source==c) { // && ||
                                         result=c=='&'?LAND:LOR;                                          result=c=='&'?LAND:LOR;
                                         skip_analized=1;                                          skip_analized=1;
                                 } else                                  } else
                                         result=c;                                          result=c;
                                 goto break2;                                  goto break2;
                         case '!':                          case '!':
                                 switch(pc.source[0]) {                                   switch(PC.source[0]) { 
                                 case '|': // !| !||                                  case '|': // !| !||
                                         skip_analized=1;                                          skip_analized=1;
                                         if(pc.source[1]=='|') {                                          if(PC.source[1]=='|') {
                                                 skip_analized++;                                                  skip_analized++;
                                                 result=LXOR;                                                  result=LXOR;
                                         } else                                          } else
Line 2253  default: Line 2225  default:
                                 RC;                                  RC;
   
                         case '<': // <<, <=, <                          case '<': // <<, <=, <
                                 switch(*pc.source) {                                  switch(*PC.source) {
                                 case '<': // <[<]                                  case '<': // <[<]
                                         skip_analized=1; result=NSL; break;                                          skip_analized=1; result=NSL; break;
                                 case '=': // <[=]                                  case '=': // <[=]
Line 2263  default: Line 2235  default:
                                 }                                  }
                                 goto break2;                                  goto break2;
                         case '>': // >>, >=, >                          case '>': // >>, >=, >
                                 switch(*pc.source) {                                  switch(*PC.source) {
                                 case '>': // >[>]                                  case '>': // >[>]
                                         skip_analized=1; result=NSR; break;                                          skip_analized=1; result=NSR; break;
                                 case '=': // >[=]                                  case '=': // >[=]
Line 2273  default: Line 2245  default:
                                 }                                  }
                                 goto break2;                                  goto break2;
                         case '=': // ==                          case '=': // ==
                                 switch(*pc.source) {                                  switch(*PC.source) {
                                 case '=': // =[=]                                  case '=': // =[=]
                                         skip_analized=1; result=NEQ; break;                                          skip_analized=1; result=NEQ; break;
                                 default: // =[]                                  default: // =[]
Line 2282  default: Line 2254  default:
                                 goto break2;                                  goto break2;
   
                         case '"':                          case '"':
                                 push_LS(pc, LS_EXPRESSION_STRING_QUOTED);                                  push_LS(PC, LS_EXPRESSION_STRING_QUOTED);
                                 RC;                                  RC;
                         case '\'':                          case '\'':
                                 push_LS(pc, LS_EXPRESSION_STRING_APOSTROFED);                                  push_LS(PC, LS_EXPRESSION_STRING_APOSTROFED);
                                 RC;                                  RC;
                         case 'l': case 'g': case 'e': case 'n':                          case 'l': case 'g': case 'e': case 'n':
                                 if(end==begin) // right after whitespace                                  if(end==begin) // right after whitespace
                                         if(isspace(pc.source[1])) {                                          if(isspace(PC.source[1])) {
                                                 switch(*pc.source) {                                                  switch(*PC.source) {
                                                         //                                      case '?': // ok [and bad cases, yacc would bark at them]                                                          //                                      case '?': // ok [and bad cases, yacc would bark at them]
                                                 case 't': // lt gt [et nt]                                                  case 't': // lt gt [et nt]
                                                         result=c=='l'?SLT:c=='g'?SGT:BAD_STRING_COMPARISON_OPERATOR;                                                          result=c=='l'?SLT:c=='g'?SGT:BAD_STRING_COMPARISON_OPERATOR;
Line 2309  default: Line 2281  default:
                                 break;                                  break;
                         case 'i':                          case 'i':
                                 if(end==begin) // right after whitespace                                  if(end==begin) // right after whitespace
                                         if(isspace(pc.source[1])) {                                          if(isspace(PC.source[1])) {
                                                 switch(pc.source[0]) {                                                  switch(PC.source[0]) {
                                                 case 'n': // in                                                  case 'n': // in
                                                         skip_analized=1;                                                          skip_analized=1;
                                                         result=IN;                                                          result=IN;
Line 2324  default: Line 2296  default:
                                 break;                                  break;
                         case 'd':                          case 'd':
                                 if(end==begin) // right after whitespace                                  if(end==begin) // right after whitespace
                                         if(pc.source[0]=='e' && pc.source[1]=='f') { // def                                          if(PC.source[0]=='e' && PC.source[1]=='f') { // def
                                                 skip_analized=2;                                                  skip_analized=2;
                                                 result=DEF;                                                  result=DEF;
                                                 goto break2;                                                  goto break2;
Line 2338  default: Line 2310  default:
                                 // that's a leading|traling space or after-operator-space                                  // that's a leading|traling space or after-operator-space
                                 // ignoring it                                  // ignoring it
                                 // reset piece 'begin' position & line                                  // reset piece 'begin' position & line
                                 begin=pc.source; // after whitespace char                                  begin=PC.source; // after whitespace char
                                 begin_pos=pc.pos;                                  begin_line=PC.line;
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2347  default: Line 2319  default:
                         if(c=='(')                          if(c=='(')
                                 lexical_brackets_nestage++;                                  lexical_brackets_nestage++;
                                                   
                         switch(*pc.source) {                          switch(*PC.source) {
                         case '\n': case ')':                          case '\n': case ')':
                                 if(*pc.source==')')                                  if(*PC.source==')')
                                         if(--lexical_brackets_nestage!=0)                                          if(--lexical_brackets_nestage!=0)
                                                 continue;                                                  continue;
   
                                 // skip comment                                  // skip comment
                                 begin=pc.source;                                  begin=PC.source;
                                 begin_pos=pc.pos;                                  begin_line=PC.line;
   
                                 pop_LS(pc);                                  pop_LS(PC);
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2368  default: Line 2340  default:
                 case LS_EXPRESSION_VAR_NAME_WITH_COLON:                   case LS_EXPRESSION_VAR_NAME_WITH_COLON: 
                 case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:                  case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:
                         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                                   // name in expr ends also before 
                                 switch(c) {                                  switch(c) {
                                 // expression minus                                  // expression minus
                                 case '-':                                   case '-': 
                                 // expression integer division                                  // expression integer division
                                 case '\\':                                  case '\\':
                                         pop_LS(pc);                                          pop_LS(PC);
                                         ungetc(pc, last_line_end_col);                                          PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }
                                         result=EON;                                          result=EON;
                                         goto break2;                                          goto break2;
                                 }                                  }
                         }                          }
                         if(                          if(
                                 pc.ls==LS_VAR_NAME_SIMPLE_WITHOUT_COLON ||                                  PC.ls==LS_VAR_NAME_SIMPLE_WITHOUT_COLON ||
                                 pc.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) {                                  PC.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) {
                                 // name already has ':', stop before next                                   // name already has ':', stop before next 
                                 switch(c) {                                  switch(c) {
                                 case ':':                                   case ':': 
                                         pop_LS(pc);                                          pop_LS(PC);
                                         ungetc(pc, last_line_end_col);                                          PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }
                                         result=EON;                                          result=EON;
                                         goto break2;                                          goto break2;
                                 }                                  }
Line 2408  default: Line 2380  default:
                         case ',': case '?': case '#':                          case ',': case '?': case '#':
                         // before call                          // before call
                         case '^':                           case '^': 
                                 pop_LS(pc);                                  pop_LS(PC);
                                 ungetc(pc, last_line_end_col);                                  PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }
                                 result=EON;                                  result=EON;
                                 goto break2;                                  goto break2;
                         case '[':                          case '[':
                                 // $name.<[>code]                                  // $name.<[>code]
                                 if(pc.pos.col>1/*not first column*/ && (                                  if(PC.col>1/*not first column*/ && (
                                         end[-1]=='$'/*was start of get*/ ||                                          end[-1]=='$'/*was start of get*/ ||
                                         end[-1]==':'/*was class name delim */ ||                                          end[-1]==':'/*was class name delim */ ||
                                         end[-1]=='.'/*was name delim */                                          end[-1]=='.'/*was name delim */
                                         )) {                                          )) {
                                         push_LS(pc, LS_NAME_SQUARE_PART);                                          push_LS(PC, LS_NAME_SQUARE_PART);
                                         lexical_brackets_nestage=1;                                          lexical_brackets_nestage=1;
                                         RC;                                          RC;
                                 }                                  }
                                 pc.ls=LS_VAR_SQUARE;                                  PC.ls=LS_VAR_SQUARE;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '{':                          case '{':
                                 if(begin==end) { // ${name}, no need of EON, switching LS                                  if(begin==end) { // ${name}, no need of EON, switching LS
                                         pc.ls=LS_VAR_NAME_CURLY;                                           PC.ls=LS_VAR_NAME_CURLY; 
                                 } else {                                  } else {
                                         pc.ls=LS_VAR_CURLY;                                          PC.ls=LS_VAR_CURLY;
                                         lexical_brackets_nestage=1;                                          lexical_brackets_nestage=1;
                                 }                                  }
   
                                 RC;                                  RC;
                         case '(':                          case '(':
                                 pc.ls=LS_VAR_ROUND;                                  PC.ls=LS_VAR_ROUND;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '.': // name part delim                          case '.': // name part delim
                         case '$': // name part subvar                          case '$': // name part subvar
                         case ':': // class<:>name                          case ':': // class<:>name
                                 // go to _WITHOUT_COLON state variant...                                  // go to _WITHOUT_COLON state variant...
                                 if(pc.ls==LS_VAR_NAME_SIMPLE_WITH_COLON)                                  if(PC.ls==LS_VAR_NAME_SIMPLE_WITH_COLON)
                                         pc.ls=LS_VAR_NAME_SIMPLE_WITHOUT_COLON;                                          PC.ls=LS_VAR_NAME_SIMPLE_WITHOUT_COLON;
                                 else if(pc.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON)                                  else if(PC.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON)
                                         pc.ls=LS_EXPRESSION_VAR_NAME_WITHOUT_COLON;                                          PC.ls=LS_EXPRESSION_VAR_NAME_WITHOUT_COLON;
                                 // ...stop before next ':'                                  // ...stop before next ':'
                                 RC;                                  RC;
                         }                          }
Line 2456  default: Line 2428  default:
                         switch(c) {                          switch(c) {
                         case '[':                          case '[':
                                 // ${name.<[>code]}                                  // ${name.<[>code]}
                                 push_LS(pc, LS_NAME_SQUARE_PART);                                  push_LS(PC, LS_NAME_SQUARE_PART);
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '}': // ${name} finished, restoring LS                          case '}': // ${name} finished, restoring LS
                                 pop_LS(pc);                                  pop_LS(PC);
                                 RC;                                  RC;
                         case '.': // name part delim                          case '.': // name part delim
                         case '$': // name part subvar                          case '$': // name part subvar
Line 2472  default: Line 2444  default:
                 case LS_VAR_SQUARE:                  case LS_VAR_SQUARE:
                         switch(c) {                          switch(c) {
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 if(--lexical_brackets_nestage==0) {                                  if(--lexical_brackets_nestage==0) {
                                         pop_LS(pc);                                          pop_LS(PC);
                                         RC;                                          RC;
                                 }                                  }
                                 break;                                  break;
Line 2494  default: Line 2466  default:
                 case LS_VAR_CURLY:                  case LS_VAR_CURLY:
                         switch(c) {                          switch(c) {
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case '}':                          case '}':
                                 if(--lexical_brackets_nestage==0) {                                  if(--lexical_brackets_nestage==0) {
                                         pop_LS(pc);                                          pop_LS(PC);
                                         RC;                                          RC;
                                 }                                  }
                                 break;                                  break;
Line 2516  default: Line 2488  default:
                         switch(c) {                          switch(c) {
                         case '[':                          case '[':
                                 // ^name.<[>code].xxx                                  // ^name.<[>code].xxx
                                 if(pc.pos.col>1/*not first column*/ && (                                  if(PC.col>1/*not first column*/ && (
                                         end[-1]=='^'/*was start of call*/ || // never, ^[ is literal...                                          end[-1]=='^'/*was start of call*/ || // never, ^[ is literal...
                                         end[-1]==':'/*was class name delim */ ||                                          end[-1]==':'/*was class name delim */ ||
                                         end[-1]=='.'/*was name delim */                                          end[-1]=='.'/*was name delim */
                                         )) {                                          )) {
                                         push_LS(pc, LS_NAME_SQUARE_PART);                                          push_LS(PC, LS_NAME_SQUARE_PART);
                                         lexical_brackets_nestage=1;                                          lexical_brackets_nestage=1;
                                         RC;                                          RC;
                                 }                                  }
                                 pc.ls=LS_METHOD_SQUARE;                                  PC.ls=LS_METHOD_SQUARE;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '{':                          case '{':
                                 pc.ls=LS_METHOD_CURLY;                                  PC.ls=LS_METHOD_CURLY;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '(':                          case '(':
                                 pc.ls=LS_METHOD_ROUND;                                  PC.ls=LS_METHOD_ROUND;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         case '.': // name part delim                           case '.': // name part delim 
Line 2548  default: Line 2520  default:
                 case LS_METHOD_SQUARE:                  case LS_METHOD_SQUARE:
                         switch(c) {                          switch(c) {
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case ';': // param delim                          case ';': // param delim
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 if(--lexical_brackets_nestage==0) {                                  if(--lexical_brackets_nestage==0) {
                                         pc.ls=LS_METHOD_AFTER;                                          PC.ls=LS_METHOD_AFTER;
                                         RC;                                          RC;
                                 }                                  }
                                 break;                                  break;
Line 2570  default: Line 2542  default:
                 case LS_METHOD_CURLY:                  case LS_METHOD_CURLY:
                         switch(c) {                          switch(c) {
                         case '$':                          case '$':
                                 push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);                                  push_LS(PC, LS_VAR_NAME_SIMPLE_WITH_COLON);
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(pc, LS_METHOD_NAME);                                  push_LS(PC, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case ';': // param delim                          case ';': // param delim
                                 RC;                                  RC;
                         case '}':                          case '}':
                                 if(--lexical_brackets_nestage==0) {                                  if(--lexical_brackets_nestage==0) {
                                         pc.ls=LS_METHOD_AFTER;                                          PC.ls=LS_METHOD_AFTER;
                                         RC;                                          RC;
                                 }                                  }
                                 break;                                  break;
Line 2591  default: Line 2563  default:
   
                 case LS_METHOD_AFTER:                  case LS_METHOD_AFTER:
                         if(c=='[') {/* ][ }[ )[ */                          if(c=='[') {/* ][ }[ )[ */
                                 pc.ls=LS_METHOD_SQUARE;                                  PC.ls=LS_METHOD_SQUARE;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         }                                                                    }                                          
                         if(c=='{') {/* ]{ }{ ){ */                          if(c=='{') {/* ]{ }{ ){ */
                                 pc.ls=LS_METHOD_CURLY;                                  PC.ls=LS_METHOD_CURLY;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         }                                                                    }                                          
                         if(c=='(') {/* ]( }( )( */                          if(c=='(') {/* ]( }( )( */
                                 pc.ls=LS_METHOD_ROUND;                                  PC.ls=LS_METHOD_ROUND;
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 RC;                                  RC;
                         }                                                                    }                                          
                         pop_LS(pc);                          pop_LS(PC);
                         ungetc(pc, last_line_end_col);                          PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }
                         result=EON;                          result=EON;
                         goto break2;                          goto break2;
                 }                  }
Line 2624  break2: Line 2596  break2:
                         if(end!=begin && end[-1]=='\n') // allow one empty line before LS_DEF_NAME                          if(end!=begin && end[-1]=='\n') // allow one empty line before LS_DEF_NAME
                                 end--;                                  end--;
                 }                  }
                 if(end!=begin && pc.ls!=LS_USER_COMMENT) { // last piece still alive and not comment?                  if(end!=begin && PC.ls!=LS_USER_COMMENT) { // last piece still alive and not comment?
                         if(!pc.string_start)  
                                 pc.string_start=begin_pos;  
                         // append it                          // append it
                         pc.string.append_strdup(begin, end-begin);                          PC.string->APPEND_CLEAN(begin, end-begin, PC.file, begin_line/*, start_col*/);
                 }                  }
         }          }
         if(!pc.string.is_empty()) { // 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(                  *lvalp=VL(NEW VString(*PC.string));
                         new VString(*new String(pc.string, String::L_CLEAN)),  
                         pc.file_no, pc.string_start.line, pc.string_start.col);  
                 // new pieces storage                  // new pieces storage
                 pc.string.clear();                  PC.string=NEW String(POOL);
                 pc.string_start.clear();  
                 // 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;
         }          }
         if(skip_analized) {          if(skip_analized) {
                 pc.source+=skip_analized;  pc.pos.col+=skip_analized;                  PC.source+=skip_analized;  PC.col+=skip_analized;
         }          }
         return result;          return result;
 }  }
   
 static int real_yyerror(Parse_control *pc, char *s) {  // Called by yyparse on error  static int real_yyerror(parse_control *pc, char *s) {  // Called by yyparse on error
            strncpy(PC.error, s, MAX_STRING);             strncpy(PC.error, s, MAX_STRING);
            return 1;             return 1;
 }  }
   
 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());                  fprintf(file, " \"%s\"", LA2S(value)->cstr());
 }  }

Removed from v.1.81.2.13.2.22  
changed lines
  Added in v.1.83


E-mail: