Diff for /parser3/src/main/compile.tab.C between versions 1.60 and 1.100

version 1.60, 2002/08/13 13:02:40 version 1.100, 2004/04/06 14:15:22
Line 10 Line 10
 #define BAD_STRING_COMPARISON_OPERATOR  260  #define BAD_STRING_COMPARISON_OPERATOR  260
 #define BAD_HEX_LITERAL 261  #define BAD_HEX_LITERAL 261
 #define BAD_METHOD_DECL_START   262  #define BAD_METHOD_DECL_START   262
 #define LAND    263  #define BAD_METHOD_PARAMETER_NAME_CHARACTER     263
 #define LOR     264  #define BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE     264
 #define LXOR    265  #define LAND    265
 #define NLE     266  #define LOR     266
 #define NGE     267  #define LXOR    267
 #define NEQ     268  #define NXOR    268
 #define NNE     269  #define NLE     269
 #define SLT     270  #define NGE     270
 #define SGT     271  #define NEQ     271
 #define SLE     272  #define NNE     272
 #define SGE     273  #define NSL     273
 #define SEQ     274  #define NSR     274
 #define SNE     275  #define SLT     275
 #define DEF     276  #define SGT     276
 #define IN      277  #define SLE     277
 #define FEXISTS 278  #define SGE     278
 #define DEXISTS 279  #define SEQ     279
 #define IS      280  #define SNE     280
 #define NEG     281  #define DEF     281
   #define IN      282
   #define FEXISTS 283
   #define DEXISTS 284
   #define IS      285
   #define NUNARY  286
   
 #line 1 "compile.y"  #line 1 "compile.y"
   
 /** @file  /** @file
         Parser: compiler(lexical parser and grammar).          Parser: compiler(lexical parser and grammar).
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)          Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
   
         $Id$          $Id$
Line 52 Line 57
                 -#:     in iis make up specialized Pool object for that                  -#:     in iis make up specialized Pool object for that
 */  */
   
 #define YYSTYPE  Array/*<Operation>*/ *  #define YYSTYPE  ArrayOperation* 
 #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 67 Line 74
 #include "pa_vdouble.h"  #include "pa_vdouble.h"
 #include "pa_globals.h"  #include "pa_globals.h"
 #include "pa_vvoid.h"  #include "pa_vvoid.h"
   #include "pa_vmethod_frame.h"
   
   // defines
   
 #define SELF_ELEMENT_NAME "self"  
 #define USE_CONTROL_METHOD_NAME "USE"  #define USE_CONTROL_METHOD_NAME "USE"
   
 static int real_yyerror(parse_control *pc, char *s);  // forwards
 static void yyprint(FILE *file, int type, YYSTYPE value);  
 static int yylex(YYSTYPE *lvalp, void *pc);  
   
   static int real_yyerror(Parse_control* pc, char* s);
   static void yyprint(FILE* file, int type, YYSTYPE value);
   static int yylex(YYSTYPE* lvalp, void* pc);
   
 // local convinient inplace typecast & var  // local convinient inplace typecast & var
 #define PC  (*(parse_control *)pc)  #undef 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 95  static int yylex(YYSTYPE *lvalp, void *p Line 105  static int yylex(YYSTYPE *lvalp, void *p
   
   
   
 #define YYFINAL         248  #define YYFINAL         259
 #define YYFLAG          -32768  #define YYFLAG          -32768
 #define YYNTBASE        56  #define YYNTBASE        60
   
 #define YYTRANSLATE(x) ((unsigned)(x) <= 281 ? yytranslate[x] : 135)  #define YYTRANSLATE(x) ((unsigned)(x) <= 286 ? yytranslate[x] : 146)
   
 static const char yytranslate[] = {     0,  static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,    42,       2,     2,     2,     2,     2,     2,     2,     2,     2,    46,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,    29,    54,    30,    46,    38,    32,    55,    50,       2,     2,    44,    58,     2,    50,    41,    35,    59,    54,
     51,    36,    35,     2,    34,    49,    37,     2,     2,     2,      55,    38,    36,     2,    37,    53,    39,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,    53,    45,    27,       2,     2,     2,     2,     2,     2,     2,    57,    49,    32,
      2,    28,     2,    41,     2,     2,     2,     2,     2,     2,       2,    33,     2,    45,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     43,    39,    44,    52,     2,     2,     2,     2,     2,     2,      47,    40,    48,    56,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,    47,    31,    48,    33,     2,     2,     2,     2,       2,     2,    51,    34,    52,    43,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Line 130  static const char yytranslate[] = { Line 140  static const char yytranslate[] = {
      2,     2,     2,     2,     2,     1,     3,     4,     5,     6,       2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
      7,     8,     9,    10,    11,    12,    13,    14,    15,    16,       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
     17,    18,    19,    20,    21,    22,    23,    24,    25,    26,      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
     40      27,    28,    29,    30,    31,    42
 };  };
   
 #if YYDEBUG != 0  #if YYDEBUG != 0
 static const short yyprhs[] = {     0,  static const short yyprhs[] = {     0,
      0,     2,     4,     6,     9,    11,    13,    15,    20,    22,       0,     2,     4,     6,     9,    11,    13,    15,    20,    22,
     24,    26,    29,    32,    34,    36,    44,    46,    48,    52,      24,    26,    29,    32,    34,    36,    37,    46,    48,    50,
     54,    56,    58,    62,    64,    66,    68,    70,    72,    75,      54,    56,    58,    60,    64,    66,    68,    70,    72,    74,
     77,    79,    81,    83,    85,    87,    90,    93,    95,    99,      77,    79,    81,    83,    85,    87,    89,    92,    95,    97,
    101,   103,   105,   108,   110,   113,   117,   119,   121,   123,     101,   103,   105,   107,   110,   112,   115,   119,   121,   123,
    125,   128,   131,   133,   135,   137,   141,   145,   149,   151,     125,   127,   130,   133,   135,   137,   139,   140,   141,   147,
    153,   155,   157,   159,   161,   164,   166,   167,   168,   175,     151,   155,   157,   159,   161,   163,   165,   167,   170,   172,
    177,   179,   182,   184,   186,   188,   192,   196,   200,   202,     173,   174,   181,   183,   185,   188,   190,   192,   194,   195,
    206,   208,   212,   214,   218,   220,   222,   224,   226,   228,     196,   202,   206,   210,   212,   216,   218,   222,   224,   228,
    230,   232,   234,   237,   239,   242,   245,   247,   249,   252,     230,   232,   234,   236,   238,   240,   242,   244,   247,   249,
    254,   256,   258,   260,   263,   266,   270,   272,   274,   277,     252,   255,   257,   259,   262,   264,   266,   268,   270,   273,
    280,   282,   284,   287,   290,   292,   294,   296,   298,   302,     276,   277,   278,   284,   286,   288,   291,   294,   296,   298,
    306,   310,   313,   316,   319,   322,   325,   328,   331,   334,     301,   304,   306,   308,   310,   312,   316,   320,   324,   327,
    338,   342,   346,   350,   354,   358,   362,   366,   370,   374,     330,   333,   336,   339,   342,   345,   348,   352,   356,   360,
    378,   382,   386,   390,   394,   398,   402,   406,   410,   414,     364,   368,   372,   376,   380,   384,   388,   392,   396,   400,
    418,   422,   426,   430,   434,   436,   438,   439     404,   408,   412,   416,   420,   424,   428,   432,   436,   440,
      444,   448,   452,   456,   458,   460,   461
 };  };
   
 static const short yyrhs[] = {    58,  static const short yyrhs[] = {    62,
      0,    57,     0,    59,     0,    57,    59,     0,    71,     0,       0,    61,     0,    63,     0,    61,    63,     0,    76,     0,
     60,     0,    65,     0,    41,     4,    42,    61,     0,   134,      64,     0,    69,     0,    45,     4,    46,    65,     0,   145,
      0,    62,     0,    63,     0,    62,    63,     0,    64,    42,       0,    66,     0,    67,     0,    66,    67,     0,    68,    46,
      0,   134,     0,     4,     0,    41,     4,    67,    66,    70,       0,   145,     0,     4,     0,     0,    45,     4,    72,    71,
     42,    71,     0,   134,     0,    67,     0,    43,    68,    44,      75,    46,    70,    76,     0,   145,     0,    72,     0,    47,
      0,   134,     0,    69,     0,     4,     0,    69,    45,     4,      73,    48,     0,   145,     0,    74,     0,     4,     0,    74,
      0,   134,     0,     4,     0,   134,     0,    72,     0,    73,      49,     4,     0,   145,     0,     4,     0,   145,     0,    77,
      0,    72,    73,     0,   132,     0,    74,     0,    75,     0,       0,    78,     0,    77,    78,     0,   143,     0,    79,     0,
     83,     0,    96,     0,    76,     0,    46,    77,     0,    79,      80,     0,    88,     0,   103,     0,    81,     0,    50,    82,
      3,     0,    78,     0,    47,    79,    48,     0,    80,     0,       0,    84,     3,     0,    83,     0,    51,    84,    52,     0,
     81,     0,    82,     0,   126,    82,     0,   118,     0,   115,      85,     0,    86,     0,    87,     0,   137,    87,     0,   127,
    118,     0,    46,    84,    88,     0,    85,     0,    86,     0,       0,   124,   127,     0,    50,    89,    93,     0,    90,     0,
     87,     0,   114,     0,    49,   114,     0,   126,   114,     0,      91,     0,    92,     0,   123,     0,    53,   123,     0,   137,
     89,     0,    90,     0,    91,     0,    43,    92,    44,     0,     123,     0,    94,     0,    97,     0,    98,     0,     0,     0,
     50,   129,    51,     0,    47,    71,    48,     0,   133,     0,      47,    95,    99,    96,    48,     0,    54,   140,    55,     0,
      4,     0,    93,     0,    94,     0,    95,     0,    74,     0,      51,    76,    52,     0,   144,     0,     4,     0,   100,     0,
     73,    72,     0,    97,     0,     0,     0,    52,    98,   100,     101,     0,   102,     0,    79,     0,    78,    77,     0,   104,
     99,   101,     3,     0,    79,     0,   102,     0,   101,   102,       0,     0,     0,    56,   105,   107,   106,   108,     3,     0,
      0,   103,     0,   104,     0,   105,     0,    43,   106,    44,      84,     0,   109,     0,   108,   109,     0,   110,     0,   113,
      0,    50,   107,    51,     0,    47,   108,    48,     0,   109,       0,   114,     0,     0,     0,    47,   111,   115,   112,    48,
      0,   106,    45,   109,     0,   110,     0,   107,    45,   110,       0,    54,   116,    55,     0,    51,   117,    52,     0,   118,
      0,   111,     0,   108,    45,   111,     0,   112,     0,   113,       0,   115,    49,   118,     0,   119,     0,   116,    49,   119,
      0,    71,     0,   133,     0,     4,     0,    93,     0,   129,       0,   120,     0,   117,    49,   120,     0,   121,     0,   122,
      0,   119,     0,   115,   119,     0,   116,     0,   115,   116,       0,    76,     0,   144,     0,     4,     0,   100,     0,   140,
      0,   117,    49,     0,   119,     0,   119,     0,     4,     5,       0,   128,     0,   124,   128,     0,   125,     0,   124,   125,
      0,     4,     0,   120,     0,   121,     0,   122,     0,    46,       0,   126,    53,     0,   128,     0,   128,     0,     4,     5,
    123,     0,     4,   124,     0,    43,    72,    44,     0,     4,       0,     4,     0,   129,     0,   130,     0,   131,     0,    50,
      0,   125,     0,   124,   125,     0,    46,   123,     0,   127,     134,     0,     4,   135,     0,     0,     0,    47,   132,    77,
      0,   128,     0,     4,    53,     0,   127,    53,     0,   130,     133,    48,     0,     4,     0,   136,     0,   135,   136,     0,
      0,     4,     0,    76,     0,    97,     0,    54,   131,    54,      50,   134,     0,   138,     0,   139,     0,     4,    57,     0,
      0,    55,   131,    55,     0,    50,   130,    51,     0,    34,     138,    57,     0,   141,     0,     4,     0,    81,     0,   104,
    130,     0,    35,   130,     0,    33,   130,     0,    29,   130,       0,    58,   142,    58,     0,    59,   142,    59,     0,    54,
      0,    22,   130,     0,    23,   130,     0,    24,   130,     0,     141,    55,     0,    37,   141,     0,    36,   141,     0,    43,
     25,   130,     0,   130,    34,   130,     0,   130,    35,   130,     141,     0,    44,   141,     0,    27,   141,     0,    28,   141,
      0,   130,    36,   130,     0,   130,    37,   130,     0,   130,       0,    29,   141,     0,    30,   141,     0,   141,    37,   141,
     38,   130,     0,   130,    39,   130,     0,   130,    32,   130,       0,   141,    36,   141,     0,   141,    38,   141,     0,   141,
      0,   130,    31,   130,     0,   130,    30,   130,     0,   130,      39,   141,     0,   141,    41,   141,     0,   141,    40,   141,
      9,   130,     0,   130,    10,   130,     0,   130,    11,   130,       0,   141,    19,   141,     0,   141,    20,   141,     0,   141,
      0,   130,    27,   130,     0,   130,    28,   130,     0,   130,      35,   141,     0,   141,    34,   141,     0,   141,    14,   141,
     12,   130,     0,   130,    13,   130,     0,   130,    14,   130,       0,   141,    11,   141,     0,   141,    12,   141,     0,   141,
      0,   130,    15,   130,     0,   130,    16,   130,     0,   130,      13,   141,     0,   141,    32,   141,     0,   141,    33,   141,
     17,   130,     0,   130,    18,   130,     0,   130,    19,   130,       0,   141,    15,   141,     0,   141,    16,   141,     0,   141,
      0,   130,    20,   130,     0,   130,    21,   130,     0,   130,      17,   141,     0,   141,    18,   141,     0,   141,    21,   141,
     26,   130,     0,    71,     0,     4,     0,     0,     0       0,   141,    22,   141,     0,   141,    23,   141,     0,   141,
       24,   141,     0,   141,    25,   141,     0,   141,    26,   141,
        0,   141,    31,   141,     0,    76,     0,     4,     0,     0,
        0
 };  };
   
 #endif  #endif
   
 #if YYDEBUG != 0  #if YYDEBUG != 0
 static const short yyrline[] = { 0,  static const short yyrline[] = { 0,
    107,   117,   119,   119,   120,   122,   122,   124,   190,   190,     120,   128,   130,   130,   131,   133,   133,   135,   207,   207,
    191,   191,   192,   193,   193,   195,   224,   224,   225,   226,     208,   208,   209,   210,   210,   212,   247,   252,   252,   253,
    226,   227,   227,   229,   229,   233,   233,   235,   235,   236,     254,   254,   255,   255,   257,   257,   261,   261,   263,   263,
    236,   237,   237,   237,   241,   248,   249,   249,   250,   251,     264,   264,   265,   265,   265,   269,   276,   277,   277,   278,
    253,   254,   276,   277,   277,   281,   285,   287,   288,   289,     279,   281,   282,   304,   305,   305,   309,   313,   315,   316,
    306,   311,   313,   315,   316,   318,   324,   332,   338,   340,     317,   334,   339,   341,   343,   344,   346,   349,   351,   357,
    341,   343,   349,   350,   350,   354,   360,   363,   366,   379,     365,   371,   373,   374,   376,   382,   383,   383,   387,   393,
    381,   381,   382,   384,   385,   387,   388,   389,   390,   392,     396,   399,   412,   414,   414,   415,   417,   418,   420,   423,
    394,   396,   398,   400,   402,   406,   410,   414,   416,   417,     425,   426,   427,   428,   430,   432,   434,   436,   438,   440,
    419,   428,   428,   430,   430,   431,   432,   440,   445,   447,     444,   448,   452,   454,   455,   457,   466,   466,   468,   468,
    449,   450,   451,   453,   457,   466,   472,   477,   477,   478,     469,   470,   478,   483,   485,   487,   488,   489,   491,   495,
    483,   485,   487,   491,   503,   508,   510,   511,   512,   513,     504,   507,   509,   515,   520,   520,   521,   526,   528,   530,
    514,   516,   517,   518,   519,   520,   521,   522,   523,   525,     542,   554,   559,   561,   562,   563,   564,   565,   567,   568,
    526,   527,   528,   529,   530,   531,   532,   533,   534,   535,     569,   570,   571,   572,   573,   574,   576,   577,   578,   579,
    536,   537,   538,   539,   540,   541,   542,   543,   544,   545,     580,   581,   582,   583,   584,   585,   586,   587,   588,   589,
    546,   547,   548,   549,   552,   561,   566,   567     590,   591,   592,   593,   594,   595,   596,   597,   598,   599,
      600,   601,   602,   605,   614,   619,   620
 };  };
 #endif  #endif
   
Line 228  static const short yyrline[] = { 0, Line 243  static const short yyrline[] = { 0,
   
 static const char * const yytname[] = {   "$","error","$undefined.","EON","STRING",  static const char * const yytname[] = {   "$","error","$undefined.","EON","STRING",
 "BOGUS","BAD_STRING_COMPARISON_OPERATOR","BAD_HEX_LITERAL","BAD_METHOD_DECL_START",  "BOGUS","BAD_STRING_COMPARISON_OPERATOR","BAD_HEX_LITERAL","BAD_METHOD_DECL_START",
 "\"&&\"","\"||\"","\"##\"","\"<=\"","\">=\"","\"==\"","\"!=\"","\"lt\"","\"gt\"",  "BAD_METHOD_PARAMETER_NAME_CHARACTER","BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE",
 "\"le\"","\"ge\"","\"eq\"","\"ne\"","\"def\"","\"in\"","\"-f\"","\"-d\"","\"is\"",  "\"&&\"","\"||\"","\"!||\"","\"!|\"","\"<=\"","\">=\"","\"==\"","\"!=\"","\"<<\"",
 "'<'","'>'","'!'","'#'","'|'","'&'","'~'","'-'","'+'","'*'","'/'","'%'","'\\\\'",  "\">>\"","\"lt\"","\"gt\"","\"le\"","\"ge\"","\"eq\"","\"ne\"","\"def\"","\"in\"",
 "NEG","'@'","'\\n'","'['","']'","';'","'$'","'{'","'}'","'.'","'('","')'","'^'",  "\"-f\"","\"-d\"","\"is\"","'<'","'>'","'|'","'&'","'+'","'-'","'*'","'/'","'\\\\'",
 "':'","'\\\"'","'\\''","all","methods","one_big_piece","method","control_method",  "'%'","NUNARY","'~'","'!'","'@'","'\\n'","'['","']'","';'","'$'","'{'","'}'",
 "maybe_control_strings","control_strings","control_string","maybe_string","code_method",  "'.'","'('","')'","'^'","':'","'\\\"'","'\\''","all","methods","one_big_piece",
 "maybe_bracketed_strings","bracketed_maybe_strings","maybe_strings","strings",  "method","control_method","maybe_control_strings","control_strings","control_string",
 "maybe_comment","maybe_codes","codes","code","action","get","get_value","get_name_value",  "maybe_string","code_method","@1","maybe_bracketed_strings","bracketed_maybe_strings",
 "name_in_curly_rdive","name_without_curly_rdive","name_without_curly_rdive_read",  "maybe_strings","strings","maybe_comment","maybe_codes","codes","code","action",
 "name_without_curly_rdive_class","name_without_curly_rdive_code","put","name_expr_wdive",  "get","get_value","get_name_value","name_in_curly_rdive","name_without_curly_rdive",
 "name_expr_wdive_root","name_expr_wdive_write","name_expr_wdive_class","construct",  "name_without_curly_rdive_read","name_without_curly_rdive_class","name_without_curly_rdive_code",
 "construct_square","construct_round","construct_curly","any_constructor_code_value",  "put","name_expr_wdive","name_expr_wdive_root","name_expr_wdive_write","name_expr_wdive_class",
 "constructor_code_value","constructor_code","codes__excluding_sole_str_literal",  "construct","construct_square","@2","@3","construct_round","construct_curly",
 "call","call_value","@1","@2","call_name","store_params","store_param","store_square_param",  "any_constructor_code_value","constructor_code_value","constructor_code","codes__excluding_sole_str_literal",
 "store_round_param","store_curly_param","store_code_param_parts","store_expr_param_parts",  "call","call_value","@4","@5","call_name","store_params","store_param","store_square_param",
   "@6","@7","store_round_param","store_curly_param","store_code_param_parts","store_expr_param_parts",
 "store_curly_param_parts","store_code_param_part","store_expr_param_part","store_curly_param_part",  "store_curly_param_parts","store_code_param_part","store_expr_param_part","store_curly_param_part",
 "code_param_value","write_expr_value","name_expr_dive_code","name_path","name_step",  "code_param_value","write_expr_value","name_expr_dive_code","name_path","name_step",
 "name_advance1","name_advance2","name_expr_value","name_expr_subvar_value","name_expr_with_subvar_value",  "name_advance1","name_advance2","name_expr_value","name_expr_subvar_value","name_expr_with_subvar_value",
 "name_square_code_value","subvar_ref_name_rdive","subvar_get_writes","subvar__get_write",  "name_square_code_value","@8","@9","subvar_ref_name_rdive","subvar_get_writes",
 "class_prefix","class_static_prefix","class_constructor_prefix","expr_value",  "subvar__get_write","class_prefix","class_static_prefix","class_constructor_prefix",
 "expr","string_inside_quotes_value","write_string","void_value","empty", NULL  "expr_value","expr","string_inside_quotes_value","write_string","void_value",
   "empty", NULL
 };  };
 #endif  #endif
   
 static const short yyr1[] = {     0,  static const short yyr1[] = {     0,
     56,    56,    57,    57,    58,    59,    59,    60,    61,    61,      60,    60,    61,    61,    62,    63,    63,    64,    65,    65,
     62,    62,    63,    64,    64,    65,    66,    66,    67,    68,      66,    66,    67,    68,    68,    70,    69,    71,    71,    72,
     68,    69,    69,    70,    70,    71,    71,    72,    72,    73,      73,    73,    74,    74,    75,    75,    76,    76,    77,    77,
     73,    74,    74,    74,    75,    76,    77,    77,    78,    79,      78,    78,    79,    79,    79,    80,    81,    82,    82,    83,
     79,    80,    81,    82,    82,    83,    84,    84,    84,    85,      84,    84,    85,    86,    87,    87,    88,    89,    89,    89,
     86,    87,    88,    88,    88,    89,    90,    91,    92,    92,      90,    91,    92,    93,    93,    93,    95,    96,    94,    97,
     92,    93,    94,    95,    95,    96,    98,    99,    97,   100,      98,    99,    99,    99,   100,   101,   102,   102,   103,   105,
    101,   101,   102,   102,   102,   103,   104,   105,   106,   106,     106,   104,   107,   108,   108,   109,   109,   109,   111,   112,
    107,   107,   108,   108,   109,   110,   111,   112,   112,   112,     110,   113,   114,   115,   115,   116,   116,   117,   117,   118,
    113,   114,   114,   115,   115,   116,   117,   118,   118,   119,     119,   120,   121,   121,   121,   122,   123,   123,   124,   124,
    119,   119,   119,   120,   121,   122,   123,   124,   124,   125,     125,   126,   127,   127,   128,   128,   128,   128,   129,   130,
    126,   126,   127,   128,   129,   130,   130,   130,   130,   130,     132,   133,   131,   134,   135,   135,   136,   137,   137,   138,
    130,   130,   130,   130,   130,   130,   130,   130,   130,   130,     139,   140,   141,   141,   141,   141,   141,   141,   141,   141,
    130,   130,   130,   130,   130,   130,   130,   130,   130,   130,     141,   141,   141,   141,   141,   141,   141,   141,   141,   141,
    130,   130,   130,   130,   130,   130,   130,   130,   130,   130,     141,   141,   141,   141,   141,   141,   141,   141,   141,   141,
    130,   130,   130,   130,   131,   132,   133,   134     141,   141,   141,   141,   141,   141,   141,   141,   141,   141,
      141,   141,   141,   142,   143,   144,   145
 };  };
   
 static const short yyr2[] = {     0,  static const short yyr2[] = {     0,
      1,     1,     1,     2,     1,     1,     1,     4,     1,     1,       1,     1,     1,     2,     1,     1,     1,     4,     1,     1,
      1,     2,     2,     1,     1,     7,     1,     1,     3,     1,       1,     2,     2,     1,     1,     0,     8,     1,     1,     3,
      1,     1,     3,     1,     1,     1,     1,     1,     2,     1,       1,     1,     1,     3,     1,     1,     1,     1,     1,     2,
      1,     1,     1,     1,     1,     2,     2,     1,     3,     1,       1,     1,     1,     1,     1,     1,     2,     2,     1,     3,
      1,     1,     2,     1,     2,     3,     1,     1,     1,     1,       1,     1,     1,     2,     1,     2,     3,     1,     1,     1,
      2,     2,     1,     1,     1,     3,     3,     3,     1,     1,       1,     2,     2,     1,     1,     1,     0,     0,     5,     3,
      1,     1,     1,     1,     2,     1,     0,     0,     6,     1,       3,     1,     1,     1,     1,     1,     1,     2,     1,     0,
      1,     2,     1,     1,     1,     3,     3,     3,     1,     3,       0,     6,     1,     1,     2,     1,     1,     1,     0,     0,
      1,     3,     1,     3,     1,     1,     1,     1,     1,     1,       5,     3,     3,     1,     3,     1,     3,     1,     3,     1,
      1,     1,     2,     1,     2,     2,     1,     1,     2,     1,       1,     1,     1,     1,     1,     1,     1,     2,     1,     2,
      1,     1,     1,     2,     2,     3,     1,     1,     2,     2,       2,     1,     1,     2,     1,     1,     1,     1,     2,     2,
      1,     1,     2,     2,     1,     1,     1,     1,     3,     3,       0,     0,     5,     1,     1,     2,     2,     1,     1,     2,
      3,     2,     2,     2,     2,     2,     2,     2,     2,     3,       2,     1,     1,     1,     1,     3,     3,     3,     2,     2,
        2,     2,     2,     2,     2,     2,     3,     3,     3,     3,
      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
      3,     3,     3,     3,     1,     1,     0,     0       3,     3,     3,     1,     1,     0,     0
 };  };
   
 static const short yydefact[] = {   158,  static const short yydefact[] = {   167,
    156,     0,     0,    67,     2,     1,     3,     6,     7,     5,     165,     0,     0,    70,     2,     1,     3,     6,     7,     5,
     27,    28,    31,    32,    35,    33,    34,    66,    30,    26,      28,    29,    32,    33,    36,    34,    35,    69,    31,    27,
      0,   100,     0,     0,     0,     0,    36,    38,     0,    40,       0,   105,   111,     0,     0,     0,    37,    39,     0,    41,
     41,    42,     0,    47,    48,    49,    50,     0,    94,     0,      42,    43,     0,    48,    49,    50,    51,     0,    99,     0,
     44,    92,   101,   102,   103,     0,   111,   112,     0,     4,      45,    97,   106,   107,   108,     0,   118,   119,     0,     4,
     29,   158,   158,   158,    99,     0,   113,   105,   108,     0,      30,   167,   167,   167,   104,     0,   120,   110,   115,     0,
    107,   104,     0,     0,    98,     0,   100,    51,     0,    92,     114,   109,     0,     0,   103,     0,   105,    52,     0,    97,
     37,   157,   158,     0,    46,    53,    54,    55,   100,    95,      38,    57,   167,     0,    47,    54,    55,    56,   105,   100,
     45,    93,    96,    43,    52,   114,    70,    68,    15,     8,      46,    98,   101,    44,    53,   121,    73,    71,    15,     8,
     10,    11,     0,     9,    22,     0,    21,    20,   158,    18,      10,    11,     0,     9,    23,     0,    22,    21,   167,    19,
     17,   110,   109,   106,    39,    93,   156,     0,    31,     0,      18,   117,   116,   112,    40,    98,   166,     0,   123,     0,
     61,    62,    63,    59,     0,   116,     0,     0,     0,     0,       0,     0,     0,     0,     0,     0,     0,     0,     0,   167,
      0,     0,     0,     0,     0,     0,   158,   158,   117,   118,     167,   124,   125,     0,   122,     0,    12,    14,    13,    20,
      0,   115,     0,    12,    14,    13,    19,     0,    25,     0,       0,    26,     0,    25,     0,   165,     0,    32,    58,    64,
     24,    65,    56,    58,   126,   127,   128,   129,   125,   124,      65,    66,    62,    61,   133,   134,   135,   136,   130,   129,
    122,   123,     0,   155,     0,     0,    57,     0,     0,     0,     131,   132,     0,   164,     0,     0,    60,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,   157,   158,     0,     0,    71,    73,    74,    75,       0,     0,     0,     0,    79,   167,     0,     0,    74,    76,
     23,   158,   121,   119,   120,   139,   140,   141,   144,   145,      77,    78,    24,    16,   113,    68,     0,   128,   126,   127,
    146,   147,   148,   149,   150,   151,   152,   153,   154,   142,     148,   149,   150,   147,   153,   154,   155,   156,   143,   144,
    143,   138,   137,   136,   130,   131,   132,   133,   134,   135,     157,   158,   159,   160,   161,   162,   163,   151,   152,   146,
    156,    90,     0,    79,    85,    88,    87,     0,    83,     0,     145,   138,   137,   139,   140,   142,   141,   166,    92,     0,
     81,    86,    91,    69,    72,    16,    76,   157,   158,    78,      88,     0,    86,    91,    96,    72,    75,   167,    59,   165,
      0,    77,    80,    84,    82,     0,     0,     0      95,    80,    84,    90,    93,   167,    83,     0,    82,    17,
      166,     0,    89,    87,    85,    81,     0,     0,     0
 };  };
   
 static const short yydefgoto[] = {   246,  static const short yydefgoto[] = {   257,
      5,     6,     7,     8,    90,    91,    92,    93,     9,    99,       5,     6,     7,     8,    90,    91,    92,    93,     9,   238,
     54,    96,    97,   140,   154,    11,    12,    13,    14,   129,      99,    54,    96,    97,   133,   154,    11,    12,    13,    14,
     27,    28,    29,    30,    31,    32,    16,    33,    34,    35,     122,    27,    28,    29,    30,    31,    32,    16,    33,    34,
     36,    75,    76,    77,    78,   110,   222,   112,   113,    17,      35,    36,    75,    76,   107,   197,    77,    78,   139,   241,
    130,    49,   133,    88,   186,   187,   188,   189,   190,   223,     141,   142,    17,   123,    49,   126,    88,   188,   189,   190,
    230,   228,   224,   231,   229,   225,   232,    37,    64,    39,     228,   252,   191,   192,   242,   232,   230,   243,   233,   231,
     40,    41,    65,    43,    44,    45,    62,    58,    59,    66,     244,   234,    37,    64,    39,    40,    41,    65,    43,    44,
     47,    48,   233,   132,   155,    19,   226,    20      45,    60,   135,    62,    58,    59,    66,    47,    48,   235,
      125,   155,    19,   245,    20
 };  };
   
 static const short yypact[] = {     5,  static const short yypact[] = {    34,
 -32768,    20,    75,-32768,   -34,-32768,-32768,-32768,-32768,-32768,  -32768,    16,    61,-32768,   -19,-32768,-32768,-32768,-32768,-32768,
     18,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,      11,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
    -27,    31,    18,    27,    97,   102,-32768,-32768,    39,-32768,     -14,     9,-32768,    30,    94,   106,-32768,-32768,    44,-32768,
 -32768,-32768,    91,-32768,-32768,-32768,-32768,   103,-32768,    32,  -32768,-32768,   -26,-32768,-32768,-32768,-32768,   111,-32768,    -2,
 -32768,    42,-32768,-32768,-32768,   103,    34,-32768,    97,-32768,  -32768,     5,-32768,-32768,-32768,   111,    -4,-32768,    94,-32768,
 -32768,    89,    96,    52,-32768,    27,-32768,    56,-32768,    17,  -32768,    65,    72,    31,-32768,    30,-32768,    41,-32768,    11,
 -32768,-32768,    61,   103,    62,   103,    56,-32768,   102,    62,  -32768,-32768,    28,   111,    40,   111,    41,-32768,   106,    40,
 -32768,    36,    18,     4,-32768,-32768,-32768,-32768,    25,-32768,  -32768,-32768,    11,    27,-32768,-32768,-32768,-32768,    18,-32768,
 -32768,    42,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  -32768,     5,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
      6,-32768,    74,    78,-32768,    87,    94,-32768,   115,-32768,       6,-32768,    59,    67,-32768,    70,    77,-32768,   115,-32768,
 -32768,-32768,-32768,-32768,-32768,    62,    88,    18,    41,   106,  -32768,-32768,-32768,    11,-32768,    40,    38,    75,-32768,    27,
 -32768,-32768,-32768,-32768,   105,-32768,     4,     4,     4,     4,      27,    27,    27,    27,    27,    27,    27,    83,    27,    11,
      4,     4,     4,     4,    90,     4,    18,    18,-32768,-32768,      11,-32768,-32768,    73,   315,    78,-32768,-32768,-32768,-32768,
    101,   277,   104,-32768,-32768,-32768,-32768,   159,-32768,   123,     127,-32768,    89,-32768,    88,    90,    11,    -3,-32768,-32768,
 -32768,    18,-32768,-32768,   191,   191,   191,   191,   191,   198,  -32768,-32768,-32768,-32768,   140,   140,   140,   140,-32768,-32768,
 -32768,-32768,   234,-32768,   112,   113,-32768,     4,     4,     4,  -32768,-32768,   270,-32768,    84,    87,-32768,    27,    27,    27,
      4,     4,     4,     4,     4,     4,     4,     4,     4,     4,      27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
      4,     4,     4,     4,     4,     4,     4,     4,     4,     4,      27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
      4,     4,    37,    18,     4,    49,-32768,-32768,-32768,-32768,      27,    27,    27,    27,-32768,    11,    27,    45,-32768,-32768,
 -32768,    18,-32768,-32768,-32768,   367,   339,   308,   393,   393,  -32768,-32768,-32768,-32768,-32768,    11,    95,-32768,-32768,-32768,
    143,   143,   393,   393,   393,   393,   143,   143,   191,   393,     405,   377,   346,   278,   433,   433,   131,   131,   154,   154,
    393,   243,   401,   198,   152,   152,-32768,-32768,-32768,-32768,     433,   433,   433,   433,   131,   131,   140,   433,   433,   164,
     70,-32768,    81,-32768,-32768,-32768,-32768,   -28,-32768,    53,     441,   178,   178,-32768,-32768,-32768,-32768,    39,-32768,   -25,
 -32768,-32768,-32768,-32768,-32768,-32768,-32768,    37,    18,-32768,  -32768,   -33,-32768,-32768,-32768,-32768,-32768,    11,-32768,    68,
      4,-32768,-32768,-32768,-32768,   170,   171,-32768  -32768,   100,-32768,-32768,-32768,    11,-32768,    27,-32768,-32768,
       39,   104,-32768,-32768,-32768,-32768,   155,   157,-32768
 };  };
   
 static const short yypgoto[] = {-32768,  static const short yypgoto[] = {-32768,
 -32768,-32768,   167,-32768,-32768,-32768,   133,-32768,-32768,-32768,  -32768,-32768,   158,-32768,-32768,-32768,    82,-32768,-32768,-32768,
    139,-32768,-32768,-32768,     3,   -18,    -7,   -71,-32768,     0,  -32768,   110,-32768,-32768,-32768,     1,   -55,    -7,  -104,-32768,
 -32768,-32768,    -6,-32768,-32768,    51,-32768,-32768,-32768,-32768,       0,-32768,-32768,   -13,-32768,-32768,   -27,-32768,-32768,-32768,
 -32768,-32768,-32768,-32768,-32768,-32768,   184,-32768,-32768,-32768,  -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   107,
      2,-32768,-32768,-32768,-32768,    71,-32768,-32768,-32768,-32768,  -32768,-32768,-32768,     2,-32768,-32768,-32768,-32768,    -6,-32768,
 -32768,-32768,    21,    22,    19,-32768,-32768,   -12,    77,   -20,  -32768,-32768,-32768,-32768,-32768,-32768,-32768,   -66,   -51,   -24,
 -32768,   -32,     9,-32768,-32768,-32768,   211,-32768,   218,   280,  -32768,-32768,    -9,     4,   -29,-32768,   -20,     3,-32768,-32768,
 -32768,-32768,   210,    38,   172,-32768,   227,    14  -32768,-32768,-32768,   167,-32768,   162,   221,-32768,-32768,   151,
       96,   105,-32768,   120,    49
 };  };
   
   
 #define YYLAST          440  #define YYLAST          482
   
   
 static const short yytable[] = {    15,  static const short yytable[] = {    15,
    109,    18,    10,    51,    60,    81,     2,   116,     1,    89,      10,    18,   138,    51,   104,    42,    38,  -103,    80,    89,
     15,    42,    18,    68,    52,    53,   239,    80,    63,   240,      15,    63,    18,    55,     1,   248,    68,    81,    84,    21,
      1,     1,    15,    21,    18,   117,   118,   119,   120,    55,      72,   249,    55,   246,    73,     2,   247,    74,    70,    69,
     61,    81,   121,    85,    70,    55,   122,   123,   124,   107,     109,    52,    53,    61,    80,    87,    85,     1,    84,    80,
    221,    71,    87,    80,   -98,     2,    82,  -158,    80,   125,      82,   136,   240,    81,   -67,   -67,    71,   236,    42,    38,
      3,   234,    51,   126,    42,     4,     4,   127,   128,    15,      83,  -167,    86,   110,   111,   112,   113,  -102,    56,    15,
    104,    18,     3,     3,   108,    94,    98,   101,     4,     4,       3,    18,   114,   115,    22,    57,     4,    56,    89,   116,
     56,    15,    15,    18,    18,   115,    56,   106,    22,    38,     117,   106,    15,   108,    18,    95,   118,    53,     2,   105,
     83,     3,     3,    57,   -64,   -64,    86,     4,     4,   142,     119,   196,     4,     3,   120,   121,    22,     3,     3,     4,
    -97,   183,    89,    22,    53,   184,    84,   241,   185,    95,      56,   185,  -102,     4,     4,   186,    51,    22,   187,   137,
     22,    56,    69,   242,   135,    67,    79,    15,   105,    18,      94,    98,   101,    15,   129,    18,    15,    23,    18,    67,
    -97,   109,   141,   -89,   -89,   136,    84,    23,   139,   -14,      24,    25,   -14,    26,    79,   -94,   -94,   130,   132,    15,
     24,    25,    38,    26,   237,   238,    15,    15,    18,    18,      15,    18,    18,   138,   185,   131,   144,   157,   186,    23,
    137,   -60,    23,    72,    51,    24,    25,    73,   138,    23,     193,   187,    24,    25,   194,   195,    15,   -63,    18,   128,
     74,    15,    24,    18,    23,    23,   183,    24,    24,   143,      23,   199,   239,    24,   161,   200,   138,   134,   251,   166,
    184,   157,   144,   185,   145,   146,   147,   148,   149,   150,     167,   256,    23,   161,   258,    24,   259,    23,   166,   167,
    151,   152,   191,   153,   192,   194,   109,   195,   171,   247,      24,   174,    50,   100,   177,   178,   179,   180,   181,   182,
    248,    50,   174,   175,   176,   108,   177,   178,   179,   180,     183,   184,   127,   177,   178,   179,   180,   181,   182,   183,
    181,   182,    15,    15,    18,    18,   227,   179,   180,   181,     184,   237,   166,   167,   255,    15,   229,    18,    51,   179,
    182,    15,   100,    18,   236,   196,   197,   198,   199,   200,     180,   181,   182,   183,   184,    15,   254,    18,   178,   179,
    201,   202,   203,   204,   205,   206,   207,   208,   209,   210,     180,   181,   182,   183,   184,   145,   146,   147,   148,   149,
    211,   212,   213,   214,   215,   216,   217,   218,   219,   220,     150,   151,   152,   140,   153,   181,   182,   183,   184,   103,
    174,   175,   176,   134,   177,   178,   179,   180,   181,   182,     137,   253,   102,    46,   124,   156,   143,    15,     0,    18,
    108,   177,   178,   179,   180,   181,   182,    15,    15,    18,       0,     0,     0,     0,     0,     0,     0,    15,   250,    18,
     18,   227,   158,   159,   160,   161,   162,   163,   164,   165,       0,     0,     0,   137,     0,    15,   229,    18,     0,     0,
    166,   167,   168,   169,   170,   111,   235,   244,   243,   171,      15,     0,    18,   201,   202,   203,   204,   205,   206,   207,
    172,   173,   245,   174,   175,   176,   102,   177,   178,   179,     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
    180,   181,   182,   175,   176,   103,   177,   178,   179,   180,     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
    181,   182,    46,   131,   193,   158,   159,   160,   161,   162,     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
    163,   164,   165,   166,   167,   168,   169,   170,   114,   156,     168,   169,   170,   171,   172,   173,   166,   167,     0,     0,
      0,     0,   171,   172,   173,     0,   174,   175,   176,     0,     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
    177,   178,   179,   180,   181,   182,   158,   159,     0,   161,     184,   177,   178,   179,   180,   181,   182,   183,   184,     0,
    162,   163,   164,   165,   166,   167,   168,   169,   170,     0,       0,     0,     0,     0,   198,   158,   159,   160,   161,   162,
      0,     0,     0,   171,   172,   173,     0,   174,   175,   176,     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
      0,   177,   178,   179,   180,   181,   182,   158,     0,     0,     173,     0,     0,     0,     0,   174,   175,   176,   177,   178,
      179,   180,   181,   182,   183,   184,   158,   159,     0,   161,
      162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
      172,   173,     0,     0,     0,     0,   174,   175,   176,   177,
      178,   179,   180,   181,   182,   183,   184,   158,     0,     0,
    161,   162,   163,   164,   165,   166,   167,   168,   169,   170,     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
      0,     0,     0,     0,   171,   172,   173,     0,   174,   175,     171,   172,   173,     0,     0,     0,     0,   174,   175,   176,
    176,     0,   177,   178,   179,   180,   181,   182,   161,   162,     177,   178,   179,   180,   181,   182,   183,   184,   161,   162,
    163,   164,   165,   166,   167,   168,   169,   170,     0,     0,     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
      0,     0,   171,   172,   173,     0,   174,   175,   176,     0,     173,     0,     0,     0,     0,   174,   175,   176,   177,   178,
    177,   178,   179,   180,   181,   182,   163,   164,     0,     0,     179,   180,   181,   182,   183,   184,   161,     0,     0,   164,
      0,     0,   169,   170,     0,     0,     0,     0,   171,     0,     165,   166,   167,     0,     0,     0,     0,   172,   173,   166,
      0,     0,   174,   175,   176,     0,   177,   178,   179,   180,     167,     0,     0,   174,     0,     0,   177,   178,   179,   180,
    181,   182,   176,     0,   177,   178,   179,   180,   181,   182     181,   182,   183,   184,     0,     0,   179,   180,   181,   182,
      183,   184
 };  };
   
 static const short yycheck[] = {     0,  static const short yycheck[] = {     0,
     72,     0,     0,    11,    23,    38,    41,     4,     4,     4,       0,     0,   107,    11,    60,     3,     3,     3,    38,     4,
     11,     3,    11,    26,    42,    43,    45,    38,    25,    48,      11,    25,    11,     5,     4,    49,    26,    38,    46,     4,
      4,     4,    23,     4,    23,    22,    23,    24,    25,     5,      47,    55,     5,    49,    51,    45,    52,    54,    26,    26,
      4,    64,    29,    46,    26,     5,    33,    34,    35,     4,       4,    46,    47,     4,    64,    49,    46,     4,    66,    69,
      4,     3,    49,    64,     3,    41,    38,    42,    69,    46,      38,     4,     4,    64,    48,    49,     3,     3,    46,    46,
     46,     3,    60,    50,    46,    52,    52,    54,    55,    60,      53,    46,    57,    27,    28,    29,    30,    53,    50,    60,
     44,    60,    46,    46,    72,    52,    53,    54,    52,    52,      50,    60,    36,    37,     4,    57,    56,    50,     4,    43,
     46,    72,    73,    72,    73,    73,    46,    69,     4,     3,      44,    69,    73,    73,    73,     4,    50,    47,    45,    52,
     49,    46,    46,    53,    44,    45,    53,    52,    52,   108,      54,   137,    56,    50,    58,    59,     4,    50,    50,    56,
     49,    43,     4,     4,    43,    47,    46,    45,    50,     4,      50,    47,    53,    56,    56,    51,   104,     4,    54,   107,
      4,    46,    26,    51,    91,     4,     4,   108,    48,   108,      52,    53,    54,   104,    46,   104,   107,    47,   107,     4,
     49,   183,    99,    44,    45,    42,    66,    43,     4,    42,      50,    51,    46,    53,     4,    48,    49,    48,     4,   120,
     46,    47,    46,    49,    44,    45,   127,   128,   127,   128,     121,   120,   121,   228,    47,    49,    52,    55,    51,    47,
     44,    44,    43,    43,   142,    46,    47,    47,    45,    43,       4,    54,    50,    51,    46,    48,   137,    48,   137,    91,
     50,   142,    46,   142,    43,    43,    43,    46,    46,    44,      47,    58,    48,    50,    14,    59,   251,    99,    49,    19,
     47,    51,    48,    50,   117,   118,   119,   120,   121,   122,      20,    48,    47,    14,     0,    50,     0,    47,    19,    20,
    123,   124,     4,   126,    42,    54,   238,    55,    26,     0,      50,    31,     5,    54,    34,    35,    36,    37,    38,    39,
      0,     5,    30,    31,    32,   183,    34,    35,    36,    37,      40,    41,    91,    34,    35,    36,    37,    38,    39,    40,
     38,    39,   183,   184,   183,   184,   184,    36,    37,    38,      41,   188,    19,    20,   251,   186,   186,   186,   196,    36,
     39,   192,    54,   192,   192,   158,   159,   160,   161,   162,      37,    38,    39,    40,    41,   196,   248,   196,    35,    36,
    163,   164,   165,   166,   167,   168,   169,   170,   171,   172,      37,    38,    39,    40,    41,   110,   111,   112,   113,   114,
    173,   174,   175,   176,   177,   178,   179,   180,   181,   182,     115,   116,   117,   107,   119,    38,    39,    40,    41,    58,
     30,    31,    32,    91,    34,    35,    36,    37,    38,    39,     228,   246,    56,     3,    74,   121,   107,   228,    -1,   228,
    238,    34,    35,    36,    37,    38,    39,   238,   239,   238,      -1,    -1,    -1,    -1,    -1,    -1,    -1,   238,   238,   238,
    239,   239,     9,    10,    11,    12,    13,    14,    15,    16,      -1,    -1,    -1,   251,    -1,   246,   246,   246,    -1,    -1,
     17,    18,    19,    20,    21,    72,   186,   239,   238,    26,     251,    -1,   251,   158,   159,   160,   161,   162,   163,   164,
     27,    28,   241,    30,    31,    32,    56,    34,    35,    36,     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
     37,    38,    39,    31,    32,    58,    34,    35,    36,    37,     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
     38,    39,     3,    74,    51,     9,    10,    11,    12,    13,      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
     14,    15,    16,    17,    18,    19,    20,    21,    72,   128,      21,    22,    23,    24,    25,    26,    19,    20,    -1,    -1,
     -1,    -1,    26,    27,    28,    -1,    30,    31,    32,    -1,      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
     34,    35,    36,    37,    38,    39,     9,    10,    -1,    12,      41,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
     13,    14,    15,    16,    17,    18,    19,    20,    21,    -1,      -1,    -1,    -1,    -1,    55,    11,    12,    13,    14,    15,
     -1,    -1,    -1,    26,    27,    28,    -1,    30,    31,    32,      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
     -1,    34,    35,    36,    37,    38,    39,     9,    -1,    -1,      26,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
     12,    13,    14,    15,    16,    17,    18,    19,    20,    21,      36,    37,    38,    39,    40,    41,    11,    12,    -1,    14,
     -1,    -1,    -1,    -1,    26,    27,    28,    -1,    30,    31,      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
     32,    -1,    34,    35,    36,    37,    38,    39,    12,    13,      25,    26,    -1,    -1,    -1,    -1,    31,    32,    33,    34,
     14,    15,    16,    17,    18,    19,    20,    21,    -1,    -1,      35,    36,    37,    38,    39,    40,    41,    11,    -1,    -1,
     -1,    -1,    26,    27,    28,    -1,    30,    31,    32,    -1,      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
     34,    35,    36,    37,    38,    39,    14,    15,    -1,    -1,      24,    25,    26,    -1,    -1,    -1,    -1,    31,    32,    33,
     -1,    -1,    20,    21,    -1,    -1,    -1,    -1,    26,    -1,      34,    35,    36,    37,    38,    39,    40,    41,    14,    15,
     -1,    -1,    30,    31,    32,    -1,    34,    35,    36,    37,      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
     38,    39,    32,    -1,    34,    35,    36,    37,    38,    39      26,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    14,    -1,    -1,    17,
       18,    19,    20,    -1,    -1,    -1,    -1,    25,    26,    19,
       20,    -1,    -1,    31,    -1,    -1,    34,    35,    36,    37,
       38,    39,    40,    41,    -1,    -1,    36,    37,    38,    39,
       40,    41
 };  };
 #define YYPURE 1  #define YYPURE 1
   
Line 744  yyparse(YYPARSE_PARAM_ARG) Line 777  yyparse(YYPARSE_PARAM_ARG)
   
 #ifdef YYPURE  #ifdef YYPURE
   int yychar;    int yychar;
   YYSTYPE yylval;    YYSTYPE yylval=0; /*paf:calm down, vc7 warning level 4*/
   int yynerrs;    int yynerrs;
 #ifdef YYLSP_NEEDED  #ifdef YYLSP_NEEDED
   YYLTYPE yylloc;    YYLTYPE yylloc;
 #endif  #endif
 #endif  #endif
   
   YYSTYPE yyval;                /*  the variable used to return         */    YYSTYPE yyval=0; /*paf:calm down, vc7 warning level 4*/               /*  the variable used to return         */
                                 /*  semantic values from the action     */                                  /*  semantic values from the action     */
                                 /*  routines                            */                                  /*  routines                            */
   
Line 1011  yyreduce: Line 1044  yyreduce:
   switch (yyn) {    switch (yyn) {
   
 case 1:  case 1:
 #line 108 "compile.y"  #line 121 "compile.y"
 {  {
         Method& method=*NEW Method(POOL,           Method& method=*new Method(Method::CT_ANY,
                 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(PC.request->main_method_name, method);          PC.cclass->add_method(PC.alias_method(main_method_name), method);
 ;  ;
     break;}      break;}
 case 8:  case 8:
 #line 125 "compile.y"  #line 136 "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->size()<1*2) {          if(strings_code->count()<1*OPERATIONS_PER_OPVALUE) {
                 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 1040  case 8: Line 1071  case 8:
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->size()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         // new class' name                          // new class' name
                         const String *name=LA2S(strings_code);                          const String& name=*LA2S(*strings_code);
                         // creating the class                          // creating the class
                         PC.cclass=NEW VClass(POOL);                          VStateless_class* cclass=new VClass;
                         PC.cclass->set_name(*name);                          PC.cclass=cclass;
                           PC.cclass->set_name(name);
                         // append to request's classes                          // append to request's classes
                         PC.request->classes().put(*name, PC.cclass);                          PC.request.classes().put(name, cclass);
                 } else {                  } else {
                         strcpy(PC.error, "@"CLASS_NAME" must contain sole name");                          strcpy(PC.error, "@"CLASS_NAME" must contain only one line with class name (contains more then one)");
                         YYERROR;                          YYERROR;
                 }                  }
         } else if(command==USE_CONTROL_METHOD_NAME) {          } else if(command==USE_CONTROL_METHOD_NAME) {
                 for(int i=0; i<strings_code->size(); i+=2)                   for(size_t i=0; i<strings_code->count(); i+=OPERATIONS_PER_OPVALUE) 
                         PC.request->use_file(*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 1062  case 8: Line 1094  case 8:
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->size()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         const String& base_name=*LA2S(strings_code);                          const String& base_name=*LA2S(*strings_code);
                         VClass *base=static_cast<VClass *>(                          if(Value* base_class_value=PC.request.classes().get(base_name)) {
                                 PC.request->classes().get(base_name));                                  // @CLASS == @BASE sanity check
                         if(!base) {                                  if(VStateless_class *base_class=base_class_value->get_class()) {
                                           if(PC.cclass==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) {  
                                 strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);  
                                 YYERROR;  
                         }  
                         PC.cclass->set_base(base);  
                 } else {                  } else {
                         strcpy(PC.error, "@"BASE_NAME" must contain sole name");                          strcpy(PC.error, "@"BASE_NAME" must contain sole name");
                         YYERROR;                          YYERROR;
Line 1091  case 8: Line 1128  case 8:
 ;  ;
     break;}      break;}
 case 12:  case 12:
 #line 191 "compile.y"  #line 208 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 16:  case 16:
 #line 196 "compile.y"  #line 212 "compile.y"
 {  { 
         const String *name=LA2S(yyvsp[-5]);          PC.explicit_result=false;
           const String& name=*LA2S(*yyvsp[-4]);
   
         YYSTYPE params_names_code=yyvsp[-4];          YYSTYPE params_names_code=yyvsp[-3];
         Array *params_names=0;          ArrayString* params_names=0;
         if(int size=params_names_code->size()) {          if(int size=params_names_code->count()) {
                 params_names=NEW Array(POOL);                  params_names=new ArrayString;
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE)
                         *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[-2];
         Array *locals_names=0;          ArrayString* locals_names=0;
         if(int size=locals_names_code->size()) {          if(int size=locals_names_code->count()) {
                 locals_names=NEW Array(POOL);                  locals_names=new ArrayString;
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE) {
                         *locals_names+=LA2S(locals_names_code, i);                          const String* local_name=LA2S(*locals_names_code, i);
                           if(*local_name==RESULT_VAR_NAME)
                                   PC.explicit_result=true;
                           else
                                   *locals_names+=local_name;
                   }
         }          }
   
         Method& method=*NEW Method(POOL,           Method* method=new Method(
                 *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);                  0/*to be filled later in next {} */, 0);
         PC.cclass->add_method(*name, method);          PC.cclass->add_method(PC.alias_method(name), *method);
           *reinterpret_cast<Method**>(&yyval)=method;
   
           // todo: check [][;result;]
   ;
       break;}
   case 17:
   #line 247 "compile.y"
   {
           // fill in the code
           reinterpret_cast<Method*>(yyvsp[-1])->parser_code=yyvsp[0];
 ;  ;
     break;}      break;}
 case 19:  case 20:
 #line 225 "compile.y"  #line 253 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 23:  case 24:
 #line 227 "compile.y"  #line 255 "compile.y"
 { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 29:  case 30:
 #line 235 "compile.y"  #line 263 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 35:  case 36:
 #line 241 "compile.y"  #line 269 "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 37:
 #line 248 "compile.y"  #line 276 "compile.y"
 { yyval=yyvsp[0] ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 39:  case 40:
 #line 250 "compile.y"  #line 278 "compile.y"
 { yyval=yyvsp[-1] ;  { yyval=yyvsp[-1] ;
     break;}      break;}
 case 42:  case 43:
 #line 254 "compile.y"  #line 282 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         Array *diving_code=yyvsp[0];          ArrayOperation* 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+origin+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->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->count()>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP_+origin+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+origin+string+OP_GET_ELEMENT. -> OP_VALUE+origin+string+OP_GET_ELEMENT_OR_OPERATOR.
                 if(PC.in_call_value && diving_code->size()==3)                  if(PC.in_call_value && diving_code->count()==4)
                         diving_code->put_int(2, OP_GET_ELEMENT_OR_OPERATOR);                          diving_code->put(4-1, 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 44:
 #line 276 "compile.y"  #line 304 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}  
 case 45:  
 #line 277 "compile.y"  
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  
     break;}      break;}
 case 46:  case 46:
 #line 281 "compile.y"  #line 305 "compile.y"
   { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
       break;}
   case 47:
   #line 309 "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 51:
 #line 289 "compile.y"  #line 317 "compile.y"
 {  {
         yyval=N(POOL);          yyval=N();
         Array *diving_code=yyvsp[0];          ArrayOperation* 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+origin+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->size()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->count()>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP_+origin+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 52:
 #line 306 "compile.y"  #line 334 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         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 53:
 #line 311 "compile.y"  #line 339 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 56:  case 57:
 #line 318 "compile.y"  #line 346 "compile.y"
   {
           // allow $result_or_other_variable[ letters here any time ]
           *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
   ;
       break;}
   case 58:
   #line 349 "compile.y"
   {
           PC.explicit_result=reinterpret_cast<bool>(yyvsp[-1]);
   ;
       break;}
   case 59:
   #line 351 "compile.y"
 {  {
         // stack: context, name          // stack: context, name
         yyval=yyvsp[-1]; // stack: context, name, value          yyval=yyvsp[-2]; // 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 60:
 #line 324 "compile.y"  #line 357 "compile.y"
 {   { 
         yyval=N(POOL);           yyval=N(); 
         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 61:
 #line 332 "compile.y"  #line 365 "compile.y"
 {  {
         // stack: context, name          // stack: context, name
         yyval=N(POOL);           yyval=N(); 
         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 65:
 #line 343 "compile.y"  #line 376 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         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 68:
 #line 350 "compile.y"  #line 383 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 66:  case 69:
 #line 354 "compile.y"  #line 387 "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 70:
 #line 360 "compile.y"  #line 393 "compile.y"
 {   { 
                                         PC.in_call_value=true;                                           PC.in_call_value=true; 
                         ;                          ;
     break;}      break;}
 case 68:  case 71:
 #line 363 "compile.y"  #line 396 "compile.y"
 {  {
                                 PC.in_call_value=false;                                  PC.in_call_value=false;
                         ;                          ;
     break;}      break;}
 case 69:  case 72:
 #line 366 "compile.y"  #line 399 "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->size()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM]          if(params_code->count()==4) { // probably [] case. [OP_VALUE+origin+Void+STORE_PARAM]
                 if(Value *value=LA2V(params_code)) // it is OP_VALUE + value?                  if(Value* value=LA2V(*params_code)) // it is OP_VALUE+origin+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 75:
 #line 381 "compile.y"  #line 414 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 76:  case 79:
 #line 387 "compile.y"  #line 420 "compile.y"
 {yyval=yyvsp[-1];  {
           // allow ^call[ letters here any time ]
           *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
   ;
       break;}
   case 80:
   #line 423 "compile.y"
   {
           PC.explicit_result=reinterpret_cast<bool>(yyvsp[-1]);
   ;
     break;}      break;}
 case 77:  case 81:
 #line 388 "compile.y"  #line 425 "compile.y"
   {yyval=yyvsp[-2];
       break;}
   case 82:
   #line 426 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 78:  case 83:
 #line 389 "compile.y"  #line 427 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 80:  case 85:
 #line 392 "compile.y"  #line 430 "compile.y"
 { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 82:  case 87:
 #line 396 "compile.y"  #line 434 "compile.y"
 { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 84:  case 89:
 #line 400 "compile.y"  #line 438 "compile.y"
 { yyval=yyvsp[-2]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 85:  case 90:
 #line 402 "compile.y"  #line 440 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(yyval, OP_STORE_PARAM);          O(*yyval, OP_STORE_PARAM);
 ;  ;
     break;}      break;}
 case 86:  case 91:
 #line 406 "compile.y"  #line 444 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         OA(yyval, OP_EXPR_CODE__STORE_PARAM, yyvsp[0]);          OA(*yyval, OP_EXPR_CODE__STORE_PARAM, yyvsp[0]);
 ;  ;
     break;}      break;}
 case 87:  case 92:
 #line 410 "compile.y"  #line 448 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         OA(yyval, OP_CURLY_CODE__STORE_PARAM, yyvsp[0]);          OA(*yyval, OP_CURLY_CODE__STORE_PARAM, yyvsp[0]);
 ;  ;
     break;}      break;}
 case 91:  case 96:
 #line 419 "compile.y"  #line 457 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         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 98:
 #line 428 "compile.y"  #line 466 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 95:  case 100:
 #line 430 "compile.y"  #line 468 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 97:  case 102:
 #line 432 "compile.y"  #line 470 "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 103:
 #line 440 "compile.y"  #line 478 "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 109:
 #line 453 "compile.y"  #line 491 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(yyval, OP_GET_ELEMENT);          O(*yyval, OP_GET_ELEMENT);
 ;  ;
     break;}      break;}
 case 105:  case 110:
 #line 457 "compile.y"  #line 495 "compile.y"
 {  {
         Array *code;          ArrayOperation* 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(POOL);           yyval=N(); 
         OA(yyval, OP_STRING_POOL, code);          OA(*yyval, OP_STRING_POOL, code);
 ;  ;
     break;}      break;}
 case 106:  case 111:
 #line 466 "compile.y"  #line 504 "compile.y"
 {  {
         yyval=N(POOL);           // allow $result_or_other_variable[ letters here any time ]
         OA(yyval, OP_OBJECT_POOL, yyvsp[-1]); /* stack: empty write context */          *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
   ;
       break;}
   case 112:
   #line 507 "compile.y"
   {
           PC.explicit_result=reinterpret_cast<bool>(yyvsp[-1]);
   ;
       break;}
   case 113:
   #line 509 "compile.y"
   {
           yyval=N(); 
           OA(*yyval, OP_OBJECT_POOL, yyvsp[-2]); /* 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 114:
 #line 472 "compile.y"  #line 515 "compile.y"
 {  {
         yyval=N(POOL);           yyval=N(); 
         O(yyval, OP_WITH_READ);          O(*yyval, OP_WITH_READ);
         P(yyval, yyvsp[0]);          P(*yyval, *yyvsp[0]);
 ;  ;
     break;}      break;}
 case 109:  case 116:
 #line 477 "compile.y"  #line 520 "compile.y"
 { yyval=yyvsp[-1]; P(yyval, yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 110:  case 117:
 #line 478 "compile.y"  #line 521 "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 120:
 #line 487 "compile.y"  #line 530 "compile.y"
 {  {
         yyval=yyvsp[-1]; // stack: class name string          yyval=yyvsp[-1]; // stack: class name string
         O(yyval, OP_GET_CLASS);          if(*LA2S(*yyval) == BASE_NAME) { // pseudo BASE class
                   if(VStateless_class* base=PC.cclass->base_class()) {
                           change_string_literal_value(*yyval, base->name());
                   } else {
                           strcpy(PC.error, "no base class declared");
                           YYERROR;
                   }
           }
           O(*yyval, OP_GET_CLASS);
 ;  ;
     break;}      break;}
 case 114:  case 121:
 #line 491 "compile.y"  #line 542 "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 122:
 #line 503 "compile.y"  #line 554 "compile.y"
 {  {
         // see OP_PREPARE_TO_EXPRESSION!!          // see OP_PREPARE_TO_EXPRESSION!!
         if((yyval=yyvsp[0])->size()==2) // only one string literal in there?          if((yyval=yyvsp[0])->count()==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:  
 #line 512 "compile.y"  
 { yyval = yyvsp[-1]; ;  
     break;}  
 case 120:  
 #line 513 "compile.y"  
 { yyval = yyvsp[-1]; ;  
     break;}  
 case 121:  
 #line 514 "compile.y"  
 { yyval = yyvsp[-1]; ;  
     break;}  
 case 122:  
 #line 516 "compile.y"  
 { yyval=yyvsp[0];  O(yyval, OP_NEG) ;  
     break;}  
 case 123:  
 #line 517 "compile.y"  
 { yyval=yyvsp[0] ;  
     break;}  
 case 124:  
 #line 518 "compile.y"  
 { yyval=yyvsp[0];        O(yyval, OP_INV) ;  
     break;}  
 case 125:  
 #line 519 "compile.y"  
 { yyval=yyvsp[0];  O(yyval, OP_NOT) ;  
     break;}  
 case 126:  case 126:
 #line 520 "compile.y"  #line 563 "compile.y"
 { yyval=yyvsp[0];  O(yyval, OP_DEF) ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 127:  case 127:
 #line 521 "compile.y"  #line 564 "compile.y"
 { yyval=yyvsp[0];  O(yyval, OP_IN) ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 128:  case 128:
 #line 522 "compile.y"  #line 565 "compile.y"
 { yyval=yyvsp[0];  O(yyval, OP_FEXISTS) ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 129:  case 129:
 #line 523 "compile.y"  #line 567 "compile.y"
 { yyval=yyvsp[0];  O(yyval, OP_DEXISTS) ;  { yyval=yyvsp[0];  O(*yyval, OP_NEG) ;
     break;}      break;}
 case 130:  case 130:
 #line 525 "compile.y"  #line 568 "compile.y"
 {       yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_SUB) ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 131:  case 131:
 #line 526 "compile.y"  #line 569 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_ADD) ;  { yyval=yyvsp[0];        O(*yyval, OP_INV) ;
     break;}      break;}
 case 132:  case 132:
 #line 527 "compile.y"  #line 570 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_MUL) ;  { yyval=yyvsp[0];  O(*yyval, OP_NOT) ;
     break;}      break;}
 case 133:  case 133:
 #line 528 "compile.y"  #line 571 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_DIV) ;  { yyval=yyvsp[0];  O(*yyval, OP_DEF) ;
     break;}      break;}
 case 134:  case 134:
 #line 529 "compile.y"  #line 572 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_MOD) ;  { yyval=yyvsp[0];  O(*yyval, OP_IN) ;
     break;}      break;}
 case 135:  case 135:
 #line 530 "compile.y"  #line 573 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_INTDIV) ;  { yyval=yyvsp[0];  O(*yyval, OP_FEXISTS) ;
     break;}      break;}
 case 136:  case 136:
 #line 531 "compile.y"  #line 574 "compile.y"
 { yyval=yyvsp[-2];      P(yyval, yyvsp[0]);  O(yyval, OP_BIN_AND) ;  { yyval=yyvsp[0];  O(*yyval, OP_DEXISTS) ;
     break;}      break;}
 case 137:  case 137:
 #line 532 "compile.y"  #line 576 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_OR) ;  {       yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_SUB) ;
     break;}      break;}
 case 138:  case 138:
 #line 533 "compile.y"  #line 577 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_BIN_XOR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_ADD) ;
     break;}      break;}
 case 139:  case 139:
 #line 534 "compile.y"  #line 578 "compile.y"
 { yyval=yyvsp[-2];  OA(yyval, OP_NESTED_CODE, yyvsp[0]);  O(yyval, OP_LOG_AND) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MUL) ;
     break;}      break;}
 case 140:  case 140:
 #line 535 "compile.y"  #line 579 "compile.y"
 { yyval=yyvsp[-2];  OA(yyval, OP_NESTED_CODE, yyvsp[0]);  O(yyval, OP_LOG_OR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_DIV) ;
     break;}      break;}
 case 141:  case 141:
 #line 536 "compile.y"  #line 580 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_LOG_XOR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MOD) ;
     break;}      break;}
 case 142:  case 142:
 #line 537 "compile.y"  #line 581 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_LT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_INTDIV) ;
     break;}      break;}
 case 143:  case 143:
 #line 538 "compile.y"  #line 582 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_GT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SL) ;
     break;}      break;}
 case 144:  case 144:
 #line 539 "compile.y"  #line 583 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_LE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SR) ;
     break;}      break;}
 case 145:  case 145:
 #line 540 "compile.y"  #line 584 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_GE) ;  { yyval=yyvsp[-2];      P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_AND) ;
     break;}      break;}
 case 146:  case 146:
 #line 541 "compile.y"  #line 585 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_EQ) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_OR) ;
     break;}      break;}
 case 147:  case 147:
 #line 542 "compile.y"  #line 586 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_NUM_NE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_XOR) ;
     break;}      break;}
 case 148:  case 148:
 #line 543 "compile.y"  #line 587 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_LT) ;  { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_AND) ;
     break;}      break;}
 case 149:  case 149:
 #line 544 "compile.y"  #line 588 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_GT) ;  { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_OR) ;
     break;}      break;}
 case 150:  case 150:
 #line 545 "compile.y"  #line 589 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_LE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_LOG_XOR) ;
     break;}      break;}
 case 151:  case 151:
 #line 546 "compile.y"  #line 590 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_GE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LT) ;
     break;}      break;}
 case 152:  case 152:
 #line 547 "compile.y"  #line 591 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_EQ) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GT) ;
     break;}      break;}
 case 153:  case 153:
 #line 548 "compile.y"  #line 592 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_STR_NE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LE) ;
     break;}      break;}
 case 154:  case 154:
 #line 549 "compile.y"  #line 593 "compile.y"
 { yyval=yyvsp[-2];  P(yyval, yyvsp[0]);  O(yyval, OP_IS) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GE) ;
     break;}      break;}
 case 155:  case 155:
 #line 552 "compile.y"  #line 594 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_EQ) ;
       break;}
   case 156:
   #line 595 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_NE) ;
       break;}
   case 157:
   #line 596 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LT) ;
       break;}
   case 158:
   #line 597 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GT) ;
       break;}
   case 159:
   #line 598 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LE) ;
       break;}
   case 160:
   #line 599 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GE) ;
       break;}
   case 161:
   #line 600 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_EQ) ;
       break;}
   case 162:
   #line 601 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_NE) ;
       break;}
   case 163:
   #line 602 "compile.y"
   { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_IS) ;
       break;}
   case 164:
   #line 605 "compile.y"
 {  {
         yyval=N(POOL);          yyval=N();
         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 156:  case 165:
 #line 561 "compile.y"  #line 614 "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 157:  case 166:
 #line 566 "compile.y"  #line 619 "compile.y"
 { yyval=VL(NEW VVoid(POOL)) ;  { yyval=VL(new VVoid(), 0, 0, 0) ;
     break;}      break;}
 case 158:  case 167:
 #line 567 "compile.y"  #line 620 "compile.y"
 { yyval=N(POOL) ;  { yyval=N() ;
     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 1849  yyerrhandle: Line 1957  yyerrhandle:
     }      }
   return 1;    return 1;
 }  }
 #line 569 "compile.y"  #line 622 "compile.y"
   
 #endif  #endif
   
Line 1869  yyerrhandle: Line 1977  yyerrhandle:
                 4:[^({]=pop                  4:[^({]=pop
 */  */
   
 static int yylex(YYSTYPE *lvalp, void *pc) {  inline void ungetc(Parse_control& pc, uint last_line_end_col) {
         #define lexical_brackets_nestage PC.brackets_nestages[PC.ls_sp]          pc.source--;
           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;
         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.line++;                          pc.pos_next_line();
                         PC.col=0;                  else
                 } else                          pc.pos_next_c(c);
                         PC.col++;  //              fprintf(stderr, "\nchar: %c file(%d:%d)", c, pc.pos.line, pc.pos.col);
   
                 if(c=='@' && PC.col==0+1) {                  if(pc.pos.col==0+1 && c=='@') {
                         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=='^')                  }
                         switch(PC.ls) {                  if(c=='^') {
                           if(pc.ls==LS_METHOD_AFTER) {
                                   // handle after-method situation
                                   pop_LS(pc);
                                   result=EON;
                                   skip_analized=-1; // return to punctuation afterwards to assure it's literality
                                   goto break2;
                           }
                           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:
 case LS_VAR_NAME_SIMPLE_WITHOUT_COLON:  case LS_VAR_NAME_SIMPLE_WITHOUT_COLON:
 case LS_VAR_NAME_CURLY:  case LS_VAR_NAME_CURLY:
 case LS_METHOD_NAME:  case LS_METHOD_NAME:
 case LS_COMMENT:  case LS_USER_COMMENT:
 case LS_DEF_COMMENT:  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 1930  default: Line 2056  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_CLEAN(begin, end-begin, PC.file, begin_line);                                          pc.string.append_strdup_know_length(begin, end-begin);
                                 }                                  }
                                 // reset piece 'begin' position & line                                  // reset piece 'begin' position & line
                                 end=begin=PC.source; // ^                                  begin=pc.source; // ->punctuation
                                 begin_line=PC.line;                                  begin_pos=pc.pos;
                                 if(PC.ls==LS_METHOD_AFTER) {                                  // skip over _ after ^
                                         pop_LS(PC);                                  pc.source++;  pc.pos.col++;
                                         result=EON;                                  // skip analysis = forced literal
                                         skip_analized=-1; // return to ^ afterwards to assure it's literality                                  continue;
                                         goto break2;  
                                 } else {  
                                         // skip over _ after ^  
                                         PC.source++;  PC.col++;  
                                         // skip analysis = forced literal  
                                         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_CLEAN(begin, end-begin, PC.file, begin_line);                                          pc.string.append_strdup_know_length(begin, end-begin);
                                 }                                  }
                                 // #HH ?                                  // #HH ?
                                 if(PC.source[0]=='#' && PC.source[1] && PC.source[2]) {                                  if(pc.source[0]=='#' && pc.source[1] && pc.source[2]) {
                                         char *hex=(char *)POOL.malloc(1);                                          char c=
                                         hex[0]=                                                  hex_value[(unsigned char)pc.source[1]]*0x10+
                                                 hex_value[(unsigned char)PC.source[1]]*0x10+                                                  hex_value[(unsigned char)pc.source[2]];
                                                 hex_value[(unsigned char)PC.source[2]];                                          if(c==0) {
                                         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_CLEAN(hex, 1, PC.file, begin_line);                                          pc.string.append(c);
                                         // skip over ^#HH                                          // skip over ^#HH
                                         PC.source+=3;                                          pc.source+=3;
                                         PC.col+=3;                                          pc.pos.col+=3;
                                         // reset piece 'begin' position & line                                          // reset piece 'begin' position & line
                                         begin=PC.source; // ^                                          begin=pc.source; // ->after ^#HH
                                         begin_line=PC.line;                                          begin_pos=pc.pos;
                                           // skip analysis = forced literal
                                         continue;                                          continue;
                                 }                                  }
                                 break;                                  break;
                         }                          }
                         break;                          break;
                           }
                 }                  }
                 // #comment  start skipping                  // #comment  start skipping
                 if(c=='#' && PC.col==1) {                  if(c=='#' && pc.pos.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_CLEAN(begin, end-begin, PC.file, begin_line);                                  pc.string.append_strdup_know_length(begin, end-begin);
                         }                          }
                         // fall into COMMENT lexical state [wait for \n]                          // fall into COMMENT lexical state [wait for \n]
                         push_LS(PC, LS_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_line=PC.line;                                          begin_pos=pc.pos;
                                         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;
                         }                          }
                           if(pc.explicit_result && c)
                                   switch(c) {
                                   case '\n': case ' ': case '\t':
                                           begin=pc.source;
                                           begin_pos=pc.pos;
                                           continue; // skip it
                                   default:
                                           result=BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE;
                                           goto break2;
                                   }
                         break;                          break;
                                                   
                 // #COMMENT                  // #COMMENT
                 case LS_COMMENT:                  case LS_USER_COMMENT:
                         if(c=='\n') {                          if(c=='\n') {
                                 // skip comment                                  // skip comment
                                 begin=PC.source;                                  begin=pc.source;
                                 begin_line=PC.line;                                  begin_pos=pc.pos;
   
                                 pop_LS(PC);                                  pop_LS(pc);
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2042  default: Line 2178  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 2061  default: Line 2197  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;
   
                 case LS_DEF_PARAMS:                  case LS_DEF_PARAMS:
                         switch(c) {                          switch(c) {
                           case '$': // common error
                                   result=BAD_METHOD_PARAMETER_NAME_CHARACTER;
                                   goto break2;
                         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 2088  default: Line 2227  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 2114  default: Line 2253  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
                                   if(end!=begin) {
                                           if(!pc.string_start)
                                                   pc.string_start=begin_pos;
                                           // append piece till #
                                           pc.string.append_strdup_know_length(begin, end-begin);
                                   }
                                   // fall into COMMENT lexical state [wait for \n]
                                   push_LS(pc, LS_EXPRESSION_COMMENT);
                                   lexical_brackets_nestage=1;
                                   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 2138  default: Line 2288  default:
                                         skip_analized=1;                                          skip_analized=1;
                                         result=DEXISTS;                                          result=DEXISTS;
                                         goto break2;                                          goto break2;
                                 default:                                  default: // minus
                                         result=c;                                          result=c;
                                         goto break2;                                          goto break2;
                                 }                                  }
Line 2147  default: Line 2297  default:
                         case '~':                          case '~':
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case '&': case '|':  case '#':                          case '&': case '|':
                                 if(*PC.source==c) { // && ||                                  if(*pc.source==c) { // && ||
                                         result=c=='#'?LXOR: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 '>': case '=': case '!':                           case '!':
                                 if(*PC.source=='=') { // <= >= == !=                                  switch(pc.source[0]) { 
                                   case '|': // !| !||
                                         skip_analized=1;                                          skip_analized=1;
                                         switch(c) {                                          if(pc.source[1]=='|') {
                                         case '<': result=NLE; break;                                                  skip_analized++;
                                         case '>': result=NGE; break;                                                  result=LXOR;
                                         case '=': result=NEQ; break;                                          } else
                                         case '!': result=NNE; break;                                                  result=NXOR;
                                         }                                          goto break2;
                                 } else                                  case '=': // !=
                                         result=c;                                          skip_analized=1;
                                           result=NNE; 
                                           goto break2;
                                   }
                                   RC;
   
                           case '<': // <<, <=, <
                                   switch(*pc.source) {
                                   case '<': // <[<]
                                           skip_analized=1; result=NSL; break;
                                   case '=': // <[=]
                                           skip_analized=1; result=NLE; break;
                                   default: // <[]
                                           result=c; break;
                                   }
                                 goto break2;                                  goto break2;
                           case '>': // >>, >=, >
                                   switch(*pc.source) {
                                   case '>': // >[>]
                                           skip_analized=1; result=NSR; break;
                                   case '=': // >[=]
                                           skip_analized=1; result=NGE; break;
                                   default: // >[]
                                           result=c; break;
                                   }
                                   goto break2;
                           case '=': // ==
                                   switch(*pc.source) {
                                   case '=': // =[=]
                                           skip_analized=1; result=NEQ; break;
                                   default: // =[]
                                           result=c; break; // not used now
                                   }
                                   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 2194  default: Line 2378  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 2209  default: Line 2393  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 2223  default: Line 2407  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_line=PC.line;                                  begin_pos=pc.pos;
                                   continue;
                           }
                           break;
                   case LS_EXPRESSION_COMMENT:
                           if(c=='(')
                                   lexical_brackets_nestage++;
                           
                           switch(*pc.source) {
                           case '\n': case ')':
                                   if(*pc.source==')')
                                           if(--lexical_brackets_nestage!=0)
                                                   continue;
   
                                   // skip comment
                                   begin=pc.source;
                                   begin_pos=pc.pos;
   
                                   pop_LS(pc);
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2235  default: Line 2437  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);
                                         PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }                                          pc.ungetc();
                                         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);
                                         PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }                                          pc.ungetc();
                                         result=EON;                                          result=EON;
                                         goto break2;                                          goto break2;
                                 }                                  }
Line 2272  default: Line 2474  default:
                         case '&': case '|':                           case '&': case '|': 
                         case '=': case '!':                          case '=': case '!':
                         // common delimiters                          // common delimiters
                         case ',': case '?':                          case ',': case '?': case '#':
                         // before call                          // before call
                         case '^':                           case '^': 
                                 pop_LS(PC);                                  pop_LS(pc);
                                 PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }                                  pc.ungetc();
                                 result=EON;                                  result=EON;
                                 goto break2;                                  goto break2;
                         case '[':                          case '[':
                                 // $name.<[>code]                                  // $name.<[>code]
                                 if(PC.col>1/*not first column*/ && (                                  if(pc.pos.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 2323  default: Line 2525  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 2339  default: Line 2541  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 2361  default: Line 2563  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 2383  default: Line 2585  default:
                         switch(c) {                          switch(c) {
                         case '[':                          case '[':
                                 // ^name.<[>code].xxx                                  // ^name.<[>code].xxx
                                 if(PC.col>1/*not first column*/ && (                                  if(pc.pos.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 2408  default: Line 2610  default:
                         case ':': // ':name' or 'class:name'                          case ':': // ':name' or 'class:name'
                         case '^': // ^abc^xxx wrong. bailing out                          case '^': // ^abc^xxx wrong. bailing out
                         case ']': case '}': case ')': // ^abc]}) wrong. bailing out                          case ']': case '}': case ')': // ^abc]}) wrong. bailing out
                           case ' ': // ^if ( wrong. bailing out
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2415  default: Line 2618  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 2437  default: Line 2640  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 2454  default: Line 2657  default:
                                 lexical_brackets_nestage++;                                  lexical_brackets_nestage++;
                                 break;                                  break;
                         }                          }
                           if(pc.explicit_result && c)
                                   switch(c) {
                                   case '\n': case ' ': case '\t':
                                           begin=pc.source;
                                           begin_pos=pc.pos;
                                           continue; // skip it
                                   default:
                                           result=BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE;
                                           goto break2;
                                   }
                         break;                          break;
   
                 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);
                         PC.source--;  if(--PC.col<0) { PC.line--;  PC.col=-1; }                          pc.ungetc();
                         result=EON;                          result=EON;
                         goto break2;                          goto break2;
                 }                  }
Line 2491  break2: Line 2704  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_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_CLEAN(begin, end-begin, PC.file, begin_line/*, start_col*/);                          pc.string.append_strdup_know_length(begin, end-begin);
                 }                  }
         }          }
         if(PC.string->size()) { // something accumulated?          if(!pc.string.is_empty()) { // something accumulated?
                 // create STRING value: array of OP_VALUE+vstring                  // create STRING value: array of OP_VALUE+origin+vstring
                 *lvalp=VL(NEW VString(*PC.string));                  *lvalp=VL(
                           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=NEW String(POOL);                  pc.string.clear();
                   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.col+=skip_analized;                  pc.source+=skip_analized;  pc.pos.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.60  
changed lines
  Added in v.1.100


E-mail: