Diff for /parser3/src/main/compile.tab.C between versions 1.81.2.10 and 1.103.8.4

version 1.81.2.10, 2003/03/11 14:58:32 version 1.103.8.4, 2005/11/16 14:38:43
Line 11 Line 11
 #define BAD_HEX_LITERAL 261  #define BAD_HEX_LITERAL 261
 #define BAD_METHOD_DECL_START   262  #define BAD_METHOD_DECL_START   262
 #define BAD_METHOD_PARAMETER_NAME_CHARACTER     263  #define BAD_METHOD_PARAMETER_NAME_CHARACTER     263
 #define BAD_MATH_OPERATOR_CHARACTER     264  #define BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE     264
 #define LAND    265  #define LAND    265
 #define LOR     266  #define LOR     266
 #define LXOR    267  #define LXOR    267
Line 40 Line 40
 /** @file  /** @file
         Parser: compiler(lexical parser and grammar).          Parser: compiler(lexical parser and grammar).
   
         Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2005 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 57 Line 57
                 -#:     in iis make up specialized Pool object for that                  -#:     in iis make up specialized Pool object for that
 */  */
   
 #define YYSTYPE  ArrayOperationPtr  #define YYSTYPE  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 74 Line 76
 #include "pa_vvoid.h"  #include "pa_vvoid.h"
 #include "pa_vmethod_frame.h"  #include "pa_vmethod_frame.h"
   
   // defines
   
 #define USE_CONTROL_METHOD_NAME "USE"  #define USE_CONTROL_METHOD_NAME "USE"
   
 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)
 #ifndef DOXYGEN  #ifndef DOXYGEN
 #ifndef YYSTYPE  #ifndef YYSTYPE
Line 98  static int yylex(YYSTYPE *lvalp, void *p Line 105  static int yylex(YYSTYPE *lvalp, void *p
   
   
   
 #define YYFINAL         252  #define YYFINAL         259
 #define YYFLAG          -32768  #define YYFLAG          -32768
 #define YYNTBASE        60  #define YYNTBASE        60
   
 #define YYTRANSLATE(x) ((unsigned)(x) <= 286 ? yytranslate[x] : 139)  #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,    46,       2,     2,     2,     2,     2,     2,     2,     2,     2,    46,
Line 139  static const char yytranslate[] = { Line 146  static const char yytranslate[] = {
 #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,   245,   247,   250,
    254,   256,   258,   260,   263,   266,   270,   272,   274,   277,     253,   255,   257,   260,   262,   264,   266,   268,   271,   274,
    280,   282,   284,   287,   290,   292,   294,   296,   298,   302,     275,   276,   282,   284,   286,   289,   292,   294,   296,   299,
    306,   310,   313,   316,   319,   322,   325,   328,   331,   334,     302,   304,   306,   308,   310,   314,   318,   322,   325,   328,
    338,   342,   346,   350,   354,   358,   362,   366,   370,   374,     331,   334,   337,   340,   343,   346,   350,   354,   358,   362,
    378,   382,   386,   390,   394,   398,   402,   406,   410,   414,     366,   370,   374,   378,   382,   386,   390,   394,   398,   402,
    418,   422,   426,   430,   434,   438,   442,   444,   446,   447     406,   410,   414,   418,   422,   426,   430,   434,   438,   442,
      446,   450,   454,   456,   458,   460,   461
 };  };
   
 static const short yyrhs[] = {    62,  static const short yyrhs[] = {    62,
      0,    61,     0,    63,     0,    61,    63,     0,    75,     0,       0,    61,     0,    63,     0,    61,    63,     0,    76,     0,
     64,     0,    69,     0,    45,     4,    46,    65,     0,   138,      64,     0,    69,     0,    45,     4,    46,    65,     0,   145,
      0,    66,     0,    67,     0,    66,    67,     0,    68,    46,       0,    66,     0,    67,     0,    66,    67,     0,    68,    46,
      0,   138,     0,     4,     0,    45,     4,    71,    70,    74,       0,   145,     0,     4,     0,     0,    45,     4,    72,    71,
     46,    75,     0,   138,     0,    71,     0,    47,    72,    48,      75,    46,    70,    76,     0,   145,     0,    72,     0,    47,
      0,   138,     0,    73,     0,     4,     0,    73,    49,     4,      73,    48,     0,   145,     0,    74,     0,     4,     0,    74,
      0,   138,     0,     4,     0,   138,     0,    76,     0,    77,      49,     4,     0,   145,     0,     4,     0,   145,     0,    77,
      0,    76,    77,     0,   136,     0,    78,     0,    79,     0,       0,    78,     0,    77,    78,     0,   143,     0,    79,     0,
     87,     0,   100,     0,    80,     0,    50,    81,     0,    83,      80,     0,    88,     0,   103,     0,    81,     0,    50,    82,
      3,     0,    82,     0,    51,    83,    52,     0,    84,     0,       0,    84,     3,     0,    83,     0,    51,    84,    52,     0,
     85,     0,    86,     0,   130,    86,     0,   122,     0,   119,      85,     0,    86,     0,    87,     0,   136,    87,     0,   126,
    122,     0,    50,    88,    92,     0,    89,     0,    90,     0,       0,   123,   126,     0,    50,    89,    93,     0,    90,     0,
     91,     0,   118,     0,    53,   118,     0,   130,   118,     0,      91,     0,    92,     0,   122,     0,    53,   122,     0,   136,
     93,     0,    94,     0,    95,     0,    47,    96,    48,     0,     122,     0,    94,     0,    97,     0,    98,     0,     0,     0,
     54,   133,    55,     0,    51,    75,    52,     0,   137,     0,      47,    95,    99,    96,    48,     0,    54,   139,    55,     0,
      4,     0,    97,     0,    98,     0,    99,     0,    78,     0,      51,    76,    52,     0,   144,     0,     4,     0,   100,     0,
     77,    76,     0,   101,     0,     0,     0,    56,   102,   104,     101,     0,   102,     0,    79,     0,    78,    77,     0,   104,
    103,   105,     3,     0,    83,     0,   106,     0,   105,   106,       0,     0,     0,    56,   105,   107,   106,   108,     3,     0,
      0,   107,     0,   108,     0,   109,     0,    47,   110,    48,      84,     0,   109,     0,   108,   109,     0,   110,     0,   113,
      0,    54,   111,    55,     0,    51,   112,    52,     0,   113,       0,   114,     0,     0,     0,    47,   111,   115,   112,    48,
      0,   110,    49,   113,     0,   114,     0,   111,    49,   114,       0,    54,   116,    55,     0,    51,   117,    52,     0,   118,
      0,   115,     0,   112,    49,   115,     0,   116,     0,   117,       0,   115,    49,   118,     0,   119,     0,   116,    49,   119,
      0,    75,     0,   137,     0,     4,     0,    97,     0,   133,       0,   120,     0,   117,    49,   120,     0,   121,     0,   139,
      0,   123,     0,   119,   123,     0,   120,     0,   119,   120,       0,    76,     0,   144,     0,     4,     0,   100,     0,   127,
      0,   121,    53,     0,   123,     0,   123,     0,     4,     5,       0,   123,   127,     0,   124,     0,   123,   124,     0,   125,
      0,     4,     0,   124,     0,   125,     0,   126,     0,    50,      53,     0,   127,     0,   127,     0,     4,     5,     0,     4,
    127,     0,     4,   128,     0,    47,    76,    48,     0,     4,       0,   128,     0,   129,     0,   130,     0,    50,   133,     0,
      0,   129,     0,   128,   129,     0,    50,   127,     0,   131,       4,   134,     0,     0,     0,    47,   131,    77,   132,    48,
      0,   132,     0,     4,    57,     0,   131,    57,     0,   134,       0,     4,     0,   135,     0,   134,   135,     0,    50,   133,
      0,     4,     0,    80,     0,   101,     0,    58,   135,    58,       0,   137,     0,   138,     0,     4,    57,     0,   137,    57,
      0,    59,   135,    59,     0,    54,   134,    55,     0,    37,       0,   140,     0,   141,     0,    81,     0,   104,     0,    58,
    134,     0,    36,   134,     0,    43,   134,     0,    44,   134,     142,    58,     0,    59,   142,    59,     0,    54,   140,    55,
      0,    27,   134,     0,    28,   134,     0,    29,   134,     0,       0,    37,   140,     0,    36,   140,     0,    43,   140,     0,
     30,   134,     0,   134,    37,   134,     0,   134,    36,   134,      44,   140,     0,    27,   140,     0,    28,   140,     0,    29,
      0,   134,    38,   134,     0,   134,    39,   134,     0,   134,     140,     0,    30,   140,     0,   140,    37,   140,     0,   140,
     41,   134,     0,   134,    40,   134,     0,   134,    19,   134,      36,   140,     0,   140,    38,   140,     0,   140,    39,   140,
      0,   134,    20,   134,     0,   134,    35,   134,     0,   134,       0,   140,    41,   140,     0,   140,    40,   140,     0,   140,
     34,   134,     0,   134,    14,   134,     0,   134,    11,   134,      19,   140,     0,   140,    20,   140,     0,   140,    35,   140,
      0,   134,    12,   134,     0,   134,    13,   134,     0,   134,       0,   140,    34,   140,     0,   140,    14,   140,     0,   140,
     32,   134,     0,   134,    33,   134,     0,   134,    15,   134,      11,   140,     0,   140,    12,   140,     0,   140,    13,   140,
      0,   134,    16,   134,     0,   134,    17,   134,     0,   134,       0,   140,    32,   140,     0,   140,    33,   140,     0,   140,
     18,   134,     0,   134,    21,   134,     0,   134,    22,   134,      15,   140,     0,   140,    16,   140,     0,   140,    17,   140,
      0,   134,    23,   134,     0,   134,    24,   134,     0,   134,       0,   140,    18,   140,     0,   140,    21,   140,     0,   140,
     25,   134,     0,   134,    26,   134,     0,   134,    31,   134,      22,   140,     0,   140,    23,   140,     0,   140,    24,   140,
      0,    75,     0,     4,     0,     0,     0       0,   140,    25,   140,     0,   140,    26,   140,     0,   140,
       31,   140,     0,     4,     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,
    113,   121,   123,   123,   124,   126,   126,   128,   200,   200,     120,   128,   130,   130,   131,   133,   133,   135,   207,   207,
    201,   201,   202,   203,   203,   205,   234,   234,   235,   236,     208,   208,   209,   210,   210,   212,   247,   252,   252,   253,
    236,   237,   237,   239,   239,   243,   243,   245,   245,   246,     254,   254,   255,   255,   257,   257,   261,   261,   263,   263,
    246,   247,   247,   247,   251,   258,   259,   259,   260,   261,     264,   264,   265,   265,   265,   269,   276,   277,   277,   278,
    263,   264,   286,   287,   287,   291,   295,   297,   298,   299,     279,   281,   282,   304,   305,   305,   309,   313,   315,   316,
    316,   321,   323,   325,   326,   328,   334,   342,   348,   350,     317,   334,   339,   341,   343,   344,   346,   349,   351,   357,
    351,   353,   359,   360,   360,   364,   370,   373,   376,   389,     365,   371,   373,   374,   376,   382,   383,   383,   387,   393,
    391,   391,   392,   394,   395,   397,   398,   399,   400,   402,     396,   399,   412,   414,   414,   415,   417,   418,   420,   423,
    404,   406,   408,   410,   412,   416,   420,   424,   426,   427,     425,   426,   427,   428,   430,   432,   434,   436,   438,   440,
    429,   438,   438,   440,   440,   441,   442,   450,   455,   457,     444,   459,   463,   465,   466,   471,   471,   473,   473,   474,
    459,   460,   461,   463,   467,   476,   482,   487,   487,   488,     475,   483,   488,   490,   492,   493,   494,   496,   500,   509,
    493,   495,   497,   509,   521,   526,   528,   529,   530,   531,     512,   514,   520,   525,   525,   526,   531,   533,   535,   547,
    532,   534,   535,   536,   537,   538,   539,   540,   541,   543,     559,   560,   562,   563,   564,   565,   566,   568,   569,   570,
    544,   545,   546,   547,   548,   549,   550,   551,   552,   553,     571,   572,   573,   574,   575,   577,   578,   579,   580,   581,
    554,   555,   556,   557,   558,   559,   560,   561,   562,   563,     582,   583,   584,   585,   586,   587,   588,   589,   590,   591,
    564,   565,   566,   567,   568,   569,   572,   581,   586,   587     592,   593,   594,   595,   596,   597,   598,   599,   600,   601,
      602,   603,   606,   611,   620,   625,   626
 };  };
 #endif  #endif
   
Line 232  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",
 "BAD_METHOD_PARAMETER_NAME_CHARACTER","BAD_MATH_OPERATOR_CHARACTER","\"&&\"",  "BAD_METHOD_PARAMETER_NAME_CHARACTER","BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE",
 "\"||\"","\"!||\"","\"!|\"","\"<=\"","\">=\"","\"==\"","\"!=\"","\"<<\"","\">>\"",  "\"&&\"","\"||\"","\"!||\"","\"!|\"","\"<=\"","\">=\"","\"==\"","\"!=\"","\"<<\"",
 "\"lt\"","\"gt\"","\"le\"","\"ge\"","\"eq\"","\"ne\"","\"def\"","\"in\"","\"-f\"",  "\">>\"","\"lt\"","\"gt\"","\"le\"","\"ge\"","\"eq\"","\"ne\"","\"def\"","\"in\"",
 "\"-d\"","\"is\"","'<'","'>'","'|'","'&'","'+'","'-'","'*'","'/'","'\\\\'","'%'",  "\"-f\"","\"-d\"","\"is\"","'<'","'>'","'|'","'&'","'+'","'-'","'*'","'/'","'\\\\'",
 "NUNARY","'~'","'!'","'@'","'\\n'","'['","']'","';'","'$'","'{'","'}'","'.'",  "'%'","NUNARY","'~'","'!'","'@'","'\\n'","'['","']'","';'","'$'","'{'","'}'",
 "'('","')'","'^'","':'","'\\\"'","'\\''","all","methods","one_big_piece","method",  "'.'","'('","')'","'^'","':'","'\\\"'","'\\''","all","methods","one_big_piece",
 "control_method","maybe_control_strings","control_strings","control_string",  "method","control_method","maybe_control_strings","control_strings","control_string",
 "maybe_string","code_method","maybe_bracketed_strings","bracketed_maybe_strings",  "maybe_string","code_method","@1","maybe_bracketed_strings","bracketed_maybe_strings",
 "maybe_strings","strings","maybe_comment","maybe_codes","codes","code","action",  "maybe_strings","strings","maybe_comment","maybe_codes","codes","code","action",
 "get","get_value","get_name_value","name_in_curly_rdive","name_without_curly_rdive",  "get","get_value","get_name_value","name_in_curly_rdive","name_without_curly_rdive",
 "name_without_curly_rdive_read","name_without_curly_rdive_class","name_without_curly_rdive_code",  "name_without_curly_rdive_read","name_without_curly_rdive_class","name_without_curly_rdive_code",
 "put","name_expr_wdive","name_expr_wdive_root","name_expr_wdive_write","name_expr_wdive_class",  "put","name_expr_wdive","name_expr_wdive_root","name_expr_wdive_write","name_expr_wdive_class",
 "construct","construct_square","construct_round","construct_curly","any_constructor_code_value",  "construct","construct_square","@2","@3","construct_round","construct_curly",
 "constructor_code_value","constructor_code","codes__excluding_sole_str_literal",  "any_constructor_code_value","constructor_code_value","constructor_code","codes__excluding_sole_str_literal",
 "call","call_value","@1","@2","call_name","store_params","store_param","store_square_param",  "call","call_value","@4","@5","call_name","store_params","store_param","store_square_param",
 "store_round_param","store_curly_param","store_code_param_parts","store_expr_param_parts",  "@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","name_expr_dive_code","name_path","name_step","name_advance1",
 "name_advance1","name_advance2","name_expr_value","name_expr_subvar_value","name_expr_with_subvar_value",  "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","double_or_STRING","string_inside_quotes_value","write_string",
   "void_value","empty", NULL
 };  };
 #endif  #endif
   
 static const short yyr1[] = {     0,  static const short yyr1[] = {     0,
     60,    60,    61,    61,    62,    63,    63,    64,    65,    65,      60,    60,    61,    61,    62,    63,    63,    64,    65,    65,
     66,    66,    67,    68,    68,    69,    70,    70,    71,    72,      66,    66,    67,    68,    68,    70,    69,    71,    71,    72,
     72,    73,    73,    74,    74,    75,    75,    76,    76,    77,      73,    73,    74,    74,    75,    75,    76,    76,    77,    77,
     77,    78,    78,    78,    79,    80,    81,    81,    82,    83,      78,    78,    79,    79,    79,    80,    81,    82,    82,    83,
     83,    84,    85,    86,    86,    87,    88,    88,    88,    89,      84,    84,    85,    86,    87,    87,    88,    89,    89,    89,
     90,    91,    92,    92,    92,    93,    94,    95,    96,    96,      90,    91,    92,    93,    93,    93,    95,    96,    94,    97,
     96,    97,    98,    99,    99,   100,   102,   103,   101,   104,      98,    99,    99,    99,   100,   101,   102,   102,   103,   105,
    105,   105,   106,   106,   106,   107,   108,   109,   110,   110,     106,   104,   107,   108,   108,   109,   109,   109,   111,   112,
    111,   111,   112,   112,   113,   114,   115,   116,   116,   116,     110,   113,   114,   115,   115,   116,   116,   117,   117,   118,
    117,   118,   118,   119,   119,   120,   121,   122,   122,   123,     119,   120,   121,   121,   121,   122,   122,   123,   123,   124,
    123,   123,   123,   124,   125,   126,   127,   128,   128,   129,     125,   126,   126,   127,   127,   127,   127,   128,   129,   131,
    130,   130,   131,   132,   133,   134,   134,   134,   134,   134,     132,   130,   133,   134,   134,   135,   136,   136,   137,   138,
    134,   134,   134,   134,   134,   134,   134,   134,   134,   134,     139,   140,   140,   140,   140,   140,   140,   140,   140,   140,
    134,   134,   134,   134,   134,   134,   134,   134,   134,   134,     140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
    134,   134,   134,   134,   134,   134,   134,   134,   134,   134,     140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
    134,   134,   134,   134,   134,   134,   135,   136,   137,   138     140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
      140,   140,   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,     2,     1,     2,     2,
      1,     1,     1,     2,     2,     3,     1,     1,     2,     2,       1,     1,     2,     1,     1,     1,     1,     2,     2,     0,
      1,     1,     2,     2,     1,     1,     1,     1,     3,     3,       0,     5,     1,     1,     2,     2,     1,     1,     2,     2,
      3,     2,     2,     2,     2,     2,     2,     2,     2,     3,       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,     3,     3,     3,     1,     1,     0,     0       3,     3,     1,     1,     1,     0,     0
 };  };
   
 static const short yydefact[] = {   160,  static const short yydefact[] = {   167,
    158,     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,   104,   110,     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,    98,     0,
     44,    92,   101,   102,   103,     0,   111,   112,     0,     4,      45,    96,   105,   106,   107,     0,   117,   118,     0,     4,
     29,   160,   160,   160,    99,     0,   113,   105,   108,     0,      30,   167,   167,   167,   103,     0,   119,   109,   114,     0,
    107,   104,     0,     0,    98,     0,   100,    51,     0,    92,     113,   108,     0,     0,   102,     0,   104,    52,     0,    96,
     37,   159,   160,     0,    46,    53,    54,    55,   100,    95,      38,    57,   167,     0,    47,    54,    55,    56,   104,    99,
     45,    93,    96,    43,    52,   114,    70,    68,    15,     8,      46,    97,   100,    44,    53,   120,    73,    71,    15,     8,
     10,    11,     0,     9,    22,     0,    21,    20,   160,    18,      10,    11,     0,     9,    23,     0,    22,    21,   167,    19,
     17,   110,   109,   106,    39,    93,   158,     0,    31,     0,      18,   116,   115,   111,    40,    97,   166,     0,   163,     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,   160,   160,   117,   118,     167,   123,   124,     0,   121,   122,     0,    12,    14,    13,
      0,   115,     0,    12,    14,    13,    19,     0,    25,     0,      20,     0,    26,     0,    25,     0,   165,     0,    32,    58,
     24,    65,    56,    58,   126,   127,   128,   129,   123,   122,      64,    65,    66,    62,    61,   132,   133,   134,   135,   129,
    124,   125,     0,   157,     0,     0,    57,     0,     0,     0,     128,   130,   131,     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,     0,   159,   160,     0,     0,    71,    73,       0,     0,     0,     0,     0,    79,   167,     0,     0,    74,
     74,    75,    23,   160,   121,   119,   120,   141,   142,   143,      76,    77,    78,    24,    16,   112,    68,     0,   127,   125,
    140,   146,   147,   148,   149,   136,   137,   150,   151,   152,     126,   147,   148,   149,   146,   152,   153,   154,   155,   142,
    153,   154,   155,   156,   144,   145,   139,   138,   131,   130,     143,   156,   157,   158,   159,   160,   161,   162,   150,   151,
    132,   133,   135,   134,   158,    90,     0,    79,    85,    88,     145,   144,   137,   136,   138,   139,   141,   140,   166,    92,
     87,     0,    83,     0,    81,    86,    91,    69,    72,    16,       0,    88,     0,    86,    91,    72,    75,   167,    59,   165,
     76,   159,   160,    78,     0,    77,    80,    84,    82,     0,      95,    80,    84,    90,    93,   167,    83,     0,    82,    17,
      0,     0     166,     0,    89,    87,    85,    81,     0,     0,     0
 };  };
   
 static const short yydefgoto[] = {   250,  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,   134,   155,    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,   226,   112,   113,    17,      35,    36,    75,    76,   107,   198,    77,    78,   140,   241,
    130,    49,   133,    88,   188,   189,   190,   191,   192,   227,     142,   143,    17,   123,    49,   127,    88,   189,   190,   191,
    234,   232,   228,   235,   233,   229,   236,    37,    64,    39,     229,   252,   192,   193,   242,   233,   231,   243,   234,   232,
     40,    41,    65,    43,    44,    45,    62,    58,    59,    66,     244,    37,    64,    39,    40,    41,    65,    43,    44,    45,
     47,    48,   237,   132,   155,    19,   230,    20      60,   136,    62,    58,    59,    66,    47,    48,   235,   125,
      126,   156,    19,   245,    20
 };  };
   
 static const short yypact[] = {    13,  static const short yypact[] = {     5,
 -32768,    24,    98,-32768,    36,-32768,-32768,-32768,-32768,-32768,  -32768,    22,    35,-32768,   -13,-32768,-32768,-32768,-32768,-32768,
     14,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,       8,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
    -26,    39,    14,    44,    45,   100,-32768,-32768,    47,-32768,      -9,     9,-32768,    36,    20,    44,-32768,-32768,    40,-32768,
 -32768,-32768,    52,-32768,-32768,-32768,-32768,   118,-32768,    59,  -32768,-32768,   -29,-32768,-32768,-32768,-32768,    52,-32768,    -8,
 -32768,     4,-32768,-32768,-32768,   118,    -3,-32768,    45,-32768,  -32768,     4,-32768,-32768,-32768,    52,    -3,-32768,    20,-32768,
 -32768,   101,   113,    71,-32768,    44,-32768,    70,-32768,    32,  -32768,    72,   120,    90,-32768,    36,-32768,    89,-32768,     8,
 -32768,-32768,    73,   118,    83,   118,    70,-32768,   100,    83,  -32768,-32768,    92,    52,    88,    52,    89,-32768,    44,    88,
 -32768,    27,    14,    57,-32768,-32768,-32768,-32768,     1,-32768,  -32768,-32768,     8,    99,-32768,-32768,-32768,-32768,    18,-32768,
 -32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  -32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
     20,-32768,    78,    91,-32768,    90,    94,-32768,   135,-32768,      32,-32768,   100,   102,-32768,    97,   101,-32768,   147,-32768,
 -32768,-32768,-32768,-32768,-32768,    83,    92,    14,   -22,   106,  -32768,-32768,-32768,     8,-32768,    88,    13,   121,-32768,    99,
 -32768,-32768,-32768,-32768,   115,-32768,    57,    57,    57,    57,      99,    99,    99,    99,    99,    99,    99,    42,    99,     8,
     57,    57,    57,    57,   105,    57,    14,    14,-32768,-32768,       8,-32768,-32768,   117,   315,-32768,    54,-32768,-32768,-32768,
    114,   281,    72,-32768,-32768,-32768,-32768,   142,-32768,   107,  -32768,   148,-32768,   108,-32768,   150,   152,     8,    31,-32768,
 -32768,    14,-32768,-32768,   440,   440,   440,   440,-32768,-32768,  -32768,-32768,-32768,-32768,-32768,   443,   443,   443,   443,-32768,
 -32768,-32768,   236,-32768,   112,   120,-32768,    57,    57,    57,  -32768,-32768,-32768,   270,-32768,   143,   144,-32768,    99,    99,
     57,    57,    57,    57,    57,    57,    57,    57,    57,    57,      99,    99,    99,    99,    99,    99,    99,    99,    99,    99,
     57,    57,    57,    57,    57,    57,    57,    57,    57,    57,      99,    99,    99,    99,    99,    99,    99,    99,    99,    99,
     57,    57,    57,    57,    41,    14,    57,     5,-32768,-32768,      99,    99,    99,    99,    99,-32768,     8,    99,    30,-32768,
 -32768,-32768,-32768,    14,-32768,-32768,-32768,   371,   343,   312,  -32768,-32768,-32768,-32768,-32768,-32768,     8,   154,-32768,-32768,
    244,   399,   399,   412,   412,   136,   136,   399,   399,   399,  -32768,   374,   145,   346,   278,   402,   402,   415,   415,   179,
    399,   412,   412,   440,   399,   399,   447,   453,    93,    93,     179,   402,   402,   402,   402,   415,   415,   443,   402,   402,
 -32768,-32768,-32768,-32768,   -11,-32768,    19,-32768,-32768,-32768,      76,   155,    93,    93,-32768,-32768,-32768,-32768,    15,-32768,
 -32768,   -10,-32768,   -33,-32768,-32768,-32768,-32768,-32768,-32768,     -21,-32768,   -28,-32768,-32768,-32768,-32768,     8,-32768,    70,
 -32768,    41,    14,-32768,    57,-32768,-32768,-32768,-32768,   180,  -32768,   164,-32768,-32768,-32768,     8,-32768,    99,-32768,-32768,
    181,-32768      15,   156,-32768,-32768,-32768,-32768,   221,   223,-32768
 };  };
   
 static const short yypgoto[] = {-32768,  static const short yypgoto[] = {-32768,
 -32768,-32768,   177,-32768,-32768,-32768,    99,-32768,-32768,-32768,  -32768,-32768,   219,-32768,-32768,-32768,   134,-32768,-32768,-32768,
    129,-32768,-32768,-32768,     3,   -18,    -7,   -71,-32768,     0,  -32768,   172,-32768,-32768,-32768,     1,   -55,    -7,  -104,-32768,
 -32768,-32768,    -6,-32768,-32768,   -37,-32768,-32768,-32768,-32768,       0,-32768,-32768,    -5,-32768,-32768,   -36,-32768,-32768,-32768,
 -32768,-32768,-32768,-32768,-32768,-32768,   119,-32768,-32768,-32768,  -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   123,
      2,-32768,-32768,-32768,-32768,    -4,-32768,-32768,-32768,-32768,  -32768,-32768,-32768,     2,-32768,-32768,-32768,-32768,    38,-32768,
 -32768,-32768,   -50,   -52,   -48,-32768,-32768,   -16,    95,   -23,  -32768,-32768,-32768,-32768,-32768,-32768,-32768,   -23,   -16,   -12,
 -32768,   -24,     9,-32768,-32768,-32768,   169,-32768,   168,   224,  -32768,   -11,    84,   -22,-32768,   -30,     3,-32768,-32768,-32768,
 -32768,-32768,   154,    40,   102,-32768,   157,   -20  -32768,-32768,   177,-32768,   178,   232,-32768,-32768,   163,    95,
   -32768,   122,-32768,   135,    -1
 };  };
   
   
 #define YYLAST          494  #define YYLAST          484
   
   
 static const short yytable[] = {    15,  static const short yytable[] = {    15,
    109,    18,    10,    51,    60,    55,   -98,   238,    84,    68,      10,    18,   139,    51,   104,    42,  -102,    81,     1,    84,
     15,    42,    18,    81,    80,   245,     1,     1,    63,    52,      15,     1,    18,    55,    68,    80,   137,    72,   240,    63,
     53,   246,    15,    89,    18,   -64,   -64,    21,    84,    85,     248,    73,    55,    22,    74,    21,   249,   246,    70,    84,
    107,    94,    98,   101,    70,     1,   -89,   -89,   243,    81,     247,     2,   236,    81,    85,    89,    52,    53,    22,    61,
     80,   244,    87,    55,   225,    80,    82,    61,    22,    71,      82,    80,    71,    87,    83,    22,    80,    67,    42,     2,
     56,   185,    51,    86,    42,   186,   -97,     2,   187,    15,      94,    98,   101,    86,     3,    79,  -101,     3,    56,    15,
    116,    18,     3,     3,   108,  -160,   241,   242,     4,     4,       4,    18,     3,     4,     3,    57,    23,    56,     4,    24,
    135,    15,    15,    18,    18,   115,     3,   106,   141,   104,       4,   106,    15,   108,    18,    89,   186,  -167,   -67,   -67,
      2,     3,     4,   117,   118,   119,   120,     4,    56,   142,     187,    23,   197,   188,    24,    25,    38,    26,    23,   129,
      3,    23,   121,   122,    24,    57,     4,    38,    72,   123,      23,    24,    25,    24,   167,   168,    51,   135,    23,   138,
    124,    22,    73,    67,    89,    74,   125,    15,    22,    18,     186,    24,   109,    15,   187,    18,    15,   188,    18,    69,
    126,    83,     4,   109,   127,   128,    95,    53,   185,    56,     179,   180,   181,   182,   183,   184,   185,   -94,   -94,    15,
     69,    79,   186,   136,   105,   187,    15,    15,    18,    18,      15,    18,    18,    95,   139,   110,   111,   112,   113,    38,
    181,   182,   183,   184,    51,   -97,   -14,   137,   139,   -60,     182,   183,   184,   185,   114,   115,    53,    15,    56,    18,
     38,    15,   138,    18,    23,   193,    23,    24,    25,    24,    -101,   116,   117,   105,   131,   130,   139,   -14,   118,   132,
     26,    23,   194,   143,    24,    25,   145,   146,   147,   148,     133,   194,   119,   195,     4,   159,   120,   121,   162,   163,
    149,   150,   151,   152,    23,   153,   144,    24,   157,   196,     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
    109,   179,   180,   181,   182,   183,   184,   108,   197,   251,     174,   158,   145,   167,   168,   175,   176,   177,   178,   179,
    252,    50,   100,   239,    15,    15,    18,    18,   231,   134,     180,   181,   182,   183,   184,   185,    15,   230,    18,    51,
    111,   247,   249,    15,   248,    18,   240,   198,   199,   200,     180,   181,   182,   183,   184,   185,    15,   196,    18,   -63,
    201,   202,   203,   204,   205,   206,   207,   208,   209,   210,     200,   239,   201,   256,   146,   147,   148,   149,   150,   151,
    211,   212,   213,   214,   215,   216,   217,   218,   219,   220,     152,   153,   251,   154,   180,   181,   182,   183,   184,   185,
    221,   222,   223,   224,   102,   103,    46,   131,   114,   156,     258,   138,   259,    50,   128,   100,   237,   255,    15,   141,
      0,     0,     0,     0,   108,     0,     0,     0,     0,     0,      18,   254,   102,   253,    46,   103,   124,    15,   250,    18,
      0,    15,    15,    18,    18,   231,   158,   159,   160,   161,       0,   144,   157,   138,     0,    15,   230,    18,     0,     0,
    162,   163,   164,   165,   166,   167,   168,   169,   170,   171,      15,     0,    18,   202,   203,   204,   205,   206,   207,   208,
    172,   173,   166,   167,     0,     0,   174,   175,   176,   177,     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
    178,   179,   180,   181,   182,   183,   184,   177,   178,   179,     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
    180,   181,   182,   183,   184,     0,     0,     0,     0,     0,     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
    195,   158,   159,   160,   161,   162,   163,   164,   165,   166,     169,   170,   171,   172,   173,   174,   167,   168,     0,     0,
    167,   168,   169,   170,   171,   172,   173,     0,     0,     0,     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
      0,   174,   175,   176,   177,   178,   179,   180,   181,   182,     185,   178,   179,   180,   181,   182,   183,   184,   185,     0,
    183,   184,   158,   159,     0,   161,   162,   163,   164,   165,       0,     0,     0,     0,   199,   159,   160,   161,   162,   163,
    166,   167,   168,   169,   170,   171,   172,   173,     0,     0,     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
      0,     0,   174,   175,   176,   177,   178,   179,   180,   181,     174,     0,     0,     0,     0,   175,   176,   177,   178,   179,
    182,   183,   184,   158,     0,     0,   161,   162,   163,   164,     180,   181,   182,   183,   184,   185,   159,   160,     0,   162,
    165,   166,   167,   168,   169,   170,   171,   172,   173,     0,     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
      0,     0,     0,   174,   175,   176,   177,   178,   179,   180,     173,   174,     0,     0,     0,     0,   175,   176,   177,   178,
    181,   182,   183,   184,   161,   162,   163,   164,   165,   166,     179,   180,   181,   182,   183,   184,   185,   162,   163,   164,
    167,   168,   169,   170,   171,   172,   173,     0,     0,     0,     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
      0,   174,   175,   176,   177,   178,   179,   180,   181,   182,       0,     0,     0,     0,   175,   176,   177,   178,   179,   180,
    183,   184,   161,     0,     0,   164,   165,   166,   167,     0,     181,   182,   183,   184,   185,   162,     0,     0,   165,   166,
      0,     0,     0,   172,   173,   161,     0,     0,     0,   174,     167,   168,     0,     0,     0,     0,   173,   174,   162,     0,
    166,   167,   177,   178,   179,   180,   181,   182,   183,   184,       0,     0,   175,   167,   168,   178,   179,   180,   181,   182,
      0,     0,   174,     0,     0,   177,   178,   179,   180,   181,     183,   184,   185,     0,     0,   175,     0,     0,   178,   179,
    182,   183,   184,   161,     0,     0,     0,     0,   166,   167,     180,   181,   182,   183,   184,   185,   162,     0,     0,     0,
      0,     0,     0,     0,     0,   166,   167,     0,     0,     0,       0,   167,   168,     0,     0,     0,     0,     0,     0,     0,
      0,   166,   167,   177,   178,   179,   180,   181,   182,   183,       0,     0,     0,     0,     0,     0,   178,   179,   180,   181,
    184,   178,   179,   180,   181,   182,   183,   184,   179,   180,     182,   183,   184,   185
    181,   182,   183,   184  
 };  };
   
 static const short yycheck[] = {     0,  static const short yycheck[] = {     0,
     72,     0,     0,    11,    23,     5,     3,     3,    46,    26,       0,     0,   107,    11,    60,     3,     3,    38,     4,    46,
     11,     3,    11,    38,    38,    49,     4,     4,    25,    46,      11,     4,    11,     5,    26,    38,     4,    47,     4,    25,
     47,    55,    23,     4,    23,    48,    49,     4,    66,    46,      49,    51,     5,     4,    54,     4,    55,    49,    26,    66,
      4,    52,    53,    54,    26,     4,    48,    49,    49,    64,      52,    45,     3,    64,    46,     4,    46,    47,     4,     4,
     64,    52,    49,     5,     4,    69,    38,     4,     4,     3,      38,    64,     3,    49,    53,     4,    69,     4,    46,    45,
     50,    47,    60,    57,    46,    51,    53,    45,    54,    60,      52,    53,    54,    57,    50,     4,    53,    50,    50,    60,
      4,    60,    50,    50,    72,    46,    48,    49,    56,    56,      56,    60,    50,    56,    50,    57,    47,    50,    56,    50,
     91,    72,    73,    72,    73,    73,    50,    69,    99,    48,      56,    69,    73,    73,    73,     4,    47,    46,    48,    49,
     45,    50,    56,    27,    28,    29,    30,    56,    50,   108,      51,    47,   138,    54,    50,    51,     3,    53,    47,    91,
     50,    47,    36,    37,    50,    57,    56,     3,    47,    43,      47,    50,    51,    50,    19,    20,   104,    99,    47,   107,
     44,     4,    51,     4,     4,    54,    50,   108,     4,   108,      47,    50,     4,   104,    51,   104,   107,    54,   107,    26,
     54,    53,    56,   185,    58,    59,     4,    47,    47,    50,      35,    36,    37,    38,    39,    40,    41,    48,    49,   120,
     26,     4,    51,    46,    52,    54,   127,   128,   127,   128,     121,   120,   121,     4,   229,    27,    28,    29,    30,    46,
     38,    39,    40,    41,   142,    53,    46,    48,     4,    48,      38,    39,    40,    41,    36,    37,    47,   138,    50,   138,
     46,   142,    49,   142,    47,     4,    47,    50,    51,    50,      53,    43,    44,    52,    48,    46,   251,    46,    50,    49,
     53,    47,    46,    48,    50,    51,   117,   118,   119,   120,       4,     4,    54,    46,    56,    11,    58,    59,    14,    15,
    121,   122,   123,   124,    47,   126,    52,    50,    55,    58,      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
    242,    36,    37,    38,    39,    40,    41,   185,    59,     0,      26,    55,    52,    19,    20,    31,    32,    33,    34,    35,
      0,     5,    54,   188,   185,   186,   185,   186,   186,    91,      36,    37,    38,    39,    40,    41,   187,   187,   187,   197,
     72,   242,   245,   194,   243,   194,   194,   158,   159,   160,      36,    37,    38,    39,    40,    41,   197,    48,   197,    48,
    161,   162,   163,   164,   165,   166,   167,   168,   169,   170,      58,    48,    59,    48,   110,   111,   112,   113,   114,   115,
    171,   172,   173,   174,   175,   176,   177,   178,   179,   180,     116,   117,    49,   119,    36,    37,    38,    39,    40,    41,
    181,   182,   183,   184,    56,    58,     3,    74,    72,   128,       0,   229,     0,     5,    91,    54,   189,   251,   229,   107,
     -1,    -1,    -1,    -1,   242,    -1,    -1,    -1,    -1,    -1,     229,   248,    56,   246,     3,    58,    74,   238,   238,   238,
     -1,   242,   243,   242,   243,   243,    11,    12,    13,    14,      -1,   107,   121,   251,    -1,   246,   246,   246,    -1,    -1,
      251,    -1,   251,   159,   160,   161,   162,   163,   164,   165,
      166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
      176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,    19,    20,    -1,    -1,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
       41,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
       -1,    -1,    -1,    -1,    55,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    11,    12,    -1,    14,
     15,    16,    17,    18,    19,    20,    21,    22,    23,    24,      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
     25,    26,    19,    20,    -1,    -1,    31,    32,    33,    34,      25,    26,    -1,    -1,    -1,    -1,    31,    32,    33,    34,
     35,    36,    37,    38,    39,    40,    41,    34,    35,    36,      35,    36,    37,    38,    39,    40,    41,    14,    15,    16,
     37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,    -1,      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
     55,    11,    12,    13,    14,    15,    16,    17,    18,    19,      -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,    36,
     20,    21,    22,    23,    24,    25,    26,    -1,    -1,    -1,      37,    38,    39,    40,    41,    14,    -1,    -1,    17,    18,
     -1,    31,    32,    33,    34,    35,    36,    37,    38,    39,      19,    20,    -1,    -1,    -1,    -1,    25,    26,    14,    -1,
     40,    41,    11,    12,    -1,    14,    15,    16,    17,    18,      -1,    -1,    31,    19,    20,    34,    35,    36,    37,    38,
     19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,      39,    40,    41,    -1,    -1,    31,    -1,    -1,    34,    35,
     -1,    -1,    31,    32,    33,    34,    35,    36,    37,    38,      36,    37,    38,    39,    40,    41,    14,    -1,    -1,    -1,
     39,    40,    41,    11,    -1,    -1,    14,    15,    16,    17,      -1,    19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,      -1,    -1,    -1,    -1,    -1,    -1,    34,    35,    36,    37,
     -1,    -1,    -1,    31,    32,    33,    34,    35,    36,    37,  
     38,    39,    40,    41,    14,    15,    16,    17,    18,    19,  
     20,    21,    22,    23,    24,    25,    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,    14,    -1,    -1,    -1,    31,  
     19,    20,    34,    35,    36,    37,    38,    39,    40,    41,  
     -1,    -1,    31,    -1,    -1,    34,    35,    36,    37,    38,  
     39,    40,    41,    14,    -1,    -1,    -1,    -1,    19,    20,  
     -1,    -1,    -1,    -1,    -1,    19,    20,    -1,    -1,    -1,  
     -1,    19,    20,    34,    35,    36,    37,    38,    39,    40,  
     41,    35,    36,    37,    38,    39,    40,    41,    36,    37,  
     38,    39,    40,    41      38,    39,    40,    41
 };  };
 #define YYPURE 1  #define YYPURE 1
Line 763  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 1030  yyreduce: Line 1044  yyreduce:
   switch (yyn) {    switch (yyn) {
   
 case 1:  case 1:
 #line 114 "compile.y"  #line 121 "compile.y"
 {  {
         MethodPtr method(new Method(main_method_name, Method::CT_ANY,          Method& method=*new Method(Method::CT_ANY,
                 0, 0, /*min, max numbered_params_count*/                  0, 0, /*min, max numbered_params_count*/
                 ArrayStringPtr(0)/*param_names*/, ArrayStringPtr(0)/*local_names*/,                   0/*param_names*/, 0/*local_names*/, 
                 yyvsp[0]/*parser_code*/, 0/*native_code*/));                  yyvsp[0]/*parser_code*/, 0/*native_code*/);
         PC.cclass->add_method(main_method_name, method);          PC.cclass->add_method(PC.alias_method(main_method_name), method);
 ;  ;
     break;}      break;}
 case 8:  case 8:
 #line 129 "compile.y"  #line 136 "compile.y"
 {  {
         StringPtr command=LA2S(*yyvsp[-2]);          const String& command=*LA2S(*yyvsp[-2]);
         YYSTYPE strings_code=yyvsp[0];          YYSTYPE strings_code=yyvsp[0];
         if(strings_code->count()<1*2) {          if(strings_code->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");
                 YYERROR;                  YYERROR;
         }          }
         if(*command==CLASS_NAME) {          if(command==CLASS_NAME) {
                 if(PC.cclass->base_class()) { // already changed from default?                  if(PC.cclass->base_class()) { // already changed from default?
                         strcpy(PC.error, "class already have a name '");                          strcpy(PC.error, "class already have a name '");
                         strncat(PC.error, PC.cclass->name()->cstr(), 100);                          strncat(PC.error, PC.cclass->name().cstr(), 100);
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         // new class' name                          // new class' name
                         StringPtr name=LA2S(*strings_code);                          const String& name=*LA2S(*strings_code);
                         // creating the class                          // creating the class
                         VStateless_classPtr cclass(new VClass);                          VStateless_class* cclass=new VClass;
                         PC.cclass=cclass.get();                          PC.cclass=cclass;
                         PC.cclass->set_name(name);                          PC.cclass->set_name(name);
                         // append to request's classes                          // append to request's classes
                         PC.request->classes().put(name, cclass);                          PC.request.classes().put(name, 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->count(); i+=2)                   for(size_t i=0; i<strings_code->count(); i+=OPERATIONS_PER_OPVALUE) 
                         PC.request->use_file(*PC.request->main_class, LA2S(*strings_code, i));                          PC.request.use_file(PC.request.main_class, *LA2S(*strings_code, i));
         } else if(*command==BASE_NAME) {          } else if(command==BASE_NAME) {
                 if(PC.cclass->base_class()) { // already changed from default?                  if(PC.cclass->base_class()) { // already changed from default?
                         strcpy(PC.error, "class already have a base '");                          strcpy(PC.error, "class already have a base '");
                         strncat(PC.error, PC.cclass->base_class()->name()->cstr(), 100);                          strncat(PC.error, PC.cclass->base_class()->name().cstr(), 100);
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         StringPtr base_name=LA2S(*strings_code);                          const String& base_name=*LA2S(*strings_code);
                         if(ValuePtr base_class_value=PC.request->classes().get(base_name)) {                          if(Value* base_class_value=PC.request.classes().get(base_name)) {
                                 // @CLASS == @BASE sanity check                                  // @CLASS == @BASE sanity check
                                 if(VStateless_class *base_class=base_class_value->get_class()) {                                  if(VStateless_class *base_class=base_class_value->get_class()) {
                                         if(PC.cclass==base_class) {                                          if(PC.cclass==base_class) {
Line 1091  case 8: Line 1105  case 8:
                                         }                                          }
                                         PC.cclass->get_class()->set_base(base_class);                                          PC.cclass->get_class()->set_base(base_class);
                                 } else { // they asked to derive from a class without methods ['env' & co]                                  } else { // they asked to derive from a class without methods ['env' & co]
                                         strcpy(PC.error, base_name->cstr());                                          strcpy(PC.error, base_name.cstr());
                                         strcat(PC.error, ": you can not derive from this class in @"BASE_NAME);                                          strcat(PC.error, ": you can not derive from this class in @"BASE_NAME);
                                         YYERROR;                                          YYERROR;
                                 }                                  }
                         } else {                          } 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;
                         }                          }
Line 1106  case 8: Line 1120  case 8:
                 }                  }
         } else {          } else {
                 strcpy(PC.error, "'");                  strcpy(PC.error, "'");
                 strncat(PC.error, command->cstr(), MAX_STRING/2);                  strncat(PC.error, command.cstr(), MAX_STRING/2);
                 strcat(PC.error, "' invalid special name. valid names are "                  strcat(PC.error, "' invalid special name. valid names are "
                         "'"CLASS_NAME"', '"USE_CONTROL_METHOD_NAME"' and '"BASE_NAME"'");                          "'"CLASS_NAME"', '"USE_CONTROL_METHOD_NAME"' and '"BASE_NAME"'");
                 YYERROR;                  YYERROR;
Line 1114  case 8: Line 1128  case 8:
 ;  ;
     break;}      break;}
 case 12:  case 12:
 #line 201 "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 206 "compile.y"  #line 212 "compile.y"
 {  { 
         StringPtr 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];
         ArrayStringPtr params_names;          ArrayString* params_names=0;
         if(int size=params_names_code->count()) {          if(int size=params_names_code->count()) {
                 params_names=ArrayStringPtr(new ArrayString);                  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];
         ArrayStringPtr locals_names;          ArrayString* locals_names=0;
         if(int size=locals_names_code->count()) {          if(int size=locals_names_code->count()) {
                 locals_names=ArrayStringPtr(new ArrayString);                  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;
                   }
         }          }
   
         MethodPtr method(new Method(          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;}      break;}
 case 19:  case 17:
 #line 235 "compile.y"  #line 247 "compile.y"
   {
           // fill in the code
           reinterpret_cast<Method*>(yyvsp[-1])->parser_code=yyvsp[0];
   ;
       break;}
   case 20:
   #line 253 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 23:  case 24:
 #line 237 "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 245 "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 251 "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, 
Line 1169  case 35: Line 1199  case 35:
                 ); /* value=pop; wcontext.write(value) */                  ); /* value=pop; wcontext.write(value) */
 ;  ;
     break;}      break;}
 case 36:  case 37:
 #line 258 "compile.y"  #line 276 "compile.y"
 { yyval=yyvsp[0] ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 39:  case 40:
 #line 260 "compile.y"  #line 278 "compile.y"
 { yyval=yyvsp[-1] ;  { yyval=yyvsp[-1] ;
     break;}      break;}
 case 42:  case 43:
 #line 264 "compile.y"  #line 282 "compile.y"
 {  {
         yyval=N();           yyval=N(); 
         ArrayOperationPtr diving_code=yyvsp[0];          ArrayOperation* diving_code=yyvsp[0];
         StringPtr first_name=LA2S(*diving_code);          const String* first_name=LA2S(*diving_code);
         // self.xxx... -> xxx...          // self.xxx... -> xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+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->count()>=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->count()==3)                  if(PC.in_call_value && diving_code->count()==4)
                         (*diving_code)[2].code=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 286 "compile.y"  #line 304 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 45:  case 46:
 #line 287 "compile.y"  #line 305 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 46:  case 47:
 #line 291 "compile.y"  #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 299 "compile.y"  #line 317 "compile.y"
 {  {
         yyval=N();          yyval=N();
         ArrayOperationPtr diving_code=yyvsp[0];          ArrayOperation* diving_code=yyvsp[0];
         StringPtr first_name=LA2S(*diving_code);          const String* first_name=LA2S(*diving_code);
         // $self.xxx... -> $xxx...          // $self.xxx... -> $xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+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->count()>=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);
Line 1237  case 50: Line 1267  case 50:
         /* diving code; stack: current context */          /* diving code; stack: current context */
 ;  ;
     break;}      break;}
 case 51:  case 52:
 #line 316 "compile.y"  #line 334 "compile.y"
 {  {
         yyval=N();           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 321 "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 328 "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 334 "compile.y"  #line 357 "compile.y"
 {   { 
         yyval=N();           yyval=N(); 
         O(*yyval, OP_PREPARE_TO_EXPRESSION);          O(*yyval, OP_PREPARE_TO_EXPRESSION);
Line 1267  case 57: Line 1310  case 57:
         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 342 "compile.y"  #line 365 "compile.y"
 {  {
         // stack: context, name          // stack: context, name
         yyval=N();           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 353 "compile.y"  #line 376 "compile.y"
 {  {
         yyval=N();           yyval=N(); 
         OA(*yyval, OP_OBJECT_POOL, yyvsp[0]); /* stack: empty write context */          OA(*yyval, OP_OBJECT_POOL, yyvsp[0]); /* stack: empty write context */
Line 1284  case 62: Line 1327  case 62:
         /* context=pop; stack: context.value() */          /* context=pop; stack: context.value() */
 ;  ;
     break;}      break;}
 case 65:  case 68:
 #line 360 "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 364 "compile.y"  #line 387 "compile.y"
 {  {
         yyval=yyvsp[0]; /* stack: value */          yyval=yyvsp[0]; /* stack: value */
         changetail_or_append(*yyval,           changetail_or_append(*yyval, 
Line 1297  case 66: Line 1340  case 66:
                 /*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 370 "compile.y"  #line 393 "compile.y"
 {   { 
                                         PC.in_call_value=true;                                           PC.in_call_value=true; 
                         ;                          ;
     break;}      break;}
 case 68:  case 71:
 #line 373 "compile.y"  #line 396 "compile.y"
 {  {
                                 PC.in_call_value=false;                                  PC.in_call_value=false;
                         ;                          ;
     break;}      break;}
 case 69:  case 72:
 #line 376 "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->count()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM]          if(params_code->count()==4) { // probably [] case. [OP_VALUE+origin+Void+STORE_PARAM]
                 if(ValuePtr 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=YYSTYPE(0); // ^zzz[] case. don't append lone empty param.                                  params_code=0; // ^zzz[] case. don't append lone empty param.
         }          }
         /* stack: context, method_junction */          /* stack: context, method_junction */
         OA(*yyval, OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value          OA(*yyval, OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value
 ;  ;
     break;}      break;}
 case 72:  case 75:
 #line 391 "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 397 "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;}      break;}
 case 77:  case 80:
 #line 398 "compile.y"  #line 423 "compile.y"
   {
           PC.explicit_result=*reinterpret_cast<bool*>(&yyvsp[-1]);
   ;
       break;}
   case 81:
   #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 399 "compile.y"  #line 427 "compile.y"
 {yyval=yyvsp[-1];  {yyval=yyvsp[-1];
     break;}      break;}
 case 80:  case 85:
 #line 402 "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 406 "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 410 "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 412 "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 416 "compile.y"  #line 444 "compile.y"
 {  {
         yyval=N();           YYSTYPE expr_code=yyvsp[0];
         OA(*yyval, OP_EXPR_CODE__STORE_PARAM, yyvsp[0]);          if(expr_code->count()==3
                   && (*expr_code)[0].code==OP_VALUE) { // optimizing (double) case. [OP_VALUE+origin+Double]
                   yyval=expr_code; 
                   O(*yyval, OP_STORE_PARAM); // no evaluating
           } else {
                   ArrayOperation* code=N();
                   O(*code, OP_PREPARE_TO_EXPRESSION);
                   P(*code, *expr_code);
                   O(*code, OP_WRITE_EXPR_RESULT);
                   yyval=N(); 
                   OA(*yyval, OP_EXPR_CODE__STORE_PARAM, code);
           }
 ;  ;
     break;}      break;}
 case 87:  case 92:
 #line 420 "compile.y"  #line 459 "compile.y"
 {  {
         yyval=N();           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 97:
 #line 429 "compile.y"  #line 471 "compile.y"
 {  
         yyval=N();   
         O(*yyval, OP_PREPARE_TO_EXPRESSION);  
         P(*yyval, *yyvsp[0]);  
         O(*yyval, OP_WRITE_EXPR_RESULT);  
 ;  
     break;}  
 case 93:  
 #line 438 "compile.y"  
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 95:  case 99:
 #line 440 "compile.y"  #line 473 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 97:  case 101:
 #line 442 "compile.y"  #line 475 "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
Line 1401  case 97: Line 1459  case 97:
         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 102:
 #line 450 "compile.y"  #line 483 "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 108:
 #line 463 "compile.y"  #line 496 "compile.y"
 {  {
         yyval=yyvsp[0];          yyval=yyvsp[0];
         O(*yyval, OP_GET_ELEMENT);          O(*yyval, OP_GET_ELEMENT);
 ;  ;
     break;}      break;}
 case 105:  case 109:
 #line 467 "compile.y"  #line 500 "compile.y"
 {  {
         ArrayOperationPtr 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]);
Line 1428  case 105: Line 1486  case 105:
         OA(*yyval, OP_STRING_POOL, code);          OA(*yyval, OP_STRING_POOL, code);
 ;  ;
     break;}      break;}
 case 106:  case 110:
 #line 476 "compile.y"  #line 509 "compile.y"
   {
           // allow $result_or_other_variable[ letters here any time ]
           *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
   ;
       break;}
   case 111:
   #line 512 "compile.y"
   {
           PC.explicit_result=*reinterpret_cast<bool*>(&yyvsp[-1]);
   ;
       break;}
   case 112:
   #line 514 "compile.y"
 {  {
         yyval=N();           yyval=N(); 
         OA(*yyval, OP_OBJECT_POOL, yyvsp[-1]); /* stack: empty write context */          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 113:
 #line 482 "compile.y"  #line 520 "compile.y"
 {  {
         yyval=N();           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 115:
 #line 487 "compile.y"  #line 525 "compile.y"
 { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;  { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;
     break;}      break;}
 case 110:  case 116:
 #line 488 "compile.y"  #line 526 "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 119:
 #line 497 "compile.y"  #line 535 "compile.y"
 {  {
         yyval=yyvsp[-1]; // stack: class name string          yyval=yyvsp[-1]; // stack: class name string
         if(*LA2S(*yyval) == BASE_NAME) { // pseude BASE class          if(*LA2S(*yyval) == BASE_NAME) { // pseudo BASE class
                 if(VStateless_class* base=PC.cclass->base_class()) {                  if(VStateless_class* base=PC.cclass->base_class()) {
                         change_string_literal_value(*yyval, base->name());                          change_string_literal_value(*yyval, base->name());
                 } else {                  } else {
Line 1471  case 113: Line 1542  case 113:
         O(*yyval, OP_GET_CLASS);          O(*yyval, OP_GET_CLASS);
 ;  ;
     break;}      break;}
 case 114:  case 120:
 #line 509 "compile.y"  #line 547 "compile.y"
 {  {
         yyval=yyvsp[-1];          yyval=yyvsp[-1];
         if(!PC.in_call_value) {          if(!PC.in_call_value) {
Line 1482  case 114: Line 1553  case 114:
         O(*yyval, OP_PREPARE_TO_CONSTRUCT_OBJECT);          O(*yyval, OP_PREPARE_TO_CONSTRUCT_OBJECT);
 ;  ;
     break;}      break;}
 case 115:  case 125:
 #line 521 "compile.y"  #line 564 "compile.y"
 {  
         // see OP_PREPARE_TO_EXPRESSION!!  
         if((yyval=yyvsp[0])->count()==2) // only one string literal in there?  
                 change_string_literal_to_double_literal(*yyval); // make that string literal Double  
 ;  
     break;}  
 case 119:  
 #line 530 "compile.y"  
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 120:  case 126:
 #line 531 "compile.y"  #line 565 "compile.y"
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 121:  case 127:
 #line 532 "compile.y"  #line 566 "compile.y"
 { yyval = yyvsp[-1]; ;  { yyval = yyvsp[-1]; ;
     break;}      break;}
 case 122:  case 128:
 #line 534 "compile.y"  #line 568 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_NEG) ;  { yyval=yyvsp[0];  O(*yyval, OP_NEG) ;
     break;}      break;}
 case 123:  case 129:
 #line 535 "compile.y"  #line 569 "compile.y"
 { yyval=yyvsp[0] ;  { yyval=yyvsp[0] ;
     break;}      break;}
 case 124:  case 130:
 #line 536 "compile.y"  #line 570 "compile.y"
 { yyval=yyvsp[0];        O(*yyval, OP_INV) ;  { yyval=yyvsp[0];        O(*yyval, OP_INV) ;
     break;}      break;}
 case 125:  case 131:
 #line 537 "compile.y"  #line 571 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_NOT) ;  { yyval=yyvsp[0];  O(*yyval, OP_NOT) ;
     break;}      break;}
 case 126:  case 132:
 #line 538 "compile.y"  #line 572 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_DEF) ;  { yyval=yyvsp[0];  O(*yyval, OP_DEF) ;
     break;}      break;}
 case 127:  case 133:
 #line 539 "compile.y"  #line 573 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_IN) ;  { yyval=yyvsp[0];  O(*yyval, OP_IN) ;
     break;}      break;}
 case 128:  case 134:
 #line 540 "compile.y"  #line 574 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_FEXISTS) ;  { yyval=yyvsp[0];  O(*yyval, OP_FEXISTS) ;
     break;}      break;}
 case 129:  case 135:
 #line 541 "compile.y"  #line 575 "compile.y"
 { yyval=yyvsp[0];  O(*yyval, OP_DEXISTS) ;  { yyval=yyvsp[0];  O(*yyval, OP_DEXISTS) ;
     break;}      break;}
 case 130:  case 136:
 #line 543 "compile.y"  #line 577 "compile.y"
 {       yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_SUB) ;  {       yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_SUB) ;
     break;}      break;}
 case 131:  case 137:
 #line 544 "compile.y"  #line 578 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_ADD) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_ADD) ;
     break;}      break;}
 case 132:  case 138:
 #line 545 "compile.y"  #line 579 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MUL) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MUL) ;
     break;}      break;}
 case 133:  case 139:
 #line 546 "compile.y"  #line 580 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_DIV) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_DIV) ;
     break;}      break;}
 case 134:  case 140:
 #line 547 "compile.y"  #line 581 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MOD) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_MOD) ;
     break;}      break;}
 case 135:  case 141:
 #line 548 "compile.y"  #line 582 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_INTDIV) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_INTDIV) ;
     break;}      break;}
 case 136:  case 142:
 #line 549 "compile.y"  #line 583 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SL) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SL) ;
     break;}      break;}
 case 137:  case 143:
 #line 550 "compile.y"  #line 584 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_SR) ;
     break;}      break;}
 case 138:  case 144:
 #line 551 "compile.y"  #line 585 "compile.y"
 { yyval=yyvsp[-2];      P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_AND) ;  { yyval=yyvsp[-2];      P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_AND) ;
     break;}      break;}
 case 139:  case 145:
 #line 552 "compile.y"  #line 586 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_OR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_OR) ;
     break;}      break;}
 case 140:  case 146:
 #line 553 "compile.y"  #line 587 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_XOR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_BIN_XOR) ;
     break;}      break;}
 case 141:  case 147:
 #line 554 "compile.y"  #line 588 "compile.y"
 { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_AND) ;  { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_AND) ;
     break;}      break;}
 case 142:  case 148:
 #line 555 "compile.y"  #line 589 "compile.y"
 { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_OR) ;  { yyval=yyvsp[-2];  OA(*yyval, OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP_LOG_OR) ;
     break;}      break;}
 case 143:  case 149:
 #line 556 "compile.y"  #line 590 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_LOG_XOR) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_LOG_XOR) ;
     break;}      break;}
 case 144:  case 150:
 #line 557 "compile.y"  #line 591 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LT) ;
     break;}      break;}
 case 145:  case 151:
 #line 558 "compile.y"  #line 592 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GT) ;
     break;}      break;}
 case 146:  case 152:
 #line 559 "compile.y"  #line 593 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_LE) ;
     break;}      break;}
 case 147:  case 153:
 #line 560 "compile.y"  #line 594 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_GE) ;
     break;}      break;}
 case 148:  case 154:
 #line 561 "compile.y"  #line 595 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_EQ) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_EQ) ;
     break;}      break;}
 case 149:  case 155:
 #line 562 "compile.y"  #line 596 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_NE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_NUM_NE) ;
     break;}      break;}
 case 150:  case 156:
 #line 563 "compile.y"  #line 597 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LT) ;
     break;}      break;}
 case 151:  case 157:
 #line 564 "compile.y"  #line 598 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GT) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GT) ;
     break;}      break;}
 case 152:  case 158:
 #line 565 "compile.y"  #line 599 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_LE) ;
     break;}      break;}
 case 153:  case 159:
 #line 566 "compile.y"  #line 600 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_GE) ;
     break;}      break;}
 case 154:  case 160:
 #line 567 "compile.y"  #line 601 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_EQ) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_EQ) ;
     break;}      break;}
 case 155:  case 161:
 #line 568 "compile.y"  #line 602 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_NE) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_STR_NE) ;
     break;}      break;}
 case 156:  case 162:
 #line 569 "compile.y"  #line 603 "compile.y"
 { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_IS) ;  { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP_IS) ;
     break;}      break;}
 case 157:  case 163:
 #line 572 "compile.y"  #line 606 "compile.y"
   {
           // optimized from OP_STRING->OP_VALUE for doubles
           maybe_change_string_literal_to_double_literal(*(yyval=yyvsp[0]));
   ;
       break;}
   case 164:
   #line 611 "compile.y"
 {  {
         yyval=N();          yyval=N();
         OA(*yyval, OP_STRING_POOL, yyvsp[0]); /* stack: empty write context */          OA(*yyval, OP_STRING_POOL, yyvsp[0]); /* stack: empty write context */
Line 1651  case 157: Line 1721  case 157:
         /* context=pop; stack: context.get_string() */          /* context=pop; stack: context.get_string() */
 ;  ;
     break;}      break;}
 case 158:  case 165:
 #line 581 "compile.y"  #line 620 "compile.y"
 {  {
         // optimized from OP_STRING+OP_WRITE_VALUE to OP_STRING__WRITE          // optimized from OP_STRING+OP_WRITE_VALUE to OP_STRING__WRITE
         change_string_literal_to_write_string_literal(*(yyval=yyvsp[0]))          change_string_literal_to_write_string_literal(*(yyval=yyvsp[0]))
 ;  ;
     break;}      break;}
 case 159:  case 166:
 #line 586 "compile.y"  #line 625 "compile.y"
 { yyval=VL(ValuePtr(new VVoid())) ;  { yyval=VL(new VVoid(), 0, 0, 0) ;
     break;}      break;}
 case 160:  case 167:
 #line 587 "compile.y"  #line 626 "compile.y"
 { yyval=N() ;  { yyval=N() ;
     break;}      break;}
 }  }
Line 1888  yyerrhandle: Line 1958  yyerrhandle:
     }      }
   return 1;    return 1;
 }  }
 #line 589 "compile.y"  #line 628 "compile.y"
   
 #endif  #endif
   
Line 1908  yyerrhandle: Line 1978  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=='^') {                  }
                         if(PC.ls==LS_METHOD_AFTER) {                  if(c=='^') {
                           if(pc.ls==LS_METHOD_AFTER) {
                                 // handle after-method situation                                  // handle after-method situation
                                 pop_LS(PC);                                  pop_LS(pc);
                                 result=EON;                                  result=EON;
                                 skip_analized=-1; // return to punctuation afterwards to assure it's literality                                  skip_analized=-1; // return to punctuation afterwards to assure it's literality
                                 goto break2;                                  goto break2;
                         }                          }
                         switch(PC.ls) {                          switch(pc.ls) {
 case LS_EXPRESSION_VAR_NAME_WITH_COLON:  case LS_EXPRESSION_VAR_NAME_WITH_COLON:
 case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:  case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:
 case LS_VAR_NAME_SIMPLE_WITH_COLON:  case LS_VAR_NAME_SIMPLE_WITH_COLON:
Line 1968  case LS_DEF_COMMENT: Line 2049  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 1976  default: Line 2057  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
                                 begin=PC.source; // ->punctuation                                  begin=pc.source; // ->punctuation
                                 begin_line=PC.line;                                  begin_pos=pc.pos;
                                 // skip over _ after ^                                  // skip over _ after ^
                                 PC.source++;  PC.col++;                                  pc.source++;  pc.pos.col++;
                                 // skip analysis = forced literal                                  // skip analysis = forced literal
                                 continue;                                  continue;
   
                         // converting ^#HH into char(hex(HH))                          // converting ^#HH into char(hex(HH))
                         case '#':                          case '#':
                                 if(end!=begin) {                                  if(end!=begin) {
                                           if(!pc.string_start)
                                                   pc.string_start=begin_pos;
                                         // append piece till ^                                          // append piece till ^
                                         PC.string->APPEND_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; // ->after ^#HH                                          begin=pc.source; // ->after ^#HH
                                         begin_line=PC.line;                                          begin_pos=pc.pos;
                                         // skip analysis = forced literal                                          // skip analysis = forced literal
                                         continue;                                          continue;
                                 }                                  }
Line 2020  default: Line 2104  default:
                         }                          }
                 }                  }
                 // #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_USER_COMMENT);                          push_LS(pc, LS_USER_COMMENT);
                         continue;                          continue;
                 }                  }
                 switch(PC.ls) {                  switch(pc.ls) {
   
                 // USER'S = NOT OURS                  // USER'S = NOT OURS
                 case LS_USER:                  case LS_USER:
         case LS_NAME_SQUARE_PART: // name.[here].xxx                  case LS_NAME_SQUARE_PART: // name.[here].xxx
                         if(PC.trim_bof)                          if(pc.trim_bof)
                                 switch(c) {                                  switch(c) {
                                 case '\n': case ' ': case '\t':                                  case '\n': case ' ': case '\t':
                                         begin=PC.source;                                          begin=pc.source;
                                         begin_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_USER_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 2083  default: Line 2179  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 2102  default: Line 2198  default:
                 case LS_DEF_NAME:                  case LS_DEF_NAME:
                         switch(c) {                          switch(c) {
                         case '[':                          case '[':
                                 PC.ls=LS_DEF_PARAMS;                                  pc.ls=LS_DEF_PARAMS;
                                 RC;                                  RC;
                         case '\n':                          case '\n':
                                 PC.ls=LS_DEF_SPECIAL_BODY;                                  pc.ls=LS_DEF_SPECIAL_BODY;
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2118  default: Line 2214  default:
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case ']':                          case ']':
                                 PC.ls=*PC.source=='['?LS_DEF_LOCALS:LS_DEF_COMMENT;                                  pc.ls=*pc.source=='['?LS_DEF_LOCALS:LS_DEF_COMMENT;
                                 RC;                                  RC;
                         case '\n': // wrong. bailing out                          case '\n': // wrong. bailing out
                                 pop_LS(PC);                                  pop_LS(pc);
                                 RC;                                  RC;
                         }                          }
                         break;                          break;
Line 2132  default: Line 2228  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 2158  default: Line 2254  default:
                         switch(c) {                          switch(c) {
                         case ')':                          case ')':
                                 if(--lexical_brackets_nestage==0)                                  if(--lexical_brackets_nestage==0)
                                         if(PC.ls==LS_METHOD_ROUND) // method round param ended                                          if(pc.ls==LS_METHOD_ROUND) // method round param ended
                                                 PC.ls=LS_METHOD_AFTER; // look for method end                                                  pc.ls=LS_METHOD_AFTER; // look for method end
                                         else // PC.ls==LS_VAR_ROUND // variable constructor ended                                          else // pc.ls==LS_VAR_ROUND // variable constructor ended
                                                 pop_LS(PC); // return to normal life                                                  pop_LS(pc); // return to normal life
                                 RC;                                  RC;
                         case '#': // comment start skipping                          case '#': // comment start skipping
                                 if(end!=begin) {                                  if(end!=begin) {
                                           if(!pc.string_start)
                                                   pc.string_start=begin_pos;
                                         // append piece till #                                          // append piece till #
                                         PC.string->APPEND_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_EXPRESSION_COMMENT);                                  push_LS(pc, LS_EXPRESSION_COMMENT);
                                 lexical_brackets_nestage=1;                                  lexical_brackets_nestage=1;
                                 continue;                                  continue;
                         case '$':                          case '$':
                                 push_LS(PC, LS_EXPRESSION_VAR_NAME_WITH_COLON);                                                           push_LS(pc, LS_EXPRESSION_VAR_NAME_WITH_COLON);                         
                                 RC;                                  RC;
                         case '^':                          case '^':
                                 push_LS(PC, LS_METHOD_NAME);                                  push_LS(pc, LS_METHOD_NAME);
                                 RC;                                  RC;
                         case '(':                          case '(':
                                 lexical_brackets_nestage++;                                  lexical_brackets_nestage++;
                                 RC;                                  RC;
                         case '-':                          case '-':
                                 switch(*PC.source) {                                  switch(*pc.source) {
                                 case 'f': // -f                                  case 'f': // -f
                                         skip_analized=1;                                          skip_analized=1;
                                         result=FEXISTS;                                          result=FEXISTS;
Line 2201  default: Line 2299  default:
                         case ';':                          case ';':
                                 RC;                                  RC;
                         case '&': case '|':                          case '&': case '|':
                                 if(*PC.source==c) { // && ||                                  if(*pc.source==c) { // && ||
                                         result=c=='&'?LAND:LOR;                                          result=c=='&'?LAND:LOR;
                                         skip_analized=1;                                          skip_analized=1;
                                 } else                                  } else
                                         result=c;                                          result=c;
                                 goto break2;                                  goto break2;
                         case '!':                          case '!':
                                 switch(PC.source[0]) {                                   switch(pc.source[0]) { 
                                 case '|': // !| !||                                  case '|': // !| !||
                                         skip_analized=1;                                          skip_analized=1;
                                         if(PC.source[1]=='|') {                                          if(pc.source[1]=='|') {
                                                 skip_analized++;                                                  skip_analized++;
                                                 result=LXOR;                                                  result=LXOR;
                                         } else                                          } else
Line 2225  default: Line 2323  default:
                                 RC;                                  RC;
   
                         case '<': // <<, <=, <                          case '<': // <<, <=, <
                                 switch(*PC.source) {                                  switch(*pc.source) {
                                 case '<': // <[<]                                  case '<': // <[<]
                                         skip_analized=1; result=NSL; break;                                          skip_analized=1; result=NSL; break;
                                 case '=': // <[=]                                  case '=': // <[=]
Line 2235  default: Line 2333  default:
                                 }                                  }
                                 goto break2;                                  goto break2;
                         case '>': // >>, >=, >                          case '>': // >>, >=, >
                                 switch(*PC.source) {                                  switch(*pc.source) {
                                 case '>': // >[>]                                  case '>': // >[>]
                                         skip_analized=1; result=NSR; break;                                          skip_analized=1; result=NSR; break;
                                 case '=': // >[=]                                  case '=': // >[=]
Line 2245  default: Line 2343  default:
                                 }                                  }
                                 goto break2;                                  goto break2;
                         case '=': // ==                          case '=': // ==
                                 switch(*PC.source) {                                  switch(*pc.source) {
                                 case '=': // =[=]                                  case '=': // =[=]
                                         skip_analized=1; result=NEQ; break;                                          skip_analized=1; result=NEQ; break;
                                 default: // =[]                                  default: // =[]
Line 2254  default: Line 2352  default:
                                 goto break2;                                  goto break2;
   
                         case '"':                          case '"':
                                 push_LS(PC, LS_EXPRESSION_STRING_QUOTED);                                  push_LS(pc, LS_EXPRESSION_STRING_QUOTED);
                                 RC;                                  RC;
                         case '\'':                          case '\'':
                                 push_LS(PC, LS_EXPRESSION_STRING_APOSTROFED);                                  push_LS(pc, LS_EXPRESSION_STRING_APOSTROFED);
                                 RC;                                  RC;
                         case 'l': case 'g': case 'e': case 'n':                          case 'l': case 'g': case 'e': case 'n':
                                 if(end==begin) // right after whitespace                                  if(end==begin) // right after whitespace
                                         if(isspace(PC.source[1])) {                                          if(isspace(pc.source[1])) {
                                                 switch(*PC.source) {                                                  switch(*pc.source) {
                                                         //                                      case '?': // ok [and bad cases, yacc would bark at them]                                                          //                                      case '?': // ok [and bad cases, yacc would bark at them]
                                                 case 't': // lt gt [et nt]                                                  case 't': // lt gt [et nt]
                                                         result=c=='l'?SLT:c=='g'?SGT:BAD_STRING_COMPARISON_OPERATOR;                                                          result=c=='l'?SLT:c=='g'?SGT:BAD_STRING_COMPARISON_OPERATOR;
Line 2281  default: Line 2379  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 2296  default: Line 2394  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 2310  default: Line 2408  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;                                  continue;
                         }                          }
                         break;                          break;
Line 2319  default: Line 2417  default:
                         if(c=='(')                          if(c=='(')
                                 lexical_brackets_nestage++;                                  lexical_brackets_nestage++;
                                                   
                         switch(*PC.source) {                          switch(*pc.source) {
                         case '\n': case ')':                          case '\n': case ')':
                                 if(*PC.source==')')                                  if(*pc.source==')')
                                         if(--lexical_brackets_nestage!=0)                                          if(--lexical_brackets_nestage!=0)
                                                 continue;                                                  continue;
   
                                 // skip comment                                  // skip comment
                                 begin=PC.source;                                  begin=pc.source;
                                 begin_line=PC.line;                                  begin_pos=pc.pos;
   
                                 pop_LS(PC);                                  pop_LS(pc);
                                 continue;                                  continue;
                         }                          }
                         break;                          break;
Line 2340  default: Line 2438  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 2380  default: Line 2478  default:
                         case ',': 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 2428  default: Line 2526  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 2444  default: Line 2542  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 2466  default: Line 2564  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 2488  default: Line 2586  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 2513  default: Line 2611  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 2520  default: Line 2619  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 2542  default: Line 2641  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 2559  default: Line 2658  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 2596  break2: Line 2705  break2:
                         if(end!=begin && end[-1]=='\n') // allow one empty line before LS_DEF_NAME                          if(end!=begin && end[-1]=='\n') // allow one empty line before LS_DEF_NAME
                                 end--;                                  end--;
                 }                  }
                 if(end!=begin && PC.ls!=LS_USER_COMMENT) { // last piece still alive and not comment?                  if(end!=begin && pc.ls!=LS_USER_COMMENT) { // last piece still alive and not comment?
                           if(!pc.string_start)
                                   pc.string_start=begin_pos;
                         // append it                          // append it
                         PC.string->APPEND_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(ValuePtr(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=StringPtr(new String);                  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().get());                  fprintf(file, " \"%s\"", LA2S(*value)->cstr());
 }  }

Removed from v.1.81.2.10  
changed lines
  Added in v.1.103.8.4


E-mail: