Annotation of parser3/src/main/compile.tab.C, revision 1.126

1.114     misha       1: /* A Bison parser, made by GNU Bison 1.875d.  */
1.112     paf         2: 
                      3: /* Skeleton parser for Yacc-like parsing with Bison,
1.114     misha       4:    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1.112     paf         5: 
                      6:    This program is free software; you can redistribute it and/or modify
                      7:    it under the terms of the GNU General Public License as published by
                      8:    the Free Software Foundation; either version 2, or (at your option)
                      9:    any later version.
                     10: 
                     11:    This program is distributed in the hope that it will be useful,
                     12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14:    GNU General Public License for more details.
                     15: 
                     16:    You should have received a copy of the GNU General Public License
                     17:    along with this program; if not, write to the Free Software
                     18:    Foundation, Inc., 59 Temple Place - Suite 330,
                     19:    Boston, MA 02111-1307, USA.  */
                     20: 
                     21: /* As a special exception, when this file is copied by Bison into a
                     22:    Bison output file, you may use that output file without restriction.
                     23:    This special exception was added by the Free Software Foundation
                     24:    in version 1.24 of Bison.  */
                     25: 
                     26: /* Written by Richard Stallman by simplifying the original so called
                     27:    ``semantic'' parser.  */
                     28: 
                     29: /* All symbols defined below should begin with yy or YY, to avoid
                     30:    infringing on user name space.  This should be done even for local
                     31:    variables, as they might otherwise be expanded by user macros.
                     32:    There are some unavoidable exceptions within include files to
                     33:    define necessary library symbols; they are noted "INFRINGES ON
                     34:    USER NAME SPACE" below.  */
                     35: 
                     36: /* Identify Bison output.  */
                     37: #define YYBISON 1
                     38: 
                     39: /* Skeleton name.  */
1.113     paf        40: #define YYSKELETON_NAME "yacc.c"
1.112     paf        41: 
                     42: /* Pure parsers.  */
                     43: #define YYPURE 1
                     44: 
                     45: /* Using locations.  */
                     46: #define YYLSP_NEEDED 0
1.105     paf        47: 
1.1       parser     48: 
                     49: 
1.112     paf        50: /* Tokens.  */
                     51: #ifndef YYTOKENTYPE
                     52: # define YYTOKENTYPE
                     53:    /* Put the tokens into the symbol table, so that GDB and other debuggers
                     54:       know about them.  */
                     55:    enum yytokentype {
                     56:      EON = 258,
                     57:      STRING = 259,
                     58:      BOGUS = 260,
                     59:      BAD_STRING_COMPARISON_OPERATOR = 261,
                     60:      BAD_HEX_LITERAL = 262,
                     61:      BAD_METHOD_DECL_START = 263,
                     62:      BAD_METHOD_PARAMETER_NAME_CHARACTER = 264,
                     63:      BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE = 265,
                     64:      LAND = 266,
                     65:      LOR = 267,
                     66:      LXOR = 268,
                     67:      NXOR = 269,
                     68:      NLE = 270,
                     69:      NGE = 271,
                     70:      NEQ = 272,
                     71:      NNE = 273,
                     72:      NSL = 274,
                     73:      NSR = 275,
                     74:      SLT = 276,
                     75:      SGT = 277,
                     76:      SLE = 278,
                     77:      SGE = 279,
                     78:      SEQ = 280,
                     79:      SNE = 281,
                     80:      DEF = 282,
                     81:      IN = 283,
                     82:      FEXISTS = 284,
                     83:      DEXISTS = 285,
                     84:      IS = 286,
                     85:      LITERAL_TRUE = 287,
                     86:      LITERAL_FALSE = 288,
                     87:      NUNARY = 289
                     88:    };
                     89: #endif
                     90: #define EON 258
                     91: #define STRING 259
                     92: #define BOGUS 260
                     93: #define BAD_STRING_COMPARISON_OPERATOR 261
                     94: #define BAD_HEX_LITERAL 262
                     95: #define BAD_METHOD_DECL_START 263
                     96: #define BAD_METHOD_PARAMETER_NAME_CHARACTER 264
                     97: #define BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE 265
                     98: #define LAND 266
                     99: #define LOR 267
                    100: #define LXOR 268
                    101: #define NXOR 269
                    102: #define NLE 270
                    103: #define NGE 271
                    104: #define NEQ 272
                    105: #define NNE 273
                    106: #define NSL 274
                    107: #define NSR 275
                    108: #define SLT 276
                    109: #define SGT 277
                    110: #define SLE 278
                    111: #define SGE 279
                    112: #define SEQ 280
                    113: #define SNE 281
                    114: #define DEF 282
                    115: #define IN 283
                    116: #define FEXISTS 284
                    117: #define DEXISTS 285
                    118: #define IS 286
                    119: #define LITERAL_TRUE 287
                    120: #define LITERAL_FALSE 288
                    121: #define NUNARY 289
1.1       parser    122: 
1.112     paf       123: 
                    124: 
                    125: 
                    126: /* Copy the first part of user declarations.  */
1.14      parser    127: #line 1 "compile.y"
1.1       parser    128: 
1.14      parser    129: /** @file
                    130:        Parser: compiler(lexical parser and grammar).
                    131: 
1.106     paf       132:        Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)
1.27      paf       133:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.109     paf       134: 
1.126   ! misha     135:        $Id: compile.y,v 1.233 2009-04-28 11:11:10 misha Exp $
1.14      parser    136: */
1.1       parser    137: 
                    138: /**
                    139:        @todo parser4: 
                    140:        - cache compiled code from request to request. to do that...
                    141:                -#:     make method definitions, @CLASS, @BASE, @USE instructions,
                    142:                        which would be executed afterwards, and actions
                    143:                        now performed at compile time would be delayed to run time.
                    144:                -#:     make cache expiration on time and on disk-change of class source
                    145:                -#:     in apache use subpools for compiled class storage
                    146:                -#:     in iis make up specialized Pool object for that
                    147: */
                    148: 
1.84      paf       149: #define YYSTYPE  ArrayOperation* 
1.1       parser    150: #define YYPARSE_PARAM  pc
                    151: #define YYLEX_PARAM  pc
                    152: #define YYDEBUG  1
                    153: #define YYERROR_VERBOSE        1
1.84      paf       154: #define yyerror(msg)  real_yyerror((Parse_control *)pc, msg)
1.1       parser    155: #define YYPRINT(file, type, value)  yyprint(file, type, value)
                    156: 
1.84      paf       157: // includes
                    158: 
1.1       parser    159: #include "compile_tools.h"
                    160: #include "pa_value.h"
                    161: #include "pa_request.h"
                    162: #include "pa_vobject.h"
                    163: #include "pa_vdouble.h"
                    164: #include "pa_globals.h"
                    165: #include "pa_vvoid.h"
1.72      paf       166: #include "pa_vmethod_frame.h"
1.1       parser    167: 
1.84      paf       168: // defines
                    169: 
1.1       parser    170: #define USE_CONTROL_METHOD_NAME "USE"
1.119     misha     171: #define OPTIONS_CONTROL_METHOD_NAME "OPTIONS"
                    172: #define OPTION_ALL_VARS_LOCAL_NAME "locals"
1.123     misha     173: #define OPTION_PARTIAL_CLASS "partial"
1.1       parser    174: 
1.84      paf       175: // forwards
                    176: 
                    177: static int real_yyerror(Parse_control* pc, char* s);
                    178: static void yyprint(FILE* file, int type, YYSTYPE value);
                    179: static int yylex(YYSTYPE* lvalp, void* pc);
1.1       parser    180: 
1.107     paf       181: static const VBool vfalse(false);
                    182: static const VBool vtrue(true);
                    183: static const VVoid vvoid;
                    184: 
1.1       parser    185: // local convinient inplace typecast & var
1.83      paf       186: #undef PC
1.84      paf       187: #define PC  (*(Parse_control *)pc)
                    188: #undef POOL
1.1       parser    189: #define POOL  (*PC.pool)
                    190: #ifndef DOXYGEN
1.112     paf       191: 
                    192: 
                    193: /* Enabling traces.  */
                    194: #ifndef YYDEBUG
                    195: # define YYDEBUG 0
1.109     paf       196: #endif
1.108     paf       197: 
1.112     paf       198: /* Enabling verbose error messages.  */
                    199: #ifdef YYERROR_VERBOSE
                    200: # undef YYERROR_VERBOSE
                    201: # define YYERROR_VERBOSE 1
                    202: #else
                    203: # define YYERROR_VERBOSE 0
1.106     paf       204: #endif
1.112     paf       205: 
                    206: #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
                    207: typedef int YYSTYPE;
                    208: # define yystype YYSTYPE /* obsolescent; will be withdrawn */
                    209: # define YYSTYPE_IS_DECLARED 1
                    210: # define YYSTYPE_IS_TRIVIAL 1
                    211: #endif
                    212: 
                    213: 
                    214: 
                    215: /* Copy the second part of user declarations.  */
                    216: 
                    217: 
                    218: /* Line 214 of yacc.c.  */
1.119     misha     219: #line 220 "compile.tab.C"
1.112     paf       220: 
                    221: #if ! defined (yyoverflow) || YYERROR_VERBOSE
                    222: 
1.114     misha     223: # ifndef YYFREE
                    224: #  define YYFREE free
                    225: # endif
                    226: # ifndef YYMALLOC
                    227: #  define YYMALLOC malloc
                    228: # endif
                    229: 
1.112     paf       230: /* The parser invokes alloca or malloc; define the necessary symbols.  */
                    231: 
1.113     paf       232: # ifdef YYSTACK_USE_ALLOCA
                    233: #  if YYSTACK_USE_ALLOCA
                    234: #   define YYSTACK_ALLOC alloca
                    235: #  endif
1.112     paf       236: # else
1.113     paf       237: #  if defined (alloca) || defined (_ALLOCA_H)
                    238: #   define YYSTACK_ALLOC alloca
                    239: #  else
                    240: #   ifdef __GNUC__
                    241: #    define YYSTACK_ALLOC __builtin_alloca
1.112     paf       242: #   endif
                    243: #  endif
                    244: # endif
                    245: 
                    246: # ifdef YYSTACK_ALLOC
                    247:    /* Pacify GCC's `empty if-body' warning. */
                    248: #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
                    249: # else
                    250: #  if defined (__STDC__) || defined (__cplusplus)
                    251: #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
                    252: #   define YYSIZE_T size_t
                    253: #  endif
1.114     misha     254: #  define YYSTACK_ALLOC YYMALLOC
                    255: #  define YYSTACK_FREE YYFREE
1.112     paf       256: # endif
                    257: #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
                    258: 
                    259: 
                    260: #if (! defined (yyoverflow) \
                    261:      && (! defined (__cplusplus) \
1.113     paf       262:         || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
1.112     paf       263: 
                    264: /* A type that is properly aligned for any stack member.  */
                    265: union yyalloc
                    266: {
1.114     misha     267:   short int yyss;
1.112     paf       268:   YYSTYPE yyvs;
                    269:   };
                    270: 
                    271: /* The size of the maximum gap between one aligned stack and the next.  */
                    272: # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
                    273: 
                    274: /* The size of an array large to enough to hold all stacks, each with
                    275:    N elements.  */
                    276: # define YYSTACK_BYTES(N) \
1.114     misha     277:      ((N) * (sizeof (short int) + sizeof (YYSTYPE))                    \
1.112     paf       278:       + YYSTACK_GAP_MAXIMUM)
                    279: 
                    280: /* Copy COUNT objects from FROM to TO.  The source and destination do
                    281:    not overlap.  */
                    282: # ifndef YYCOPY
1.113     paf       283: #  if defined (__GNUC__) && 1 < __GNUC__
1.112     paf       284: #   define YYCOPY(To, From, Count) \
                    285:       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
                    286: #  else
                    287: #   define YYCOPY(To, From, Count)             \
                    288:       do                                       \
                    289:        {                                       \
                    290:          register YYSIZE_T yyi;                \
                    291:          for (yyi = 0; yyi < (Count); yyi++)   \
                    292:            (To)[yyi] = (From)[yyi];            \
                    293:        }                                       \
                    294:       while (0)
                    295: #  endif
                    296: # endif
                    297: 
                    298: /* Relocate STACK from its old location to the new one.  The
                    299:    local variables YYSIZE and YYSTACKSIZE give the old and new number of
                    300:    elements in the stack, and YYPTR gives the new location of the
                    301:    stack.  Advance YYPTR to a properly aligned location for the next
                    302:    stack.  */
                    303: # define YYSTACK_RELOCATE(Stack)                                       \
                    304:     do                                                                 \
                    305:       {                                                                        \
                    306:        YYSIZE_T yynewbytes;                                            \
                    307:        YYCOPY (&yyptr->Stack, Stack, yysize);                          \
                    308:        Stack = &yyptr->Stack;                                          \
                    309:        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
                    310:        yyptr += yynewbytes / sizeof (*yyptr);                          \
                    311:       }                                                                        \
                    312:     while (0)
                    313: 
1.1       parser    314: #endif
1.108     paf       315: 
1.112     paf       316: #if defined (__STDC__) || defined (__cplusplus)
                    317:    typedef signed char yysigned_char;
                    318: #else
1.114     misha     319:    typedef short int yysigned_char;
1.112     paf       320: #endif
1.108     paf       321: 
1.112     paf       322: /* YYFINAL -- State number of the termination state. */
                    323: #define YYFINAL  51
                    324: /* YYLAST -- Last index in YYTABLE.  */
1.115     misha     325: #define YYLAST   470
1.112     paf       326: 
                    327: /* YYNTOKENS -- Number of terminals. */
                    328: #define YYNTOKENS  62
                    329: /* YYNNTS -- Number of nonterminals. */
1.115     misha     330: #define YYNNTS  89
1.112     paf       331: /* YYNRULES -- Number of rules. */
1.115     misha     332: #define YYNRULES  172
1.112     paf       333: /* YYNRULES -- Number of states. */
1.115     misha     334: #define YYNSTATES  263
1.112     paf       335: 
                    336: /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
                    337: #define YYUNDEFTOK  2
                    338: #define YYMAXUTOK   289
                    339: 
                    340: #define YYTRANSLATE(YYX)                                               \
                    341:   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
                    342: 
                    343: /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
                    344: static const unsigned char yytranslate[] =
                    345: {
                    346:        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    347:       48,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    348:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    349:        2,     2,     2,    46,    60,     2,    52,    43,    37,    61,
                    350:       56,    57,    40,    38,     2,    39,    55,    41,     2,     2,
                    351:        2,     2,     2,     2,     2,     2,     2,     2,    59,    51,
                    352:       34,     2,    35,     2,    47,     2,     2,     2,     2,     2,
                    353:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    354:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    355:        2,    49,    42,    50,    58,     2,     2,     2,     2,     2,
                    356:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    357:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    358:        2,     2,     2,    53,    36,    54,    45,     2,     2,     2,
                    359:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    360:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    361:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    362:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    363:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    364:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    365:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    366:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    367:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    368:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    369:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    370:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    371:        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
                    372:        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
                    373:       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
                    374:       25,    26,    27,    28,    29,    30,    31,    32,    33,    44
                    375: };
1.105     paf       376: 
1.112     paf       377: #if YYDEBUG
                    378: /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
                    379:    YYRHS.  */
1.114     misha     380: static const unsigned short int yyprhs[] =
1.112     paf       381: {
                    382:        0,     0,     3,     5,     7,     9,    12,    14,    16,    18,
1.115     misha     383:       23,    25,    27,    29,    32,    35,    37,    39,    40,    49,
                    384:       51,    53,    57,    59,    61,    63,    67,    69,    71,    73,
                    385:       75,    77,    80,    82,    84,    86,    88,    90,    92,    95,
                    386:       98,   100,   104,   106,   108,   110,   113,   115,   118,   122,
                    387:      124,   126,   128,   130,   133,   136,   138,   140,   142,   143,
                    388:      144,   150,   154,   158,   160,   162,   164,   166,   168,   170,
                    389:      173,   175,   176,   177,   184,   186,   188,   191,   193,   195,
                    390:      197,   198,   199,   205,   209,   213,   215,   219,   221,   225,
                    391:      227,   231,   233,   235,   237,   239,   241,   243,   245,   248,
                    392:      250,   253,   256,   258,   260,   263,   265,   267,   269,   271,
                    393:      274,   277,   278,   279,   285,   287,   289,   292,   295,   297,
                    394:      299,   302,   305,   307,   309,   311,   313,   315,   317,   321,
                    395:      325,   329,   332,   335,   338,   341,   344,   347,   350,   353,
                    396:      357,   361,   365,   369,   373,   377,   381,   385,   389,   393,
                    397:      397,   401,   405,   409,   413,   417,   421,   425,   429,   433,
                    398:      437,   441,   445,   449,   453,   457,   461,   463,   465,   467,
                    399:      468,   470,   472
1.109     paf       400: };
1.105     paf       401: 
1.112     paf       402: /* YYRHS -- A `-1'-separated list of the rules' RHS. */
1.114     misha     403: static const short int yyrhs[] =
1.112     paf       404: {
                    405:       63,     0,    -1,    65,    -1,    64,    -1,    66,    -1,    64,
1.115     misha     406:       66,    -1,    79,    -1,    67,    -1,    72,    -1,    47,     4,
                    407:       48,    68,    -1,   150,    -1,    69,    -1,    70,    -1,    69,
                    408:       70,    -1,    71,    48,    -1,   150,    -1,     4,    -1,    -1,
                    409:       47,     4,    75,    74,    78,    48,    73,    79,    -1,   150,
                    410:       -1,    75,    -1,    49,    76,    50,    -1,   150,    -1,    77,
                    411:       -1,     4,    -1,    77,    51,     4,    -1,   150,    -1,     4,
                    412:       -1,   150,    -1,    80,    -1,    81,    -1,    80,    81,    -1,
                    413:      146,    -1,    82,    -1,    83,    -1,    91,    -1,   106,    -1,
                    414:       84,    -1,    52,    85,    -1,    87,     3,    -1,    86,    -1,
                    415:       53,    87,    54,    -1,    88,    -1,    89,    -1,    90,    -1,
                    416:      139,    90,    -1,   129,    -1,   126,   129,    -1,    52,    92,
                    417:       96,    -1,    93,    -1,    94,    -1,    95,    -1,   125,    -1,
                    418:       55,   125,    -1,   139,   125,    -1,    97,    -1,   100,    -1,
                    419:      101,    -1,    -1,    -1,    49,    98,   102,    99,    50,    -1,
                    420:       56,   142,    57,    -1,    53,    79,    54,    -1,   147,    -1,
                    421:        4,    -1,   103,    -1,   104,    -1,   105,    -1,    82,    -1,
                    422:       81,    80,    -1,   107,    -1,    -1,    -1,    58,   108,   110,
                    423:      109,   111,     3,    -1,    87,    -1,   112,    -1,   111,   112,
                    424:       -1,   113,    -1,   116,    -1,   117,    -1,    -1,    -1,    49,
                    425:      114,   118,   115,    50,    -1,    56,   119,    57,    -1,    53,
                    426:      120,    54,    -1,   121,    -1,   118,    51,   121,    -1,   122,
                    427:       -1,   119,    51,   122,    -1,   123,    -1,   120,    51,   123,
                    428:       -1,   124,    -1,   142,    -1,    79,    -1,   147,    -1,     4,
                    429:       -1,   103,    -1,   130,    -1,   126,   130,    -1,   127,    -1,
                    430:      126,   127,    -1,   128,    55,    -1,   130,    -1,   130,    -1,
                    431:        4,     5,    -1,     4,    -1,   131,    -1,   132,    -1,   133,
                    432:       -1,    52,   136,    -1,     4,   137,    -1,    -1,    -1,    49,
                    433:      134,    80,   135,    50,    -1,     4,    -1,   138,    -1,   137,
                    434:      138,    -1,    52,   136,    -1,   140,    -1,   141,    -1,     4,
                    435:       59,    -1,   140,    59,    -1,   143,    -1,   144,    -1,   148,
                    436:       -1,   149,    -1,    84,    -1,   107,    -1,    60,   145,    60,
                    437:       -1,    61,   145,    61,    -1,    56,   143,    57,    -1,    39,
                    438:      143,    -1,    38,   143,    -1,    45,   143,    -1,    46,   143,
                    439:       -1,    27,   143,    -1,    28,   143,    -1,    29,   143,    -1,
                    440:       30,   143,    -1,   143,    39,   143,    -1,   143,    38,   143,
                    441:       -1,   143,    40,   143,    -1,   143,    41,   143,    -1,   143,
                    442:       43,   143,    -1,   143,    42,   143,    -1,   143,    19,   143,
                    443:       -1,   143,    20,   143,    -1,   143,    37,   143,    -1,   143,
                    444:       36,   143,    -1,   143,    14,   143,    -1,   143,    11,   143,
                    445:       -1,   143,    12,   143,    -1,   143,    13,   143,    -1,   143,
                    446:       34,   143,    -1,   143,    35,   143,    -1,   143,    15,   143,
                    447:       -1,   143,    16,   143,    -1,   143,    17,   143,    -1,   143,
                    448:       18,   143,    -1,   143,    21,   143,    -1,   143,    22,   143,
                    449:       -1,   143,    23,   143,    -1,   143,    24,   143,    -1,   143,
                    450:       25,   143,    -1,   143,    26,   143,    -1,   143,    31,   143,
                    451:       -1,     4,    -1,    79,    -1,     4,    -1,    -1,    32,    -1,
                    452:       33,    -1,    -1
1.108     paf       453: };
1.1       parser    454: 
1.112     paf       455: /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
1.114     misha     456: static const unsigned short int yyrline[] =
1.112     paf       457: {
1.119     misha     458:        0,   131,   131,   138,   140,   140,   141,   143,   143,   145,
1.125     misha     459:      246,   246,   247,   247,   248,   249,   249,   251,   251,   301,
                    460:      301,   302,   303,   303,   304,   304,   306,   306,   310,   310,
1.126   ! misha     461:      312,   312,   313,   313,   314,   314,   314,   318,   326,   327,
        !           462:      327,   328,   330,   331,   332,   368,   369,   369,   373,   378,
        !           463:      379,   380,   381,   398,   403,   406,   407,   408,   410,   413,
        !           464:      410,   421,   429,   436,   437,   438,   440,   446,   447,   447,
        !           465:      451,   457,   460,   457,   476,   478,   478,   480,   481,   482,
        !           466:      484,   487,   484,   490,   491,   493,   494,   497,   498,   501,
        !           467:      502,   504,   508,   523,   528,   529,   530,   535,   535,   537,
        !           468:      537,   538,   539,   547,   552,   555,   556,   557,   558,   560,
        !           469:      564,   573,   576,   573,   584,   589,   589,   590,   596,   597,
        !           470:      599,   616,   628,   630,   631,   632,   633,   634,   635,   636,
        !           471:      637,   639,   640,   641,   642,   643,   644,   645,   646,   648,
        !           472:      649,   650,   651,   652,   653,   654,   655,   656,   657,   658,
        !           473:      659,   660,   661,   662,   663,   664,   665,   666,   667,   668,
        !           474:      669,   670,   671,   672,   673,   674,   677,   682,   691,   696,
        !           475:      697,   698,   700
1.106     paf       476: };
1.109     paf       477: #endif
1.1       parser    478: 
1.112     paf       479: #if YYDEBUG || YYERROR_VERBOSE
                    480: /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
                    481:    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
                    482: static const char *const yytname[] =
                    483: {
1.113     paf       484:   "$end", "error", "$undefined", "EON", "STRING", "BOGUS",
                    485:   "BAD_STRING_COMPARISON_OPERATOR", "BAD_HEX_LITERAL",
                    486:   "BAD_METHOD_DECL_START", "BAD_METHOD_PARAMETER_NAME_CHARACTER",
                    487:   "BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE", "\"&&\"",
                    488:   "\"||\"", "\"!||\"", "\"!|\"", "\"<=\"", "\">=\"", "\"==\"", "\"!=\"",
                    489:   "\"<<\"", "\">>\"", "\"lt\"", "\"gt\"", "\"le\"", "\"ge\"", "\"eq\"",
                    490:   "\"ne\"", "\"def\"", "\"in\"", "\"-f\"", "\"-d\"", "\"is\"", "\"true\"",
                    491:   "\"false\"", "'<'", "'>'", "'|'", "'&'", "'+'", "'-'", "'*'", "'/'",
                    492:   "'\\\\'", "'%'", "NUNARY", "'~'", "'!'", "'@'", "'\\n'", "'['", "']'",
                    493:   "';'", "'$'", "'{'", "'}'", "'.'", "'('", "')'", "'^'", "':'", "'\"'",
                    494:   "'''", "$accept", "all", "methods", "one_big_piece", "method",
                    495:   "control_method", "maybe_control_strings", "control_strings",
1.115     misha     496:   "control_string", "maybe_string", "code_method", "@1",
1.113     paf       497:   "maybe_bracketed_strings", "bracketed_maybe_strings", "maybe_strings",
                    498:   "strings", "maybe_comment", "maybe_codes", "codes", "code", "action",
                    499:   "get", "get_value", "get_name_value", "name_in_curly_rdive",
                    500:   "name_without_curly_rdive", "name_without_curly_rdive_read",
                    501:   "name_without_curly_rdive_class", "name_without_curly_rdive_code", "put",
                    502:   "name_expr_wdive", "name_expr_wdive_root", "name_expr_wdive_write",
1.115     misha     503:   "name_expr_wdive_class", "construct", "construct_square", "@2", "@3",
1.113     paf       504:   "construct_round", "construct_curly", "any_constructor_code_value",
                    505:   "constructor_code_value", "constructor_code",
1.115     misha     506:   "codes__excluding_sole_str_literal", "call", "call_value", "@4", "@5",
                    507:   "call_name", "store_params", "store_param", "store_square_param", "@6",
                    508:   "@7", "store_round_param", "store_curly_param", "store_code_param_parts",
1.113     paf       509:   "store_expr_param_parts", "store_curly_param_parts",
                    510:   "store_code_param_part", "store_expr_param_part",
                    511:   "store_curly_param_part", "code_param_value", "name_expr_dive_code",
                    512:   "name_path", "name_step", "name_advance1", "name_advance2",
                    513:   "name_expr_value", "name_expr_subvar_value",
1.115     misha     514:   "name_expr_with_subvar_value", "name_square_code_value", "@8", "@9",
1.113     paf       515:   "subvar_ref_name_rdive", "subvar_get_writes", "subvar__get_write",
                    516:   "class_prefix", "class_static_prefix", "class_constructor_prefix",
                    517:   "expr_value", "expr", "double_or_STRING", "string_inside_quotes_value",
1.112     paf       518:   "write_string", "void_value", "true_value", "false_value", "empty", 0
1.1       parser    519: };
1.106     paf       520: #endif
1.1       parser    521: 
1.112     paf       522: # ifdef YYPRINT
                    523: /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
                    524:    token YYLEX-NUM.  */
1.114     misha     525: static const unsigned short int yytoknum[] =
1.112     paf       526: {
                    527:        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
                    528:      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
                    529:      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
                    530:      285,   286,   287,   288,    60,    62,   124,    38,    43,    45,
                    531:       42,    47,    92,    37,   289,   126,    33,    64,    10,    91,
                    532:       93,    59,    36,   123,   125,    46,    40,    41,    94,    58,
                    533:       34,    39
                    534: };
                    535: # endif
1.109     paf       536: 
1.112     paf       537: /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
                    538: static const unsigned char yyr1[] =
                    539: {
                    540:        0,    62,    63,    63,    64,    64,    65,    66,    66,    67,
1.115     misha     541:       68,    68,    69,    69,    70,    71,    71,    73,    72,    74,
                    542:       74,    75,    76,    76,    77,    77,    78,    78,    79,    79,
                    543:       80,    80,    81,    81,    82,    82,    82,    83,    84,    85,
                    544:       85,    86,    87,    87,    88,    89,    90,    90,    91,    92,
                    545:       92,    92,    93,    94,    95,    96,    96,    96,    98,    99,
                    546:       97,   100,   101,   102,   102,   102,   103,   104,   105,   105,
                    547:      106,   108,   109,   107,   110,   111,   111,   112,   112,   112,
                    548:      114,   115,   113,   116,   117,   118,   118,   119,   119,   120,
                    549:      120,   121,   122,   123,   124,   124,   124,   125,   125,   126,
                    550:      126,   127,   128,   129,   129,   130,   130,   130,   130,   131,
                    551:      132,   134,   135,   133,   136,   137,   137,   138,   139,   139,
                    552:      140,   141,   142,   143,   143,   143,   143,   143,   143,   143,
                    553:      143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
                    554:      143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
                    555:      143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
                    556:      143,   143,   143,   143,   143,   143,   144,   145,   146,   147,
                    557:      148,   149,   150
1.1       parser    558: };
                    559: 
1.112     paf       560: /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
                    561: static const unsigned char yyr2[] =
                    562: {
                    563:        0,     2,     1,     1,     1,     2,     1,     1,     1,     4,
1.115     misha     564:        1,     1,     1,     2,     2,     1,     1,     0,     8,     1,
                    565:        1,     3,     1,     1,     1,     3,     1,     1,     1,     1,
                    566:        1,     2,     1,     1,     1,     1,     1,     1,     2,     2,
                    567:        1,     3,     1,     1,     1,     2,     1,     2,     3,     1,
                    568:        1,     1,     1,     2,     2,     1,     1,     1,     0,     0,
                    569:        5,     3,     3,     1,     1,     1,     1,     1,     1,     2,
                    570:        1,     0,     0,     6,     1,     1,     2,     1,     1,     1,
                    571:        0,     0,     5,     3,     3,     1,     3,     1,     3,     1,
                    572:        3,     1,     1,     1,     1,     1,     1,     1,     2,     1,
                    573:        2,     2,     1,     1,     2,     1,     1,     1,     1,     2,
                    574:        2,     0,     0,     5,     1,     1,     2,     2,     1,     1,
                    575:        2,     2,     1,     1,     1,     1,     1,     1,     3,     3,
                    576:        3,     2,     2,     2,     2,     2,     2,     2,     2,     3,
1.112     paf       577:        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
                    578:        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
1.115     misha     579:        3,     3,     3,     3,     3,     3,     1,     1,     1,     0,
                    580:        1,     1,     0
1.108     paf       581: };
1.106     paf       582: 
1.112     paf       583: /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
                    584:    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
                    585:    means the default is an error.  */
                    586: static const unsigned char yydefact[] =
                    587: {
1.115     misha     588:      172,   168,     0,     0,    71,     0,     3,     2,     4,     7,
                    589:        8,     6,    29,    30,    33,    34,    37,    35,    36,    70,
                    590:       32,    28,     0,   105,   111,     0,     0,     0,    38,    40,
                    591:        0,    42,    43,    44,     0,    49,    50,    51,    52,     0,
                    592:       99,     0,    46,    97,   106,   107,   108,     0,   118,   119,
                    593:        0,     1,     5,    31,   172,   172,   172,   104,     0,   120,
                    594:      110,   115,     0,   114,   109,     0,     0,   103,     0,   105,
                    595:       53,     0,    97,    39,    58,   172,     0,    48,    55,    56,
                    596:       57,   105,   100,    47,    98,   101,    45,    54,   121,    74,
                    597:       72,    16,     9,    11,    12,     0,    10,    24,     0,    23,
                    598:       22,   172,    20,    19,   117,   116,   112,    41,    98,   169,
                    599:        0,   166,     0,     0,     0,     0,   170,   171,     0,     0,
                    600:        0,     0,     0,     0,   172,   172,   126,   127,     0,   122,
                    601:      123,   124,   125,     0,    13,    15,    14,    21,     0,    27,
                    602:        0,    26,     0,   168,     0,    33,    59,    65,    66,    67,
                    603:       63,    62,   135,   136,   137,   138,   132,   131,   133,   134,
                    604:        0,   167,     0,     0,    61,     0,     0,     0,     0,     0,
1.112     paf       605:        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
                    606:        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
1.115     misha     607:        0,     0,    80,   172,     0,     0,    75,    77,    78,    79,
                    608:       25,    17,   113,    69,     0,   130,   128,   129,   150,   151,
                    609:      152,   149,   155,   156,   157,   158,   145,   146,   159,   160,
                    610:      161,   162,   163,   164,   165,   153,   154,   148,   147,   140,
                    611:      139,   141,   142,   144,   143,   169,    93,     0,    89,     0,
                    612:       87,    92,    73,    76,   172,    60,   168,    96,    81,    85,
                    613:       91,    94,   172,    84,     0,    83,    18,   169,     0,    90,
                    614:       88,    86,    82
1.1       parser    615: };
                    616: 
1.112     paf       617: /* YYDEFGOTO[NTERM-NUM]. */
1.114     misha     618: static const short int yydefgoto[] =
1.112     paf       619: {
                    620:       -1,     5,     6,     7,     8,     9,    92,    93,    94,    95,
1.115     misha     621:       10,   244,   101,    56,    98,    99,   140,   161,    12,    13,
                    622:       14,    15,   126,    28,    29,    30,    31,    32,    33,    17,
                    623:       34,    35,    36,    37,    77,    78,   109,   204,    79,    80,
                    624:      146,   247,   148,   149,    18,   127,    50,   133,    90,   195,
                    625:      196,   197,   235,   258,   198,   199,   248,   239,   237,   249,
                    626:      240,   238,   250,    38,    66,    40,    41,    42,    67,    44,
                    627:       45,    46,    62,   142,    64,    60,    61,    68,    48,    49,
                    628:      241,   129,   130,   162,    20,   251,   131,   132,    21
1.105     paf       629: };
1.1       parser    630: 
1.112     paf       631: /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
                    632:    STATE-NUM.  */
1.115     misha     633: #define YYPACT_NINF -107
1.114     misha     634: static const short int yypact[] =
1.112     paf       635: {
1.115     misha     636:       14,  -107,    13,    45,  -107,    28,   -15,  -107,  -107,  -107,
                    637:     -107,  -107,    21,  -107,  -107,  -107,  -107,  -107,  -107,  -107,
                    638:     -107,  -107,    73,    19,  -107,    50,     6,    44,  -107,  -107,
                    639:       87,  -107,  -107,  -107,   -34,  -107,  -107,  -107,  -107,    65,
                    640:     -107,    48,  -107,     5,  -107,  -107,  -107,    65,    24,  -107,
                    641:        6,  -107,  -107,  -107,    88,   109,    74,  -107,    50,  -107,
                    642:       76,  -107,    21,  -107,  -107,    86,    65,   101,    65,    76,
                    643:     -107,    44,   101,  -107,  -107,    21,     7,  -107,  -107,  -107,
                    644:     -107,    18,  -107,  -107,     5,  -107,  -107,  -107,  -107,  -107,
                    645:     -107,  -107,  -107,     9,  -107,    94,    99,  -107,    93,   112,
                    646:     -107,   146,  -107,  -107,  -107,  -107,    21,  -107,   101,    29,
                    647:      110,  -107,     7,     7,     7,     7,  -107,  -107,     7,     7,
                    648:        7,     7,    52,     7,    21,    21,  -107,  -107,   113,   323,
                    649:     -107,  -107,  -107,    92,  -107,  -107,  -107,  -107,   165,  -107,
                    650:      144,  -107,   147,   149,    21,    80,  -107,  -107,  -107,  -107,
                    651:     -107,  -107,    96,    96,    96,    96,  -107,  -107,  -107,  -107,
                    652:      276,  -107,   138,   139,  -107,     7,     7,     7,     7,     7,
                    653:        7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
                    654:        7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
                    655:        7,     7,  -107,    21,     7,    35,  -107,  -107,  -107,  -107,
                    656:     -107,  -107,  -107,    21,   154,  -107,  -107,  -107,   419,   389,
                    657:      356,   284,   135,   135,   148,   148,   191,   191,   135,   135,
                    658:      135,   135,   148,   148,    96,   135,   135,   182,   427,   140,
                    659:      140,  -107,  -107,  -107,  -107,    37,  -107,    31,  -107,   -30,
                    660:     -107,  -107,  -107,  -107,    21,  -107,   108,  -107,   155,  -107,
                    661:     -107,  -107,    21,  -107,     7,  -107,  -107,    37,   161,  -107,
                    662:     -107,  -107,  -107
1.1       parser    663: };
                    664: 
1.112     paf       665: /* YYPGOTO[NTERM-NUM].  */
1.114     misha     666: static const short int yypgoto[] =
1.112     paf       667: {
1.115     misha     668:     -107,  -107,  -107,  -107,   206,  -107,  -107,  -107,   124,  -107,
                    669:     -107,  -107,  -107,   170,  -107,  -107,  -107,     1,   -58,    -7,
                    670:     -106,  -107,     0,  -107,  -107,    -6,  -107,  -107,   -21,  -107,
                    671:     -107,  -107,  -107,  -107,  -107,  -107,  -107,  -107,  -107,  -107,
                    672:     -107,   118,  -107,  -107,  -107,     2,  -107,  -107,  -107,  -107,
                    673:       43,  -107,  -107,  -107,  -107,  -107,  -107,  -107,  -107,   -17,
                    674:      -13,   -16,  -107,   -18,     4,    41,  -107,   -23,     3,  -107,
                    675:     -107,  -107,  -107,  -107,   181,  -107,   183,   239,  -107,  -107,
                    676:      171,    95,  -107,   123,  -107,   142,  -107,  -107,    64
1.1       parser    677: };
                    678: 
1.112     paf       679: /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
                    680:    positive, shift that token.  If negative, reduce the rule which
                    681:    number is the opposite.  If zero, do what YYDEFACT says.
                    682:    If YYTABLE_NINF, syntax error.  */
1.115     misha     683: #define YYTABLE_NINF -173
1.114     misha     684: static const short int yytable[] =
1.112     paf       685: {
1.115     misha     686:       16,    11,    19,   145,   106,    53,    43,    39,  -103,    70,
                    687:       23,   111,    16,    91,    19,    74,    83,    22,     1,    75,
                    688:       65,   254,    76,    57,    57,     1,    86,   255,    51,    87,
                    689:       72,    71,     2,   143,   112,   113,   114,   115,   242,   116,
                    690:      117,   246,    84,    83,    89,   118,   119,    86,    69,    23,
                    691:       43,    39,   120,   121,    63,    24,    23,  -172,    25,   122,
                    692:     -102,     2,    16,   123,    19,     4,     3,   124,   125,    81,
                    693:       58,    58,     4,     3,   108,    16,   110,    19,    59,     4,
                    694:       82,     3,   252,    88,   192,   253,   203,     4,   193,     3,
                    695:       73,   194,    91,    24,    24,     4,    25,    25,    26,    53,
                    696:       27,    24,   144,    85,    25,    26,    16,    82,    19,    16,
                    697:      168,    19,    82,    97,    24,   173,   174,    25,    96,   100,
                    698:      103,    54,    55,    55,    16,    16,    19,    19,    58,   145,
                    699:      -68,   -68,   184,   185,   186,   187,   188,   189,   190,   191,
                    700:      107,   192,   136,   137,    16,   193,    19,   -15,   194,   168,
                    701:      139,   145,   171,   172,   173,   174,  -102,   135,   -95,   -95,
                    702:      179,   180,   168,   138,   151,   141,   181,   173,   174,   200,
                    703:      164,   184,   185,   186,   187,   188,   189,   190,   191,   181,
                    704:      188,   189,   190,   191,   184,   185,   186,   187,   188,   189,
                    705:      190,   191,   201,    16,   236,    19,    53,   202,   206,   -64,
                    706:      207,   173,   174,    16,   245,    19,   257,   152,   153,   154,
                    707:      155,   262,    52,   156,   157,   158,   159,   134,   160,   185,
                    708:      186,   187,   188,   189,   190,   191,   102,   147,   144,   186,
                    709:      187,   188,   189,   190,   191,    16,   259,    19,   243,   104,
                    710:      261,   260,    47,   105,    16,   256,    19,   128,   163,     0,
                    711:      144,   150,    16,   236,    19,     0,     0,    16,     0,    19,
                    712:      208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
                    713:      218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
                    714:      228,   229,   230,   231,   232,   233,   234,   165,   166,   167,
                    715:      168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
                    716:      178,   179,   180,   173,   174,     0,     0,   181,     0,     0,
                    717:      182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
                    718:      184,   185,   186,   187,   188,   189,   190,   191,     0,     0,
                    719:        0,     0,     0,   205,   165,   166,   167,   168,   169,   170,
                    720:      171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
                    721:        0,     0,     0,     0,   181,     0,     0,   182,   183,   184,
                    722:      185,   186,   187,   188,   189,   190,   191,   165,   166,     0,
                    723:      168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
                    724:      178,   179,   180,     0,     0,     0,     0,   181,     0,     0,
                    725:      182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
                    726:      165,     0,     0,   168,   169,   170,   171,   172,   173,   174,
                    727:      175,   176,   177,   178,   179,   180,     0,     0,     0,     0,
                    728:      181,     0,     0,   182,   183,   184,   185,   186,   187,   188,
                    729:      189,   190,   191,   168,   169,   170,   171,   172,   173,   174,
                    730:      175,   176,   177,   178,   179,   180,   173,   174,     0,     0,
                    731:      181,     0,     0,   182,   183,   184,   185,   186,   187,   188,
                    732:      189,   190,   191,     0,     0,   186,   187,   188,   189,   190,
1.112     paf       733:      191
1.1       parser    734: };
                    735: 
1.114     misha     736: static const short int yycheck[] =
1.112     paf       737: {
1.115     misha     738:        0,     0,     0,   109,    62,    12,     3,     3,     3,    27,
                    739:        4,     4,    12,     4,    12,    49,    39,     4,     4,    53,
                    740:       26,    51,    56,     5,     5,     4,    47,    57,     0,    47,
                    741:       27,    27,    47,     4,    27,    28,    29,    30,     3,    32,
                    742:       33,     4,    39,    66,    50,    38,    39,    68,     4,     4,
                    743:       47,    47,    45,    46,     4,    49,     4,    48,    52,    52,
                    744:       55,    47,    62,    56,    62,    58,    52,    60,    61,     4,
                    745:       52,    52,    58,    52,    71,    75,    75,    75,    59,    58,
                    746:       39,    52,    51,    59,    49,    54,   144,    58,    53,    52,
                    747:        3,    56,     4,    49,    49,    58,    52,    52,    53,   106,
                    748:       55,    49,   109,    55,    52,    53,   106,    66,   106,   109,
                    749:       14,   109,    71,     4,    49,    19,    20,    52,    54,    55,
                    750:       56,    48,    49,    49,   124,   125,   124,   125,    52,   235,
                    751:       50,    51,    36,    37,    38,    39,    40,    41,    42,    43,
                    752:       54,    49,    48,    50,   144,    53,   144,    48,    56,    14,
                    753:        4,   257,    17,    18,    19,    20,    55,    93,    50,    51,
                    754:       25,    26,    14,    51,    54,   101,    31,    19,    20,     4,
                    755:       57,    36,    37,    38,    39,    40,    41,    42,    43,    31,
                    756:       40,    41,    42,    43,    36,    37,    38,    39,    40,    41,
                    757:       42,    43,    48,   193,   193,   193,   203,    50,    60,    50,
                    758:       61,    19,    20,   203,    50,   203,    51,   112,   113,   114,
                    759:      115,    50,     6,   118,   119,   120,   121,    93,   123,    37,
                    760:       38,    39,    40,    41,    42,    43,    56,   109,   235,    38,
                    761:       39,    40,    41,    42,    43,   235,   252,   235,   195,    58,
                    762:      257,   254,     3,    60,   244,   244,   244,    76,   125,    -1,
                    763:      257,   109,   252,   252,   252,    -1,    -1,   257,    -1,   257,
                    764:      165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
                    765:      175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
                    766:      185,   186,   187,   188,   189,   190,   191,    11,    12,    13,
                    767:       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
                    768:       24,    25,    26,    19,    20,    -1,    -1,    31,    -1,    -1,
                    769:       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
                    770:       36,    37,    38,    39,    40,    41,    42,    43,    -1,    -1,
                    771:       -1,    -1,    -1,    57,    11,    12,    13,    14,    15,    16,
                    772:       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
                    773:       -1,    -1,    -1,    -1,    31,    -1,    -1,    34,    35,    36,
                    774:       37,    38,    39,    40,    41,    42,    43,    11,    12,    -1,
                    775:       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
                    776:       24,    25,    26,    -1,    -1,    -1,    -1,    31,    -1,    -1,
                    777:       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
                    778:       11,    -1,    -1,    14,    15,    16,    17,    18,    19,    20,
                    779:       21,    22,    23,    24,    25,    26,    -1,    -1,    -1,    -1,
                    780:       31,    -1,    -1,    34,    35,    36,    37,    38,    39,    40,
                    781:       41,    42,    43,    14,    15,    16,    17,    18,    19,    20,
                    782:       21,    22,    23,    24,    25,    26,    19,    20,    -1,    -1,
                    783:       31,    -1,    -1,    34,    35,    36,    37,    38,    39,    40,
                    784:       41,    42,    43,    -1,    -1,    38,    39,    40,    41,    42,
1.112     paf       785:       43
1.1       parser    786: };
                    787: 
1.112     paf       788: /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
                    789:    symbol of state STATE-NUM.  */
                    790: static const unsigned char yystos[] =
                    791: {
                    792:        0,     4,    47,    52,    58,    63,    64,    65,    66,    67,
1.115     misha     793:       72,    79,    80,    81,    82,    83,    84,    91,   106,   107,
                    794:      146,   150,     4,     4,    49,    52,    53,    55,    85,    86,
                    795:       87,    88,    89,    90,    92,    93,    94,    95,   125,   126,
                    796:      127,   128,   129,   130,   131,   132,   133,   139,   140,   141,
                    797:      108,     0,    66,    81,    48,    49,    75,     5,    52,    59,
                    798:      137,   138,   134,     4,   136,    87,   126,   130,   139,     4,
                    799:      125,   126,   130,     3,    49,    53,    56,    96,    97,   100,
                    800:      101,     4,   127,   129,   130,    55,    90,   125,    59,    87,
                    801:      110,     4,    68,    69,    70,    71,   150,     4,    76,    77,
                    802:      150,    74,    75,   150,   136,   138,    80,    54,   130,    98,
                    803:       79,     4,    27,    28,    29,    30,    32,    33,    38,    39,
                    804:       45,    46,    52,    56,    60,    61,    84,   107,   142,   143,
                    805:      144,   148,   149,   109,    70,   150,    48,    50,    51,     4,
                    806:       78,   150,   135,     4,    81,    82,   102,   103,   104,   105,
                    807:      147,    54,   143,   143,   143,   143,   143,   143,   143,   143,
                    808:      143,    79,   145,   145,    57,    11,    12,    13,    14,    15,
1.112     paf       809:       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
                    810:       26,    31,    34,    35,    36,    37,    38,    39,    40,    41,
1.115     misha     811:       42,    43,    49,    53,    56,   111,   112,   113,   116,   117,
                    812:        4,    48,    50,    80,    99,    57,    60,    61,   143,   143,
                    813:      143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
                    814:      143,   143,   143,   143,   143,   143,   143,   143,   143,   143,
                    815:      143,   143,   143,   143,   143,   114,    79,   120,   123,   119,
                    816:      122,   142,     3,   112,    73,    50,     4,   103,   118,   121,
                    817:      124,   147,    51,    54,    51,    57,    79,    51,   115,   123,
                    818:      122,   121,    50
1.1       parser    819: };
1.109     paf       820: 
1.112     paf       821: #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
                    822: # define YYSIZE_T __SIZE_TYPE__
                    823: #endif
                    824: #if ! defined (YYSIZE_T) && defined (size_t)
                    825: # define YYSIZE_T size_t
                    826: #endif
                    827: #if ! defined (YYSIZE_T)
                    828: # if defined (__STDC__) || defined (__cplusplus)
                    829: #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
                    830: #  define YYSIZE_T size_t
                    831: # endif
                    832: #endif
                    833: #if ! defined (YYSIZE_T)
                    834: # define YYSIZE_T unsigned int
1.1       parser    835: #endif
1.109     paf       836: 
1.1       parser    837: #define yyerrok                (yyerrstatus = 0)
                    838: #define yyclearin      (yychar = YYEMPTY)
1.112     paf       839: #define YYEMPTY                (-2)
1.1       parser    840: #define YYEOF          0
1.112     paf       841: 
1.1       parser    842: #define YYACCEPT       goto yyacceptlab
1.112     paf       843: #define YYABORT                goto yyabortlab
1.113     paf       844: #define YYERROR                goto yyerrorlab
1.112     paf       845: 
                    846: 
                    847: /* Like YYERROR except do call yyerror.  This remains here temporarily
                    848:    to ease the transition to the new meaning of YYERROR, for GCC.
1.1       parser    849:    Once GCC version 2 has supplanted version 1, this can go.  */
1.112     paf       850: 
1.1       parser    851: #define YYFAIL         goto yyerrlab
1.112     paf       852: 
1.1       parser    853: #define YYRECOVERING()  (!!yyerrstatus)
1.112     paf       854: 
                    855: #define YYBACKUP(Token, Value)                                 \
1.1       parser    856: do                                                             \
                    857:   if (yychar == YYEMPTY && yylen == 1)                         \
1.112     paf       858:     {                                                          \
                    859:       yychar = (Token);                                                \
                    860:       yylval = (Value);                                                \
                    861:       yytoken = YYTRANSLATE (yychar);                          \
1.1       parser    862:       YYPOPSTACK;                                              \
                    863:       goto yybackup;                                           \
                    864:     }                                                          \
                    865:   else                                                         \
1.112     paf       866:     {                                                          \
                    867:       yyerror ("syntax error: cannot back up");\
                    868:       YYERROR;                                                 \
                    869:     }                                                          \
1.1       parser    870: while (0)
                    871: 
                    872: #define YYTERROR       1
                    873: #define YYERRCODE      256
                    874: 
1.112     paf       875: /* YYLLOC_DEFAULT -- Compute the default location (before the actions
                    876:    are run).  */
                    877: 
                    878: #ifndef YYLLOC_DEFAULT
1.113     paf       879: # define YYLLOC_DEFAULT(Current, Rhs, N)               \
                    880:    ((Current).first_line   = (Rhs)[1].first_line,      \
                    881:     (Current).first_column = (Rhs)[1].first_column,    \
                    882:     (Current).last_line    = (Rhs)[N].last_line,       \
                    883:     (Current).last_column  = (Rhs)[N].last_column)
1.109     paf       884: #endif
1.108     paf       885: 
1.112     paf       886: /* YYLEX -- calling `yylex' with the right arguments.  */
                    887: 
1.109     paf       888: #ifdef YYLEX_PARAM
1.112     paf       889: # define YYLEX yylex (&yylval, YYLEX_PARAM)
1.109     paf       890: #else
1.112     paf       891: # define YYLEX yylex (&yylval)
1.106     paf       892: #endif
1.112     paf       893: 
                    894: /* Enable debugging if requested.  */
                    895: #if YYDEBUG
                    896: 
                    897: # ifndef YYFPRINTF
                    898: #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
                    899: #  define YYFPRINTF fprintf
                    900: # endif
                    901: 
                    902: # define YYDPRINTF(Args)                       \
                    903: do {                                           \
                    904:   if (yydebug)                                 \
                    905:     YYFPRINTF Args;                            \
                    906: } while (0)
                    907: 
                    908: # define YYDSYMPRINT(Args)                     \
                    909: do {                                           \
                    910:   if (yydebug)                                 \
                    911:     yysymprint Args;                           \
                    912: } while (0)
                    913: 
                    914: # define YYDSYMPRINTF(Title, Token, Value, Location)           \
                    915: do {                                                           \
                    916:   if (yydebug)                                                 \
                    917:     {                                                          \
                    918:       YYFPRINTF (stderr, "%s ", Title);                                \
                    919:       yysymprint (stderr,                                      \
                    920:                   Token, Value);       \
                    921:       YYFPRINTF (stderr, "\n");                                        \
                    922:     }                                                          \
                    923: } while (0)
                    924: 
                    925: /*------------------------------------------------------------------.
                    926: | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1.113     paf       927: | TOP (included).                                                   |
1.112     paf       928: `------------------------------------------------------------------*/
                    929: 
                    930: #if defined (__STDC__) || defined (__cplusplus)
                    931: static void
1.114     misha     932: yy_stack_print (short int *bottom, short int *top)
1.106     paf       933: #else
1.112     paf       934: static void
                    935: yy_stack_print (bottom, top)
1.114     misha     936:     short int *bottom;
                    937:     short int *top;
1.1       parser    938: #endif
1.112     paf       939: {
                    940:   YYFPRINTF (stderr, "Stack now");
                    941:   for (/* Nothing. */; bottom <= top; ++bottom)
                    942:     YYFPRINTF (stderr, " %d", *bottom);
                    943:   YYFPRINTF (stderr, "\n");
                    944: }
1.108     paf       945: 
1.112     paf       946: # define YY_STACK_PRINT(Bottom, Top)                           \
                    947: do {                                                           \
                    948:   if (yydebug)                                                 \
                    949:     yy_stack_print ((Bottom), (Top));                          \
                    950: } while (0)
1.108     paf       951: 
                    952: 
1.112     paf       953: /*------------------------------------------------.
                    954: | Report that the YYRULE is going to be reduced.  |
                    955: `------------------------------------------------*/
1.108     paf       956: 
1.112     paf       957: #if defined (__STDC__) || defined (__cplusplus)
                    958: static void
                    959: yy_reduce_print (int yyrule)
                    960: #else
                    961: static void
                    962: yy_reduce_print (yyrule)
                    963:     int yyrule;
1.1       parser    964: #endif
1.112     paf       965: {
                    966:   int yyi;
                    967:   unsigned int yylno = yyrline[yyrule];
                    968:   YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
                    969:              yyrule - 1, yylno);
                    970:   /* Print the symbols being reduced, and their result.  */
                    971:   for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
                    972:     YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
                    973:   YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
                    974: }
1.105     paf       975: 
1.112     paf       976: # define YY_REDUCE_PRINT(Rule)         \
                    977: do {                                   \
                    978:   if (yydebug)                         \
                    979:     yy_reduce_print (Rule);            \
                    980: } while (0)
                    981: 
                    982: /* Nonzero means print parse trace.  It is left uninitialized so that
                    983:    multiple parsers can coexist.  */
                    984: int yydebug;
                    985: #else /* !YYDEBUG */
                    986: # define YYDPRINTF(Args)
                    987: # define YYDSYMPRINT(Args)
                    988: # define YYDSYMPRINTF(Title, Token, Value, Location)
                    989: # define YY_STACK_PRINT(Bottom, Top)
                    990: # define YY_REDUCE_PRINT(Rule)
                    991: #endif /* !YYDEBUG */
1.1       parser    992: 
                    993: 
1.112     paf       994: /* YYINITDEPTH -- initial size of the parser's stacks.  */
1.1       parser    995: #ifndef        YYINITDEPTH
1.112     paf       996: # define YYINITDEPTH 200
1.1       parser    997: #endif
                    998: 
1.112     paf       999: /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
                   1000:    if the built-in stack extension method is used).
                   1001: 
                   1002:    Do not make this value too large; the results are undefined if
                   1003:    SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
                   1004:    evaluated with infinite-precision integer arithmetic.  */
1.1       parser   1005: 
1.113     paf      1006: #if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
1.112     paf      1007: # undef YYMAXDEPTH
1.1       parser   1008: #endif
                   1009: 
                   1010: #ifndef YYMAXDEPTH
1.112     paf      1011: # define YYMAXDEPTH 10000
1.1       parser   1012: #endif
1.112     paf      1013: 
1.1       parser   1014: 
                   1015: 
1.112     paf      1016: #if YYERROR_VERBOSE
                   1017: 
                   1018: # ifndef yystrlen
                   1019: #  if defined (__GLIBC__) && defined (_STRING_H)
                   1020: #   define yystrlen strlen
                   1021: #  else
                   1022: /* Return the length of YYSTR.  */
                   1023: static YYSIZE_T
                   1024: #   if defined (__STDC__) || defined (__cplusplus)
                   1025: yystrlen (const char *yystr)
                   1026: #   else
                   1027: yystrlen (yystr)
                   1028:      const char *yystr;
                   1029: #   endif
                   1030: {
                   1031:   register const char *yys = yystr;
                   1032: 
                   1033:   while (*yys++ != '\0')
                   1034:     continue;
                   1035: 
                   1036:   return yys - yystr - 1;
                   1037: }
                   1038: #  endif
                   1039: # endif
                   1040: 
                   1041: # ifndef yystpcpy
                   1042: #  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
                   1043: #   define yystpcpy stpcpy
                   1044: #  else
                   1045: /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
                   1046:    YYDEST.  */
                   1047: static char *
                   1048: #   if defined (__STDC__) || defined (__cplusplus)
                   1049: yystpcpy (char *yydest, const char *yysrc)
                   1050: #   else
                   1051: yystpcpy (yydest, yysrc)
                   1052:      char *yydest;
                   1053:      const char *yysrc;
                   1054: #   endif
                   1055: {
                   1056:   register char *yyd = yydest;
                   1057:   register const char *yys = yysrc;
                   1058: 
                   1059:   while ((*yyd++ = *yys++) != '\0')
                   1060:     continue;
1.105     paf      1061: 
1.112     paf      1062:   return yyd - 1;
1.105     paf      1063: }
1.112     paf      1064: #  endif
                   1065: # endif
                   1066: 
                   1067: #endif /* !YYERROR_VERBOSE */
                   1068: 
                   1069: 
1.105     paf      1070: 
1.112     paf      1071: #if YYDEBUG
                   1072: /*--------------------------------.
                   1073: | Print this symbol on YYOUTPUT.  |
                   1074: `--------------------------------*/
1.1       parser   1075: 
1.112     paf      1076: #if defined (__STDC__) || defined (__cplusplus)
1.105     paf      1077: static void
1.112     paf      1078: yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
                   1079: #else
                   1080: static void
                   1081: yysymprint (yyoutput, yytype, yyvaluep)
                   1082:     FILE *yyoutput;
                   1083:     int yytype;
                   1084:     YYSTYPE *yyvaluep;
                   1085: #endif
1.1       parser   1086: {
1.112     paf      1087:   /* Pacify ``unused variable'' warnings.  */
                   1088:   (void) yyvaluep;
                   1089: 
                   1090:   if (yytype < YYNTOKENS)
                   1091:     {
                   1092:       YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
                   1093: # ifdef YYPRINT
                   1094:       YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
                   1095: # endif
                   1096:     }
                   1097:   else
                   1098:     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1.105     paf      1099: 
1.112     paf      1100:   switch (yytype)
                   1101:     {
                   1102:       default:
                   1103:         break;
                   1104:     }
                   1105:   YYFPRINTF (yyoutput, ")");
1.1       parser   1106: }
                   1107: 
1.112     paf      1108: #endif /* ! YYDEBUG */
                   1109: /*-----------------------------------------------.
                   1110: | Release the memory associated to this symbol.  |
                   1111: `-----------------------------------------------*/
                   1112: 
                   1113: #if defined (__STDC__) || defined (__cplusplus)
                   1114: static void
                   1115: yydestruct (int yytype, YYSTYPE *yyvaluep)
                   1116: #else
                   1117: static void
                   1118: yydestruct (yytype, yyvaluep)
                   1119:     int yytype;
                   1120:     YYSTYPE *yyvaluep;
1.1       parser   1121: #endif
1.112     paf      1122: {
                   1123:   /* Pacify ``unused variable'' warnings.  */
                   1124:   (void) yyvaluep;
                   1125: 
                   1126:   switch (yytype)
                   1127:     {
                   1128: 
                   1129:       default:
                   1130:         break;
                   1131:     }
                   1132: }
1.1       parser   1133: 
                   1134: 
1.112     paf      1135: /* Prevent warnings from -Wmissing-prototypes.  */
1.1       parser   1136: 
                   1137: #ifdef YYPARSE_PARAM
1.112     paf      1138: # if defined (__STDC__) || defined (__cplusplus)
                   1139: int yyparse (void *YYPARSE_PARAM);
                   1140: # else
                   1141: int yyparse ();
                   1142: # endif
                   1143: #else /* ! YYPARSE_PARAM */
                   1144: #if defined (__STDC__) || defined (__cplusplus)
                   1145: int yyparse (void);
                   1146: #else
                   1147: int yyparse ();
                   1148: #endif
                   1149: #endif /* ! YYPARSE_PARAM */
                   1150: 
                   1151: 
                   1152: 
                   1153: 
                   1154: 
                   1155: 
                   1156: /*----------.
                   1157: | yyparse.  |
                   1158: `----------*/
1.1       parser   1159: 
                   1160: #ifdef YYPARSE_PARAM
1.112     paf      1161: # if defined (__STDC__) || defined (__cplusplus)
                   1162: int yyparse (void *YYPARSE_PARAM)
                   1163: # else
                   1164: int yyparse (YYPARSE_PARAM)
                   1165:   void *YYPARSE_PARAM;
                   1166: # endif
                   1167: #else /* ! YYPARSE_PARAM */
                   1168: #if defined (__STDC__) || defined (__cplusplus)
                   1169: int
                   1170: yyparse (void)
1.1       parser   1171: #else
1.112     paf      1172: int
                   1173: yyparse ()
                   1174: 
1.1       parser   1175: #endif
                   1176: #endif
1.112     paf      1177: {
                   1178:   /* The lookahead symbol.  */
                   1179: int yychar;
                   1180: 
                   1181: /* The semantic value of the lookahead symbol.  */
                   1182: YYSTYPE yylval;
                   1183: 
                   1184: /* Number of syntax errors so far.  */
                   1185: int yynerrs;
1.109     paf      1186: 
1.1       parser   1187:   register int yystate;
                   1188:   register int yyn;
1.112     paf      1189:   int yyresult;
                   1190:   /* Number of tokens to shift before error messages enabled.  */
                   1191:   int yyerrstatus;
                   1192:   /* Lookahead token as an internal (translated) token number.  */
                   1193:   int yytoken = 0;
                   1194: 
                   1195:   /* Three stacks and their tools:
                   1196:      `yyss': related to states,
                   1197:      `yyvs': related to semantic values,
                   1198:      `yyls': related to locations.
                   1199: 
                   1200:      Refer to the stacks thru separate pointers, to allow yyoverflow
                   1201:      to reallocate them elsewhere.  */
                   1202: 
                   1203:   /* The state stack.  */
1.114     misha    1204:   short int yyssa[YYINITDEPTH];
                   1205:   short int *yyss = yyssa;
                   1206:   register short int *yyssp;
1.112     paf      1207: 
                   1208:   /* The semantic value stack.  */
                   1209:   YYSTYPE yyvsa[YYINITDEPTH];
                   1210:   YYSTYPE *yyvs = yyvsa;
1.106     paf      1211:   register YYSTYPE *yyvsp;
1.1       parser   1212: 
                   1213: 
1.109     paf      1214: 
1.1       parser   1215: #define YYPOPSTACK   (yyvsp--, yyssp--)
                   1216: 
1.112     paf      1217:   YYSIZE_T yystacksize = YYINITDEPTH;
1.1       parser   1218: 
1.112     paf      1219:   /* The variables used to return semantic value and location from the
                   1220:      action routines.  */
                   1221:   YYSTYPE yyval;
1.1       parser   1222: 
                   1223: 
1.112     paf      1224:   /* When reducing, the number of symbols on the RHS of the reduced
                   1225:      rule.  */
1.1       parser   1226:   int yylen;
                   1227: 
1.112     paf      1228:   YYDPRINTF ((stderr, "Starting parse\n"));
1.1       parser   1229: 
                   1230:   yystate = 0;
                   1231:   yyerrstatus = 0;
                   1232:   yynerrs = 0;
                   1233:   yychar = YYEMPTY;            /* Cause a token to be read.  */
                   1234: 
                   1235:   /* Initialize stack pointers.
                   1236:      Waste one element of value and location stack
                   1237:      so that they stay on the same level as the state stack.
                   1238:      The wasted elements are never initialized.  */
                   1239: 
1.112     paf      1240:   yyssp = yyss;
1.1       parser   1241:   yyvsp = yyvs;
                   1242: 
1.114     misha    1243: 
1.112     paf      1244:   goto yysetstate;
                   1245: 
                   1246: /*------------------------------------------------------------.
                   1247: | yynewstate -- Push a new state, which is found in yystate.  |
                   1248: `------------------------------------------------------------*/
                   1249:  yynewstate:
                   1250:   /* In all cases, when you get here, the value and location stacks
                   1251:      have just been pushed. so pushing a state here evens the stacks.
                   1252:      */
                   1253:   yyssp++;
1.105     paf      1254: 
1.112     paf      1255:  yysetstate:
                   1256:   *yyssp = yystate;
1.108     paf      1257: 
1.112     paf      1258:   if (yyss + yystacksize - 1 <= yyssp)
1.109     paf      1259:     {
1.1       parser   1260:       /* Get the current used size of the three stacks, in elements.  */
1.112     paf      1261:       YYSIZE_T yysize = yyssp - yyss + 1;
1.1       parser   1262: 
                   1263: #ifdef yyoverflow
1.112     paf      1264:       {
                   1265:        /* Give user a chance to reallocate the stack. Use copies of
                   1266:           these so that the &'s don't force the real ones into
                   1267:           memory.  */
                   1268:        YYSTYPE *yyvs1 = yyvs;
1.114     misha    1269:        short int *yyss1 = yyss;
1.112     paf      1270: 
                   1271: 
                   1272:        /* Each stack pointer address is followed by the size of the
                   1273:           data in use in that stack, in bytes.  This used to be a
                   1274:           conditional around just the two extra args, but that might
                   1275:           be undefined if yyoverflow is a macro.  */
                   1276:        yyoverflow ("parser stack overflow",
                   1277:                    &yyss1, yysize * sizeof (*yyssp),
                   1278:                    &yyvs1, yysize * sizeof (*yyvsp),
                   1279: 
                   1280:                    &yystacksize);
                   1281: 
                   1282:        yyss = yyss1;
                   1283:        yyvs = yyvs1;
                   1284:       }
1.1       parser   1285: #else /* no yyoverflow */
1.112     paf      1286: # ifndef YYSTACK_RELOCATE
                   1287:       goto yyoverflowlab;
                   1288: # else
1.1       parser   1289:       /* Extend the stack our own way.  */
1.112     paf      1290:       if (YYMAXDEPTH <= yystacksize)
                   1291:        goto yyoverflowlab;
1.1       parser   1292:       yystacksize *= 2;
1.112     paf      1293:       if (YYMAXDEPTH < yystacksize)
1.1       parser   1294:        yystacksize = YYMAXDEPTH;
1.112     paf      1295: 
                   1296:       {
1.114     misha    1297:        short int *yyss1 = yyss;
1.112     paf      1298:        union yyalloc *yyptr =
                   1299:          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
                   1300:        if (! yyptr)
                   1301:          goto yyoverflowlab;
                   1302:        YYSTACK_RELOCATE (yyss);
                   1303:        YYSTACK_RELOCATE (yyvs);
                   1304: 
                   1305: #  undef YYSTACK_RELOCATE
                   1306:        if (yyss1 != yyssa)
                   1307:          YYSTACK_FREE (yyss1);
                   1308:       }
                   1309: # endif
1.1       parser   1310: #endif /* no yyoverflow */
                   1311: 
1.112     paf      1312:       yyssp = yyss + yysize - 1;
                   1313:       yyvsp = yyvs + yysize - 1;
                   1314: 
1.108     paf      1315: 
1.112     paf      1316:       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
                   1317:                  (unsigned long int) yystacksize));
1.105     paf      1318: 
1.112     paf      1319:       if (yyss + yystacksize - 1 <= yyssp)
1.1       parser   1320:        YYABORT;
                   1321:     }
                   1322: 
1.112     paf      1323:   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1.1       parser   1324: 
                   1325:   goto yybackup;
1.112     paf      1326: 
                   1327: /*-----------.
                   1328: | yybackup.  |
                   1329: `-----------*/
                   1330: yybackup:
1.1       parser   1331: 
                   1332: /* Do appropriate processing given the current state.  */
                   1333: /* Read a lookahead token if we need one and don't already have one.  */
                   1334: /* yyresume: */
                   1335: 
                   1336:   /* First try to decide what to do without reference to lookahead token.  */
                   1337: 
                   1338:   yyn = yypact[yystate];
1.112     paf      1339:   if (yyn == YYPACT_NINF)
1.1       parser   1340:     goto yydefault;
                   1341: 
                   1342:   /* Not known => get a lookahead token if don't already have one.  */
                   1343: 
1.112     paf      1344:   /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
1.1       parser   1345:   if (yychar == YYEMPTY)
                   1346:     {
1.112     paf      1347:       YYDPRINTF ((stderr, "Reading a token: "));
1.1       parser   1348:       yychar = YYLEX;
                   1349:     }
                   1350: 
1.112     paf      1351:   if (yychar <= YYEOF)
1.1       parser   1352:     {
1.112     paf      1353:       yychar = yytoken = YYEOF;
                   1354:       YYDPRINTF ((stderr, "Now at end of input.\n"));
1.1       parser   1355:     }
                   1356:   else
                   1357:     {
1.112     paf      1358:       yytoken = YYTRANSLATE (yychar);
                   1359:       YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
1.1       parser   1360:     }
                   1361: 
1.112     paf      1362:   /* If the proper action on seeing token YYTOKEN is to reduce or to
                   1363:      detect an error, take that action.  */
                   1364:   yyn += yytoken;
                   1365:   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1.1       parser   1366:     goto yydefault;
                   1367:   yyn = yytable[yyn];
1.112     paf      1368:   if (yyn <= 0)
1.1       parser   1369:     {
1.112     paf      1370:       if (yyn == 0 || yyn == YYTABLE_NINF)
1.1       parser   1371:        goto yyerrlab;
                   1372:       yyn = -yyn;
                   1373:       goto yyreduce;
                   1374:     }
                   1375: 
                   1376:   if (yyn == YYFINAL)
                   1377:     YYACCEPT;
                   1378: 
                   1379:   /* Shift the lookahead token.  */
1.112     paf      1380:   YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
1.1       parser   1381: 
                   1382:   /* Discard the token being shifted unless it is eof.  */
                   1383:   if (yychar != YYEOF)
                   1384:     yychar = YYEMPTY;
                   1385: 
                   1386:   *++yyvsp = yylval;
                   1387: 
1.112     paf      1388: 
                   1389:   /* Count tokens shifted since error; after three, turn off error
                   1390:      status.  */
                   1391:   if (yyerrstatus)
                   1392:     yyerrstatus--;
1.1       parser   1393: 
                   1394:   yystate = yyn;
                   1395:   goto yynewstate;
                   1396: 
1.112     paf      1397: 
                   1398: /*-----------------------------------------------------------.
                   1399: | yydefault -- do the default action for the current state.  |
                   1400: `-----------------------------------------------------------*/
1.109     paf      1401: yydefault:
1.1       parser   1402:   yyn = yydefact[yystate];
                   1403:   if (yyn == 0)
                   1404:     goto yyerrlab;
1.112     paf      1405:   goto yyreduce;
                   1406: 
1.105     paf      1407: 
1.112     paf      1408: /*-----------------------------.
                   1409: | yyreduce -- Do a reduction.  |
                   1410: `-----------------------------*/
1.1       parser   1411: yyreduce:
1.112     paf      1412:   /* yyn is the number of a rule to reduce with.  */
1.1       parser   1413:   yylen = yyr2[yyn];
1.109     paf      1414: 
1.112     paf      1415:   /* If YYLEN is nonzero, implement the default value of the action:
                   1416:      `$$ = $1'.
1.109     paf      1417: 
1.112     paf      1418:      Otherwise, the following line sets YYVAL to garbage.
                   1419:      This behavior is undocumented and Bison
                   1420:      users should not rely upon it.  Assigning to YYVAL
                   1421:      unconditionally makes the parser a bit smaller, and it avoids a
                   1422:      GCC warning that YYVAL may be used uninitialized.  */
                   1423:   yyval = yyvsp[1-yylen];
1.106     paf      1424: 
1.1       parser   1425: 
1.112     paf      1426:   YY_REDUCE_PRINT (yyn);
                   1427:   switch (yyn)
                   1428:     {
                   1429:         case 2:
1.119     misha    1430: #line 131 "compile.y"
1.112     paf      1431:     {
1.84      paf      1432:        Method& method=*new Method(Method::CT_ANY,
1.1       parser   1433:                0, 0, /*min, max numbered_params_count*/
                   1434:                0/*param_names*/, 0/*local_names*/, 
                   1435:                yyvsp[0]/*parser_code*/, 0/*native_code*/);
1.84      paf      1436:        PC.cclass->add_method(PC.alias_method(main_method_name), method);
1.112     paf      1437: ;}
                   1438:     break;
                   1439: 
                   1440:   case 9:
1.119     misha    1441: #line 146 "compile.y"
1.112     paf      1442:     {
1.84      paf      1443:        const String& command=*LA2S(*yyvsp[-2]);
1.1       parser   1444:        YYSTYPE strings_code=yyvsp[0];
1.84      paf      1445:        if(strings_code->count()<1*OPERATIONS_PER_OPVALUE) {
1.1       parser   1446:                strcpy(PC.error, "@");
                   1447:                strcat(PC.error, command.cstr());
                   1448:                strcat(PC.error, " is empty");
                   1449:                YYERROR;
                   1450:        }
                   1451:        if(command==CLASS_NAME) {
1.84      paf      1452:                if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
1.1       parser   1453:                        // new class' name
1.84      paf      1454:                        const String& name=*LA2S(*strings_code);
1.1       parser   1455:                        // creating the class
1.84      paf      1456:                        VStateless_class* cclass=new VClass;
1.119     misha    1457:                        PC.cclass_new=cclass;
                   1458:                        PC.cclass_new->set_name(name);
1.1       parser   1459:                } else {
1.84      paf      1460:                        strcpy(PC.error, "@"CLASS_NAME" must contain only one line with class name (contains more then one)");
1.1       parser   1461:                        YYERROR;
                   1462:                }
                   1463:        } else if(command==USE_CONTROL_METHOD_NAME) {
1.84      paf      1464:                for(size_t i=0; i<strings_code->count(); i+=OPERATIONS_PER_OPVALUE) 
                   1465:                        PC.request.use_file(PC.request.main_class, *LA2S(*strings_code, i));
1.1       parser   1466:        } else if(command==BASE_NAME) {
1.119     misha    1467:                if(PC.append){
                   1468:                        strcpy(PC.error, "can't set base while appending methods to class '");
                   1469:                        strncat(PC.error, PC.cclass->name().cstr(), MAX_STRING/2);
                   1470:                        strcat(PC.error, "'");
                   1471:                        YYERROR;
                   1472:                }
                   1473:                PC.class_add();
1.59      paf      1474:                if(PC.cclass->base_class()) { // already changed from default?
1.1       parser   1475:                        strcpy(PC.error, "class already have a base '");
1.119     misha    1476:                        strncat(PC.error, PC.cclass->base_class()->name().cstr(), MAX_STRING/2);
1.1       parser   1477:                        strcat(PC.error, "'");
                   1478:                        YYERROR;
                   1479:                }
1.84      paf      1480:                if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                   1481:                        const String& base_name=*LA2S(*strings_code);
                   1482:                        if(Value* base_class_value=PC.request.classes().get(base_name)) {
                   1483:                                // @CLASS == @BASE sanity check
                   1484:                                if(VStateless_class *base_class=base_class_value->get_class()) {
                   1485:                                        if(PC.cclass==base_class) {
                   1486:                                                strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);
                   1487:                                                YYERROR;
                   1488:                                        }
                   1489:                                        PC.cclass->get_class()->set_base(base_class);
                   1490:                                } else { // they asked to derive from a class without methods ['env' & co]
                   1491:                                        strcpy(PC.error, base_name.cstr());
                   1492:                                        strcat(PC.error, ": you can not derive from this class in @"BASE_NAME);
                   1493:                                        YYERROR;
                   1494:                                }
                   1495:                        } else {
1.1       parser   1496:                                strcpy(PC.error, base_name.cstr());
                   1497:                                strcat(PC.error, ": undefined class in @"BASE_NAME);
                   1498:                                YYERROR;
                   1499:                        }
                   1500:                } else {
                   1501:                        strcpy(PC.error, "@"BASE_NAME" must contain sole name");
                   1502:                        YYERROR;
                   1503:                }
1.116     misha    1504:        } else if(command==OPTIONS_CONTROL_METHOD_NAME) {
1.118     misha    1505:                for(size_t i=0; i<strings_code->count(); i+=OPERATIONS_PER_OPVALUE) {
                   1506:                        const String& option=*LA2S(*strings_code, i);
1.119     misha    1507:                        if(option==OPTION_ALL_VARS_LOCAL_NAME){
                   1508:                                PC.set_all_vars_local();
1.123     misha    1509:                        } else if(option==OPTION_PARTIAL_CLASS){
                   1510:                                if(PC.cclass_new){
                   1511:                                        if(VStateless_class* existed=PC.get_existed_class(PC.cclass_new)){
                   1512:                                                if(!PC.reuse_existed_class(existed)){
                   1513:                                                        strcpy(PC.error, "can't append methods to '");
                   1514:                                                        strncat(PC.error, PC.cclass_new->name().cstr(), MAX_STRING/2);
                   1515:                                                        strcat(PC.error, "' - the class wasn't marked as partial");
                   1516:                                                        YYERROR;
                   1517:                                                }
1.119     misha    1518:                                        } else {
1.123     misha    1519:                                                // mark new class as partial. we can add methods to it later.
                   1520:                                                PC.cclass_new->set_partial();
1.119     misha    1521:                                        }
1.123     misha    1522:                                } else {
                   1523:                                        strcpy(PC.error, "'"OPTION_PARTIAL_CLASS"' option should be used straight after @"CLASS_NAME);
1.119     misha    1524:                                        YYERROR;
                   1525:                                }
1.118     misha    1526:                        } else {
1.119     misha    1527:                                strcpy(PC.error, "'");
                   1528:                                strncat(PC.error, option.cstr(), MAX_STRING/2);
                   1529:                                strcat(PC.error, "' invalid option. valid options are "
1.123     misha    1530:                                        "'"OPTION_PARTIAL_CLASS"' and '"OPTION_ALL_VARS_LOCAL_NAME"'");
1.118     misha    1531:                                YYERROR;
1.116     misha    1532:                        }
                   1533:                }
1.1       parser   1534:        } else {
                   1535:                strcpy(PC.error, "'");
                   1536:                strncat(PC.error, command.cstr(), MAX_STRING/2);
                   1537:                strcat(PC.error, "' invalid special name. valid names are "
1.116     misha    1538:                        "'"CLASS_NAME"', '"USE_CONTROL_METHOD_NAME"', '"BASE_NAME"' and '"OPTIONS_CONTROL_METHOD_NAME"'.");
1.1       parser   1539:                YYERROR;
                   1540:        }
1.112     paf      1541: ;}
                   1542:     break;
                   1543: 
                   1544:   case 13:
1.123     misha    1545: #line 247 "compile.y"
1.112     paf      1546:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1547:     break;
                   1548: 
                   1549:   case 17:
1.123     misha    1550: #line 251 "compile.y"
1.112     paf      1551:     { 
1.119     misha    1552:        PC.class_add();
1.96      paf      1553:        PC.explicit_result=false;
1.1       parser   1554: 
1.115     misha    1555:        YYSTYPE params_names_code=yyvsp[-3];
1.84      paf      1556:        ArrayString* params_names=0;
                   1557:        if(int size=params_names_code->count()) {
                   1558:                params_names=new ArrayString;
                   1559:                for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE)
                   1560:                        *params_names+=LA2S(*params_names_code, i);
1.1       parser   1561:        }
                   1562: 
1.115     misha    1563:        YYSTYPE locals_names_code=yyvsp[-2];
1.84      paf      1564:        ArrayString* locals_names=0;
1.116     misha    1565:        bool all_vars_local=false;
1.84      paf      1566:        if(int size=locals_names_code->count()) {
                   1567:                locals_names=new ArrayString;
1.96      paf      1568:                for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE) {
                   1569:                        const String* local_name=LA2S(*locals_names_code, i);
                   1570:                        if(*local_name==RESULT_VAR_NAME)
                   1571:                                PC.explicit_result=true;
1.119     misha    1572:                        else if(*local_name==OPTION_ALL_VARS_LOCAL_NAME)
1.116     misha    1573:                                all_vars_local=true;
1.96      paf      1574:                        else
                   1575:                                *locals_names+=local_name;
                   1576:                }
1.1       parser   1577:        }
1.124     misha    1578:        if(!all_vars_local && PC.cclass && PC.cclass->is_vars_local())
1.116     misha    1579:                all_vars_local=true;
1.1       parser   1580: 
1.96      paf      1581:        Method* method=new Method(
1.84      paf      1582:                //name, 
1.1       parser   1583:                Method::CT_ANY,
                   1584:                0, 0/*min,max numbered_params_count*/, 
                   1585:                params_names, locals_names, 
1.116     misha    1586:                0/*to be filled later in next {} */, 0, all_vars_local);
1.114     misha    1587: 
1.96      paf      1588:        *reinterpret_cast<Method**>(&yyval)=method;
                   1589: 
                   1590:        // todo: check [][;result;]
1.112     paf      1591: ;}
                   1592:     break;
                   1593: 
1.115     misha    1594:   case 18:
1.125     misha    1595: #line 291 "compile.y"
1.115     misha    1596:     {
1.124     misha    1597:                Method& method=*reinterpret_cast<Method*>(yyvsp[-1]);
                   1598:                // fill in the code
                   1599:                method.parser_code=yyvsp[0];
                   1600: 
                   1601:                // register in class
                   1602:                const String& name=*LA2S(*yyvsp[-6]);
                   1603:                PC.cclass->add_method(PC.alias_method(name), method);
1.115     misha    1604: ;}
                   1605:     break;
                   1606: 
                   1607:   case 21:
1.125     misha    1608: #line 302 "compile.y"
1.114     misha    1609:     {yyval=yyvsp[-1];}
1.112     paf      1610:     break;
                   1611: 
1.115     misha    1612:   case 25:
1.125     misha    1613: #line 304 "compile.y"
1.112     paf      1614:     { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;}
                   1615:     break;
                   1616: 
1.115     misha    1617:   case 31:
1.125     misha    1618: #line 312 "compile.y"
1.112     paf      1619:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1620:     break;
                   1621: 
1.115     misha    1622:   case 37:
1.125     misha    1623: #line 318 "compile.y"
1.112     paf      1624:     {
1.48      paf      1625:        yyval=yyvsp[0]; /* stack: resulting value */ 
1.126   ! misha    1626:        if(!replace_top_opcode(*yyval, OP::OP_VALUE__GET_ELEMENT, OP::OP_VALUE__GET_ELEMENT__WRITE))
        !          1627:                changetail_or_append(*yyval, 
        !          1628:                        OP::OP_GET_ELEMENT, false,  /*->*/OP::OP_GET_ELEMENT__WRITE,
        !          1629:                        /*or */OP::OP_WRITE_VALUE
        !          1630:                        ); /* value=pop; wcontext.write(value) */
1.112     paf      1631: ;}
                   1632:     break;
                   1633: 
1.115     misha    1634:   case 38:
1.126   ! misha    1635: #line 326 "compile.y"
1.112     paf      1636:     { yyval=yyvsp[0] ;}
                   1637:     break;
                   1638: 
1.115     misha    1639:   case 41:
1.126   ! misha    1640: #line 328 "compile.y"
1.112     paf      1641:     { yyval=yyvsp[-1] ;}
                   1642:     break;
                   1643: 
1.115     misha    1644:   case 44:
1.126   ! misha    1645: #line 332 "compile.y"
1.112     paf      1646:     {
1.84      paf      1647:        yyval=N(); 
                   1648:        ArrayOperation* diving_code=yyvsp[0];
                   1649:        const String* first_name=LA2S(*diving_code);
1.37      paf      1650:        // self.xxx... -> xxx...
1.84      paf      1651:        // OP_VALUE+origin+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
1.1       parser   1652:        if(first_name && *first_name==SELF_ELEMENT_NAME) {
1.122     misha    1653:                O(*yyval, OP::OP_WITH_SELF); /* stack: starting context */
1.84      paf      1654:                P(*yyval, *diving_code, 
1.1       parser   1655:                        /* skip over... */
1.122     misha    1656:                        diving_code->count()>=4?4/*OP::OP_VALUE+origin+string+OP::OP_GET_ELEMENTx*/:3/*OP::OP_+origin+string*/);
1.1       parser   1657:        } else {
1.126   ! misha    1658: #ifdef OPTIMIZE_BYTECODE_GET_ELEMENT
        !          1659:                if(diving_code->count()==4){ // optimisations for simple (but very popular) cases
        !          1660:                        O(*yyval,
        !          1661:                                (PC.in_call_value) // ^call
        !          1662:                                ? OP::OP_VALUE__GET_ELEMENT_OR_OPERATOR // OP_VALUE+origin+string+OP_GET_ELEMENT -> OP_VALUE__GET_ELEMENT_OR_OPERATOR+origin+string
        !          1663:                                : OP::OP_VALUE__GET_ELEMENT // OP_VALUE+origin+string+OP_GET_ELEMENT -> OP_VALUE__GET_ELEMENT+origin+string
        !          1664:                        );
        !          1665:                        P(*yyval, *diving_code, 1/*offset==1: skip leading OP_VALUE*/, 2/*limit==2: skip trailing OP_GET_ELEMENT*/);
        !          1666:                } else {
        !          1667:                        O(*yyval, OP::OP_WITH_READ); /* stack: starting context */
        !          1668:                        P(*yyval, *diving_code);
        !          1669:                }
        !          1670: #else
1.122     misha    1671:                O(*yyval, OP::OP_WITH_READ); /* stack: starting context */
1.37      paf      1672: 
1.73      paf      1673:                // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR
1.84      paf      1674:                // OP_VALUE+origin+string+OP_GET_ELEMENT. -> OP_VALUE+origin+string+OP_GET_ELEMENT_OR_OPERATOR.
                   1675:                if(PC.in_call_value && diving_code->count()==4)
1.122     misha    1676:                        diving_code->put(4-1, OP::OP_GET_ELEMENT_OR_OPERATOR);
1.84      paf      1677:                P(*yyval, *diving_code);
1.126   ! misha    1678: #endif
1.1       parser   1679:        }
                   1680:        /* diving code; stack: current context */
1.112     paf      1681: ;}
                   1682:     break;
                   1683: 
1.115     misha    1684:   case 45:
1.126   ! misha    1685: #line 368 "compile.y"
1.112     paf      1686:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1687:     break;
                   1688: 
1.115     misha    1689:   case 47:
1.126   ! misha    1690: #line 369 "compile.y"
1.112     paf      1691:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1692:     break;
                   1693: 
1.115     misha    1694:   case 48:
1.126   ! misha    1695: #line 373 "compile.y"
1.112     paf      1696:     {
1.1       parser   1697:        yyval=yyvsp[-1]; /* stack: context,name */
1.84      paf      1698:        P(*yyval, *yyvsp[0]); /* stack: context,name,constructor_value */
1.112     paf      1699: ;}
                   1700:     break;
                   1701: 
1.115     misha    1702:   case 52:
1.126   ! misha    1703: #line 381 "compile.y"
1.112     paf      1704:     {
1.84      paf      1705:        yyval=N();
                   1706:        ArrayOperation* diving_code=yyvsp[0];
                   1707:        const String* first_name=LA2S(*diving_code);
1.37      paf      1708:        // $self.xxx... -> $xxx...
1.84      paf      1709:        // OP_VALUE+origin+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
1.1       parser   1710:        if(first_name && *first_name==SELF_ELEMENT_NAME) {
1.122     misha    1711:                O(*yyval, OP::OP_WITH_SELF); /* stack: starting context */
1.84      paf      1712:                P(*yyval, *diving_code, 
1.1       parser   1713:                        /* skip over... */
1.122     misha    1714:                        diving_code->count()>=4?4/*OP::OP_VALUE+origin+string+OP::OP_GET_ELEMENTx*/:3/*OP::OP_+origin+string*/);
1.1       parser   1715:        } else {
1.122     misha    1716:                O(*yyval, OP::OP_WITH_ROOT); /* stack: starting context */
1.84      paf      1717:                P(*yyval, *diving_code);
1.1       parser   1718:        }
                   1719:        /* diving code; stack: current context */
1.112     paf      1720: ;}
                   1721:     break;
                   1722: 
1.115     misha    1723:   case 53:
1.126   ! misha    1724: #line 398 "compile.y"
1.112     paf      1725:     {
1.84      paf      1726:        yyval=N(); 
1.122     misha    1727:        O(*yyval, OP::OP_WITH_WRITE); /* stack: starting context */
1.84      paf      1728:        P(*yyval, *yyvsp[0]); /* diving code; stack: context,name */
1.112     paf      1729: ;}
                   1730:     break;
                   1731: 
1.115     misha    1732:   case 54:
1.126   ! misha    1733: #line 403 "compile.y"
1.112     paf      1734:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1735:     break;
                   1736: 
1.115     misha    1737:   case 58:
1.126   ! misha    1738: #line 410 "compile.y"
1.112     paf      1739:     {
1.100     paf      1740:        // allow $result_or_other_variable[ letters here any time ]
1.99      paf      1741:        *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
1.112     paf      1742: ;}
                   1743:     break;
                   1744: 
1.115     misha    1745:   case 59:
1.126   ! misha    1746: #line 413 "compile.y"
1.112     paf      1747:     {
1.106     paf      1748:        PC.explicit_result=*reinterpret_cast<bool*>(&yyvsp[-1]);
1.112     paf      1749: ;}
                   1750:     break;
                   1751: 
1.115     misha    1752:   case 60:
1.126   ! misha    1753: #line 415 "compile.y"
1.112     paf      1754:     {
1.1       parser   1755:        // stack: context, name
1.99      paf      1756:        yyval=yyvsp[-2]; // stack: context, name, value
1.122     misha    1757:        O(*yyval, OP::OP_CONSTRUCT_VALUE); /* value=pop; name=pop; context=pop; construct(context,name,value) */
1.112     paf      1758: ;}
                   1759:     break;
                   1760: 
1.115     misha    1761:   case 61:
1.126   ! misha    1762: #line 421 "compile.y"
1.112     paf      1763:     { 
1.84      paf      1764:        yyval=N(); 
1.122     misha    1765:        O(*yyval, OP::OP_PREPARE_TO_EXPRESSION);
1.1       parser   1766:        // stack: context, name
1.84      paf      1767:        P(*yyval, *yyvsp[-1]); // stack: context, name, value
1.122     misha    1768:        O(*yyval, OP::OP_CONSTRUCT_EXPR); /* value=pop->as_expr_result; name=pop; context=pop; construct(context,name,value) */
1.112     paf      1769: ;}
                   1770:     break;
                   1771: 
1.115     misha    1772:   case 62:
1.126   ! misha    1773: #line 429 "compile.y"
1.112     paf      1774:     {
1.1       parser   1775:        // stack: context, name
1.84      paf      1776:        yyval=N(); 
1.122     misha    1777:        OA(*yyval, OP::OP_CURLY_CODE__CONSTRUCT, yyvsp[-1]); /* code=pop; name=pop; context=pop; construct(context,name,junction(code)) */
1.112     paf      1778: ;}
                   1779:     break;
                   1780: 
1.115     misha    1781:   case 66:
1.126   ! misha    1782: #line 440 "compile.y"
1.112     paf      1783:     {
1.84      paf      1784:        yyval=N(); 
1.122     misha    1785:        OA(*yyval, OP::OP_OBJECT_POOL, yyvsp[0]); /* stack: empty write context */
1.47      paf      1786:        /* some code that writes to that context */
                   1787:        /* context=pop; stack: context.value() */
1.112     paf      1788: ;}
                   1789:     break;
                   1790: 
1.115     misha    1791:   case 69:
1.126   ! misha    1792: #line 447 "compile.y"
1.112     paf      1793:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1794:     break;
                   1795: 
1.115     misha    1796:   case 70:
1.126   ! misha    1797: #line 451 "compile.y"
1.112     paf      1798:     {
1.1       parser   1799:        yyval=yyvsp[0]; /* stack: value */
1.84      paf      1800:        changetail_or_append(*yyval, 
1.122     misha    1801:                OP::OP_CALL, true,  /*->*/ OP::OP_CALL__WRITE,
                   1802:                /*or */OP::OP_WRITE_VALUE); /* value=pop; wcontext.write(value) */
1.112     paf      1803: ;}
                   1804:     break;
                   1805: 
1.115     misha    1806:   case 71:
1.126   ! misha    1807: #line 457 "compile.y"
1.112     paf      1808:     { 
1.39      paf      1809:                                        PC.in_call_value=true; 
1.112     paf      1810:                        ;}
                   1811:     break;
                   1812: 
1.115     misha    1813:   case 72:
1.126   ! misha    1814: #line 460 "compile.y"
1.112     paf      1815:     {
1.39      paf      1816:                                PC.in_call_value=false;
1.112     paf      1817:                        ;}
                   1818:     break;
                   1819: 
1.115     misha    1820:   case 73:
1.126   ! misha    1821: #line 463 "compile.y"
1.112     paf      1822:     { /* ^field.$method{vasya} */
1.1       parser   1823:        yyval=yyvsp[-3]; /* with_xxx,diving code; stack: context,method_junction */
                   1824: 
                   1825:        YYSTYPE params_code=yyvsp[-1];
1.122     misha    1826:        if(params_code->count()==4) { // probably [] case. [OP::OP_VALUE+origin+Void+STORE_PARAM]
1.84      paf      1827:                if(Value* value=LA2V(*params_code)) // it is OP_VALUE+origin+value?
1.111     paf      1828:                        if(value->is_void()) // value is VVoid?
1.1       parser   1829:                                params_code=0; // ^zzz[] case. don't append lone empty param.
1.51      paf      1830:        }
                   1831:        /* stack: context, method_junction */
1.122     misha    1832:        OA(*yyval, OP::OP_CALL, params_code); // method_frame=make frame(pop junction); ncontext=pop; call(ncontext,method_frame) stack: value
1.112     paf      1833: ;}
                   1834:     break;
                   1835: 
1.115     misha    1836:   case 76:
1.126   ! misha    1837: #line 478 "compile.y"
1.112     paf      1838:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1839:     break;
                   1840: 
1.115     misha    1841:   case 80:
1.126   ! misha    1842: #line 484 "compile.y"
1.112     paf      1843:     {
1.100     paf      1844:        // allow ^call[ letters here any time ]
1.98      paf      1845:        *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
1.112     paf      1846: ;}
                   1847:     break;
                   1848: 
1.115     misha    1849:   case 81:
1.126   ! misha    1850: #line 487 "compile.y"
1.112     paf      1851:     {
1.106     paf      1852:        PC.explicit_result=*reinterpret_cast<bool*>(&yyvsp[-1]);
1.112     paf      1853: ;}
                   1854:     break;
                   1855: 
1.115     misha    1856:   case 82:
1.126   ! misha    1857: #line 489 "compile.y"
1.112     paf      1858:     {yyval=yyvsp[-2];}
                   1859:     break;
                   1860: 
1.115     misha    1861:   case 83:
1.126   ! misha    1862: #line 490 "compile.y"
1.112     paf      1863:     {yyval=yyvsp[-1];}
                   1864:     break;
                   1865: 
1.115     misha    1866:   case 84:
1.126   ! misha    1867: #line 491 "compile.y"
1.112     paf      1868:     {yyval=yyvsp[-1];}
                   1869:     break;
                   1870: 
1.115     misha    1871:   case 86:
1.126   ! misha    1872: #line 494 "compile.y"
1.112     paf      1873:     { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;}
                   1874:     break;
                   1875: 
1.115     misha    1876:   case 88:
1.126   ! misha    1877: #line 498 "compile.y"
1.112     paf      1878:     { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;}
                   1879:     break;
                   1880: 
1.115     misha    1881:   case 90:
1.126   ! misha    1882: #line 502 "compile.y"
1.112     paf      1883:     { yyval=yyvsp[-2]; P(*yyval, *yyvsp[0]) ;}
                   1884:     break;
                   1885: 
1.115     misha    1886:   case 91:
1.126   ! misha    1887: #line 504 "compile.y"
1.112     paf      1888:     {
1.1       parser   1889:        yyval=yyvsp[0];
1.122     misha    1890:        O(*yyval, OP::OP_STORE_PARAM);
1.112     paf      1891: ;}
                   1892:     break;
                   1893: 
1.115     misha    1894:   case 92:
1.126   ! misha    1895: #line 508 "compile.y"
1.112     paf      1896:     {
1.104     paf      1897:        YYSTYPE expr_code=yyvsp[0];
1.106     paf      1898:        if(expr_code->count()==3
1.122     misha    1899:                && (*expr_code)[0].code==OP::OP_VALUE) { // optimizing (double/bool/incidently 'string' too) case. [OP::OP_VALUE+origin+Double]
1.104     paf      1900:                yyval=expr_code; 
1.122     misha    1901:                O(*yyval, OP::OP_STORE_PARAM); // no evaluating
1.104     paf      1902:        } else {
                   1903:                ArrayOperation* code=N();
1.122     misha    1904:                O(*code, OP::OP_PREPARE_TO_EXPRESSION);
1.104     paf      1905:                P(*code, *expr_code);
1.122     misha    1906:                O(*code, OP::OP_WRITE_EXPR_RESULT);
1.104     paf      1907:                yyval=N(); 
1.122     misha    1908:                OA(*yyval, OP::OP_EXPR_CODE__STORE_PARAM, code);
1.104     paf      1909:        }
1.112     paf      1910: ;}
                   1911:     break;
                   1912: 
1.115     misha    1913:   case 93:
1.126   ! misha    1914: #line 523 "compile.y"
1.112     paf      1915:     {
1.84      paf      1916:        yyval=N(); 
1.122     misha    1917:        OA(*yyval, OP::OP_CURLY_CODE__STORE_PARAM, yyvsp[0]);
1.112     paf      1918: ;}
                   1919:     break;
                   1920: 
1.115     misha    1921:   case 98:
1.126   ! misha    1922: #line 535 "compile.y"
1.112     paf      1923:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1924:     break;
                   1925: 
1.115     misha    1926:   case 100:
1.126   ! misha    1927: #line 537 "compile.y"
1.112     paf      1928:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   1929:     break;
                   1930: 
1.115     misha    1931:   case 102:
1.126   ! misha    1932: #line 539 "compile.y"
1.112     paf      1933:     {
1.33      paf      1934:        // we know that name_advance1 not called from ^xxx context
                   1935:        // so we'll not check for operator call possibility as we do in name_advance2
                   1936: 
1.1       parser   1937:        /* stack: context */
                   1938:        yyval=yyvsp[0]; /* stack: context,name */
1.122     misha    1939:        O(*yyval, OP::OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */
1.112     paf      1940: ;}
                   1941:     break;
                   1942: 
1.115     misha    1943:   case 103:
1.126   ! misha    1944: #line 547 "compile.y"
1.112     paf      1945:     {
1.1       parser   1946:        /* stack: context */
                   1947:        yyval=yyvsp[0]; /* stack: context,name */
1.122     misha    1948:        O(*yyval, OP::OP_GET_ELEMENT); /* name=pop; context=pop; stack: context.get_element(name) */
1.112     paf      1949: ;}
                   1950:     break;
                   1951: 
1.115     misha    1952:   case 109:
1.126   ! misha    1953: #line 560 "compile.y"
1.112     paf      1954:     {
1.1       parser   1955:        yyval=yyvsp[0];
1.122     misha    1956:        O(*yyval, OP::OP_GET_ELEMENT);
1.112     paf      1957: ;}
                   1958:     break;
                   1959: 
1.115     misha    1960:   case 110:
1.126   ! misha    1961: #line 564 "compile.y"
1.112     paf      1962:     {
1.84      paf      1963:        ArrayOperation* code;
1.47      paf      1964:        {
1.84      paf      1965:                change_string_literal_to_write_string_literal(*(code=yyvsp[-1]));
                   1966:                P(*code, *yyvsp[0]);
1.47      paf      1967:        }
1.84      paf      1968:        yyval=N(); 
1.122     misha    1969:        OA(*yyval, OP::OP_STRING_POOL, code);
1.112     paf      1970: ;}
                   1971:     break;
                   1972: 
1.115     misha    1973:   case 111:
1.126   ! misha    1974: #line 573 "compile.y"
1.112     paf      1975:     {
1.100     paf      1976:        // allow $result_or_other_variable[ letters here any time ]
                   1977:        *reinterpret_cast<bool*>(&yyval)=PC.explicit_result; PC.explicit_result=false;
1.112     paf      1978: ;}
                   1979:     break;
                   1980: 
1.115     misha    1981:   case 112:
1.126   ! misha    1982: #line 576 "compile.y"
1.112     paf      1983:     {
1.101     paf      1984:        PC.explicit_result=*reinterpret_cast<bool*>(&yyvsp[-1]);
1.112     paf      1985: ;}
                   1986:     break;
                   1987: 
1.115     misha    1988:   case 113:
1.126   ! misha    1989: #line 578 "compile.y"
1.112     paf      1990:     {
1.84      paf      1991:        yyval=N(); 
1.122     misha    1992:        OA(*yyval, OP::OP_OBJECT_POOL, yyvsp[-2]); /* stack: empty write context */
1.47      paf      1993:        /* some code that writes to that context */
                   1994:        /* context=pop; stack: context.value() */
1.112     paf      1995: ;}
                   1996:     break;
                   1997: 
1.115     misha    1998:   case 114:
1.126   ! misha    1999: #line 584 "compile.y"
1.112     paf      2000:     {
1.84      paf      2001:        yyval=N(); 
1.122     misha    2002:        O(*yyval, OP::OP_WITH_READ);
1.84      paf      2003:        P(*yyval, *yyvsp[0]);
1.112     paf      2004: ;}
                   2005:     break;
                   2006: 
1.115     misha    2007:   case 116:
1.126   ! misha    2008: #line 589 "compile.y"
1.112     paf      2009:     { yyval=yyvsp[-1]; P(*yyval, *yyvsp[0]) ;}
                   2010:     break;
                   2011: 
1.115     misha    2012:   case 117:
1.126   ! misha    2013: #line 590 "compile.y"
1.112     paf      2014:     {
1.1       parser   2015:        yyval=yyvsp[0];
1.122     misha    2016:        O(*yyval, OP::OP_GET_ELEMENT__WRITE);
1.112     paf      2017: ;}
                   2018:     break;
                   2019: 
1.115     misha    2020:   case 120:
1.126   ! misha    2021: #line 599 "compile.y"
1.112     paf      2022:     {
1.1       parser   2023:        yyval=yyvsp[-1]; // stack: class name string
1.84      paf      2024:        if(*LA2S(*yyval) == BASE_NAME) { // pseudo BASE class
                   2025:                if(VStateless_class* base=PC.cclass->base_class()) {
                   2026:                        change_string_literal_value(*yyval, base->name());
1.61      paf      2027:                } else {
                   2028:                        strcpy(PC.error, "no base class declared");
                   2029:                        YYERROR;
                   2030:                }
                   2031:        }
1.126   ! misha    2032: #ifdef OPTIMIZE_BYTECODE_GET_CLASS
        !          2033:        // OP_VALUE+origin+string+OP_GET_CLASS -> OP_VALUE__GET_CLASS+origin+string
        !          2034:        replace_top_opcode(*yyval, OP::OP_VALUE, OP::OP_VALUE__GET_CLASS, true/*assert if top opcode != OP_VALUE*/)
        !          2035: #else
1.122     misha    2036:        O(*yyval, OP::OP_GET_CLASS);
1.126   ! misha    2037: #endif
1.112     paf      2038: ;}
                   2039:     break;
                   2040: 
1.115     misha    2041:   case 121:
1.126   ! misha    2042: #line 616 "compile.y"
1.112     paf      2043:     {
1.1       parser   2044:        yyval=yyvsp[-1];
1.39      paf      2045:        if(!PC.in_call_value) {
1.1       parser   2046:                strcpy(PC.error, ":: not allowed here");
                   2047:                YYERROR;
                   2048:        }
1.122     misha    2049:        O(*yyval, OP::OP_PREPARE_TO_CONSTRUCT_OBJECT);
1.112     paf      2050: ;}
                   2051:     break;
                   2052: 
1.115     misha    2053:   case 128:
1.126   ! misha    2054: #line 635 "compile.y"
1.114     misha    2055:     { yyval = yyvsp[-1] ;}
                   2056:     break;
                   2057: 
1.115     misha    2058:   case 129:
1.126   ! misha    2059: #line 636 "compile.y"
1.112     paf      2060:     { yyval = yyvsp[-1] ;}
                   2061:     break;
                   2062: 
1.115     misha    2063:   case 130:
1.126   ! misha    2064: #line 637 "compile.y"
1.114     misha    2065:     { yyval = yyvsp[-1]; ;}
1.112     paf      2066:     break;
                   2067: 
1.115     misha    2068:   case 131:
1.126   ! misha    2069: #line 639 "compile.y"
1.122     misha    2070:     { yyval=yyvsp[0];  O(*yyval, OP::OP_NEG) ;}
1.112     paf      2071:     break;
                   2072: 
1.115     misha    2073:   case 132:
1.126   ! misha    2074: #line 640 "compile.y"
1.114     misha    2075:     { yyval=yyvsp[0] ;}
1.112     paf      2076:     break;
                   2077: 
1.115     misha    2078:   case 133:
1.126   ! misha    2079: #line 641 "compile.y"
1.122     misha    2080:     { yyval=yyvsp[0];   O(*yyval, OP::OP_INV) ;}
1.112     paf      2081:     break;
                   2082: 
1.115     misha    2083:   case 134:
1.126   ! misha    2084: #line 642 "compile.y"
1.122     misha    2085:     { yyval=yyvsp[0];  O(*yyval, OP::OP_NOT) ;}
1.112     paf      2086:     break;
                   2087: 
1.115     misha    2088:   case 135:
1.126   ! misha    2089: #line 643 "compile.y"
1.122     misha    2090:     { yyval=yyvsp[0];  O(*yyval, OP::OP_DEF) ;}
1.112     paf      2091:     break;
                   2092: 
1.115     misha    2093:   case 136:
1.126   ! misha    2094: #line 644 "compile.y"
1.122     misha    2095:     { yyval=yyvsp[0];  O(*yyval, OP::OP_IN) ;}
1.112     paf      2096:     break;
                   2097: 
1.115     misha    2098:   case 137:
1.126   ! misha    2099: #line 645 "compile.y"
1.122     misha    2100:     { yyval=yyvsp[0];  O(*yyval, OP::OP_FEXISTS) ;}
1.112     paf      2101:     break;
                   2102: 
1.115     misha    2103:   case 138:
1.126   ! misha    2104: #line 646 "compile.y"
1.122     misha    2105:     { yyval=yyvsp[0];  O(*yyval, OP::OP_DEXISTS) ;}
1.112     paf      2106:     break;
                   2107: 
1.115     misha    2108:   case 139:
1.126   ! misha    2109: #line 648 "compile.y"
1.122     misha    2110:     {  yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_SUB) ;}
1.112     paf      2111:     break;
                   2112: 
1.115     misha    2113:   case 140:
1.126   ! misha    2114: #line 649 "compile.y"
1.122     misha    2115:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_ADD) ;}
1.112     paf      2116:     break;
                   2117: 
1.115     misha    2118:   case 141:
1.126   ! misha    2119: #line 650 "compile.y"
1.122     misha    2120:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_MUL) ;}
1.112     paf      2121:     break;
                   2122: 
1.115     misha    2123:   case 142:
1.126   ! misha    2124: #line 651 "compile.y"
1.122     misha    2125:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_DIV) ;}
1.112     paf      2126:     break;
                   2127: 
1.115     misha    2128:   case 143:
1.126   ! misha    2129: #line 652 "compile.y"
1.122     misha    2130:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_MOD) ;}
1.112     paf      2131:     break;
                   2132: 
1.115     misha    2133:   case 144:
1.126   ! misha    2134: #line 653 "compile.y"
1.122     misha    2135:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_INTDIV) ;}
1.112     paf      2136:     break;
                   2137: 
1.115     misha    2138:   case 145:
1.126   ! misha    2139: #line 654 "compile.y"
1.122     misha    2140:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_BIN_SL) ;}
1.112     paf      2141:     break;
                   2142: 
1.115     misha    2143:   case 146:
1.126   ! misha    2144: #line 655 "compile.y"
1.122     misha    2145:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_BIN_SR) ;}
1.112     paf      2146:     break;
                   2147: 
1.115     misha    2148:   case 147:
1.126   ! misha    2149: #line 656 "compile.y"
1.122     misha    2150:     { yyval=yyvsp[-2];         P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_BIN_AND) ;}
1.112     paf      2151:     break;
                   2152: 
1.115     misha    2153:   case 148:
1.126   ! misha    2154: #line 657 "compile.y"
1.122     misha    2155:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_BIN_OR) ;}
1.112     paf      2156:     break;
                   2157: 
1.115     misha    2158:   case 149:
1.126   ! misha    2159: #line 658 "compile.y"
1.122     misha    2160:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_BIN_XOR) ;}
1.112     paf      2161:     break;
                   2162: 
1.115     misha    2163:   case 150:
1.126   ! misha    2164: #line 659 "compile.y"
1.122     misha    2165:     { yyval=yyvsp[-2];  OA(*yyval, OP::OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP::OP_LOG_AND) ;}
1.112     paf      2166:     break;
                   2167: 
1.115     misha    2168:   case 151:
1.126   ! misha    2169: #line 660 "compile.y"
1.122     misha    2170:     { yyval=yyvsp[-2];  OA(*yyval, OP::OP_NESTED_CODE, yyvsp[0]);  O(*yyval, OP::OP_LOG_OR) ;}
1.112     paf      2171:     break;
                   2172: 
1.115     misha    2173:   case 152:
1.126   ! misha    2174: #line 661 "compile.y"
1.122     misha    2175:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_LOG_XOR) ;}
1.112     paf      2176:     break;
                   2177: 
1.115     misha    2178:   case 153:
1.126   ! misha    2179: #line 662 "compile.y"
1.122     misha    2180:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_LT) ;}
1.112     paf      2181:     break;
                   2182: 
1.115     misha    2183:   case 154:
1.126   ! misha    2184: #line 663 "compile.y"
1.122     misha    2185:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_GT) ;}
1.112     paf      2186:     break;
                   2187: 
1.115     misha    2188:   case 155:
1.126   ! misha    2189: #line 664 "compile.y"
1.122     misha    2190:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_LE) ;}
1.112     paf      2191:     break;
                   2192: 
1.115     misha    2193:   case 156:
1.126   ! misha    2194: #line 665 "compile.y"
1.122     misha    2195:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_GE) ;}
1.112     paf      2196:     break;
                   2197: 
1.115     misha    2198:   case 157:
1.126   ! misha    2199: #line 666 "compile.y"
1.122     misha    2200:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_EQ) ;}
1.112     paf      2201:     break;
                   2202: 
1.115     misha    2203:   case 158:
1.126   ! misha    2204: #line 667 "compile.y"
1.122     misha    2205:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_NUM_NE) ;}
1.112     paf      2206:     break;
                   2207: 
1.115     misha    2208:   case 159:
1.126   ! misha    2209: #line 668 "compile.y"
1.122     misha    2210:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_LT) ;}
1.112     paf      2211:     break;
                   2212: 
1.115     misha    2213:   case 160:
1.126   ! misha    2214: #line 669 "compile.y"
1.122     misha    2215:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_GT) ;}
1.112     paf      2216:     break;
                   2217: 
1.115     misha    2218:   case 161:
1.126   ! misha    2219: #line 670 "compile.y"
1.122     misha    2220:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_LE) ;}
1.112     paf      2221:     break;
                   2222: 
1.115     misha    2223:   case 162:
1.126   ! misha    2224: #line 671 "compile.y"
1.122     misha    2225:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_GE) ;}
1.112     paf      2226:     break;
                   2227: 
1.115     misha    2228:   case 163:
1.126   ! misha    2229: #line 672 "compile.y"
1.122     misha    2230:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_EQ) ;}
1.112     paf      2231:     break;
                   2232: 
1.115     misha    2233:   case 164:
1.126   ! misha    2234: #line 673 "compile.y"
1.122     misha    2235:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_STR_NE) ;}
1.112     paf      2236:     break;
                   2237: 
1.115     misha    2238:   case 165:
1.126   ! misha    2239: #line 674 "compile.y"
1.122     misha    2240:     { yyval=yyvsp[-2];  P(*yyval, *yyvsp[0]);  O(*yyval, OP::OP_IS) ;}
1.112     paf      2241:     break;
                   2242: 
1.115     misha    2243:   case 166:
1.126   ! misha    2244: #line 677 "compile.y"
1.112     paf      2245:     {
1.104     paf      2246:        // optimized from OP_STRING->OP_VALUE for doubles
                   2247:        maybe_change_string_literal_to_double_literal(*(yyval=yyvsp[0]));
1.112     paf      2248: ;}
                   2249:     break;
                   2250: 
1.115     misha    2251:   case 167:
1.126   ! misha    2252: #line 682 "compile.y"
1.112     paf      2253:     {
1.84      paf      2254:        yyval=N();
1.122     misha    2255:        OA(*yyval, OP::OP_STRING_POOL, yyvsp[0]); /* stack: empty write context */
1.47      paf      2256:        /* some code that writes to that context */
                   2257:        /* context=pop; stack: context.get_string() */
1.112     paf      2258: ;}
                   2259:     break;
                   2260: 
1.115     misha    2261:   case 168:
1.126   ! misha    2262: #line 691 "compile.y"
1.112     paf      2263:     {
1.97      paf      2264:        // optimized from OP_STRING+OP_WRITE_VALUE to OP_STRING__WRITE
                   2265:        change_string_literal_to_write_string_literal(*(yyval=yyvsp[0]))
1.112     paf      2266: ;}
                   2267:     break;
                   2268: 
1.115     misha    2269:   case 169:
1.126   ! misha    2270: #line 696 "compile.y"
1.112     paf      2271:     { yyval=VL(/*we know that we will not change it*/const_cast<VVoid*>(&vvoid), 0, 0, 0) ;}
                   2272:     break;
                   2273: 
1.115     misha    2274:   case 170:
1.126   ! misha    2275: #line 697 "compile.y"
1.112     paf      2276:     { yyval = VL(/*we know that we will not change it*/const_cast<VBool*>(&vtrue), 0, 0, 0) ;}
                   2277:     break;
                   2278: 
1.115     misha    2279:   case 171:
1.126   ! misha    2280: #line 698 "compile.y"
1.112     paf      2281:     { yyval = VL(/*we know that we will not change it*/const_cast<VBool*>(&vfalse), 0, 0, 0) ;}
                   2282:     break;
                   2283: 
1.115     misha    2284:   case 172:
1.126   ! misha    2285: #line 700 "compile.y"
1.112     paf      2286:     { yyval=N() ;}
                   2287:     break;
                   2288: 
                   2289: 
                   2290:     }
                   2291: 
1.114     misha    2292: /* Line 1010 of yacc.c.  */
1.126   ! misha    2293: #line 2294 "compile.tab.C"
1.1       parser   2294: 
                   2295:   yyvsp -= yylen;
                   2296:   yyssp -= yylen;
                   2297: 
1.112     paf      2298: 
                   2299:   YY_STACK_PRINT (yyss, yyssp);
1.1       parser   2300: 
                   2301:   *++yyvsp = yyval;
                   2302: 
                   2303: 
1.112     paf      2304:   /* Now `shift' the result of the reduction.  Determine what state
                   2305:      that goes to, based on the state we popped back to and the rule
                   2306:      number reduced by.  */
1.1       parser   2307: 
                   2308:   yyn = yyr1[yyn];
                   2309: 
1.112     paf      2310:   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
                   2311:   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1.1       parser   2312:     yystate = yytable[yystate];
                   2313:   else
1.112     paf      2314:     yystate = yydefgoto[yyn - YYNTOKENS];
1.1       parser   2315: 
                   2316:   goto yynewstate;
                   2317: 
                   2318: 
1.112     paf      2319: /*------------------------------------.
                   2320: | yyerrlab -- here on detecting error |
                   2321: `------------------------------------*/
                   2322: yyerrlab:
                   2323:   /* If not already recovering from an error, report this error.  */
                   2324:   if (!yyerrstatus)
1.1       parser   2325:     {
                   2326:       ++yynerrs;
1.112     paf      2327: #if YYERROR_VERBOSE
1.1       parser   2328:       yyn = yypact[yystate];
                   2329: 
1.112     paf      2330:       if (YYPACT_NINF < yyn && yyn < YYLAST)
1.1       parser   2331:        {
1.112     paf      2332:          YYSIZE_T yysize = 0;
                   2333:          int yytype = YYTRANSLATE (yychar);
                   2334:          const char* yyprefix;
                   2335:          char *yymsg;
                   2336:          int yyx;
                   2337: 
                   2338:          /* Start YYX at -YYN if negative to avoid negative indexes in
                   2339:             YYCHECK.  */
                   2340:          int yyxbegin = yyn < 0 ? -yyn : 0;
                   2341: 
                   2342:          /* Stay within bounds of both yycheck and yytname.  */
                   2343:          int yychecklim = YYLAST - yyn;
                   2344:          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
                   2345:          int yycount = 0;
                   2346: 
                   2347:          yyprefix = ", expecting ";
                   2348:          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
                   2349:            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
                   2350:              {
                   2351:                yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
                   2352:                yycount += 1;
                   2353:                if (yycount == 5)
                   2354:                  {
                   2355:                    yysize = 0;
                   2356:                    break;
                   2357:                  }
                   2358:              }
                   2359:          yysize += (sizeof ("syntax error, unexpected ")
                   2360:                     + yystrlen (yytname[yytype]));
                   2361:          yymsg = (char *) YYSTACK_ALLOC (yysize);
                   2362:          if (yymsg != 0)
1.1       parser   2363:            {
1.112     paf      2364:              char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
                   2365:              yyp = yystpcpy (yyp, yytname[yytype]);
1.1       parser   2366: 
1.112     paf      2367:              if (yycount < 5)
1.1       parser   2368:                {
1.112     paf      2369:                  yyprefix = ", expecting ";
                   2370:                  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
                   2371:                    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1.1       parser   2372:                      {
1.112     paf      2373:                        yyp = yystpcpy (yyp, yyprefix);
                   2374:                        yyp = yystpcpy (yyp, yytname[yyx]);
                   2375:                        yyprefix = " or ";
1.1       parser   2376:                      }
                   2377:                }
1.112     paf      2378:              yyerror (yymsg);
                   2379:              YYSTACK_FREE (yymsg);
1.1       parser   2380:            }
                   2381:          else
1.112     paf      2382:            yyerror ("syntax error; also virtual memory exhausted");
1.1       parser   2383:        }
                   2384:       else
                   2385: #endif /* YYERROR_VERBOSE */
1.112     paf      2386:        yyerror ("syntax error");
1.1       parser   2387:     }
                   2388: 
1.112     paf      2389: 
1.1       parser   2390: 
                   2391:   if (yyerrstatus == 3)
                   2392:     {
1.112     paf      2393:       /* If just tried and failed to reuse lookahead token after an
                   2394:         error, discard it.  */
1.109     paf      2395: 
1.113     paf      2396:       if (yychar <= YYEOF)
1.112     paf      2397:         {
1.113     paf      2398:           /* If at end of input, pop the error token,
                   2399:             then the rest of the stack, then return failure.  */
                   2400:          if (yychar == YYEOF)
                   2401:             for (;;)
                   2402:               {
                   2403:                 YYPOPSTACK;
                   2404:                 if (yyssp == yyss)
                   2405:                   YYABORT;
                   2406:                 YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
                   2407:                 yydestruct (yystos[*yyssp], yyvsp);
                   2408:               }
1.112     paf      2409:         }
1.113     paf      2410:       else
                   2411:        {
                   2412:          YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
                   2413:          yydestruct (yytoken, &yylval);
                   2414:          yychar = YYEMPTY;
1.1       parser   2415: 
1.113     paf      2416:        }
1.106     paf      2417:     }
1.1       parser   2418: 
1.112     paf      2419:   /* Else will try to reuse lookahead token after shifting the error
                   2420:      token.  */
                   2421:   goto yyerrlab1;
1.109     paf      2422: 
1.1       parser   2423: 
1.113     paf      2424: /*---------------------------------------------------.
                   2425: | yyerrorlab -- error raised explicitly by YYERROR.  |
                   2426: `---------------------------------------------------*/
                   2427: yyerrorlab:
                   2428: 
                   2429: #ifdef __GNUC__
                   2430:   /* Pacify GCC when the user code never invokes YYERROR and the label
                   2431:      yyerrorlab therefore never appears in user code.  */
                   2432:   if (0)
                   2433:      goto yyerrorlab;
                   2434: #endif
                   2435: 
                   2436:   yyvsp -= yylen;
                   2437:   yyssp -= yylen;
                   2438:   yystate = *yyssp;
                   2439:   goto yyerrlab1;
                   2440: 
                   2441: 
                   2442: /*-------------------------------------------------------------.
                   2443: | yyerrlab1 -- common code for both syntax error and YYERROR.  |
                   2444: `-------------------------------------------------------------*/
1.112     paf      2445: yyerrlab1:
                   2446:   yyerrstatus = 3;     /* Each real token shifted decrements this.  */
1.1       parser   2447: 
1.112     paf      2448:   for (;;)
1.109     paf      2449:     {
1.112     paf      2450:       yyn = yypact[yystate];
                   2451:       if (yyn != YYPACT_NINF)
                   2452:        {
                   2453:          yyn += YYTERROR;
                   2454:          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
                   2455:            {
                   2456:              yyn = yytable[yyn];
                   2457:              if (0 < yyn)
                   2458:                break;
                   2459:            }
                   2460:        }
1.1       parser   2461: 
1.112     paf      2462:       /* Pop the current state because it cannot handle the error token.  */
                   2463:       if (yyssp == yyss)
                   2464:        YYABORT;
1.1       parser   2465: 
1.112     paf      2466:       YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
                   2467:       yydestruct (yystos[yystate], yyvsp);
1.113     paf      2468:       YYPOPSTACK;
                   2469:       yystate = *yyssp;
1.112     paf      2470:       YY_STACK_PRINT (yyss, yyssp);
1.1       parser   2471:     }
                   2472: 
                   2473:   if (yyn == YYFINAL)
                   2474:     YYACCEPT;
                   2475: 
1.112     paf      2476:   YYDPRINTF ((stderr, "Shifting error token, "));
1.1       parser   2477: 
                   2478:   *++yyvsp = yylval;
1.112     paf      2479: 
1.1       parser   2480: 
                   2481:   yystate = yyn;
                   2482:   goto yynewstate;
                   2483: 
                   2484: 
1.112     paf      2485: /*-------------------------------------.
                   2486: | yyacceptlab -- YYACCEPT comes here.  |
                   2487: `-------------------------------------*/
                   2488: yyacceptlab:
                   2489:   yyresult = 0;
                   2490:   goto yyreturn;
                   2491: 
                   2492: /*-----------------------------------.
                   2493: | yyabortlab -- YYABORT comes here.  |
                   2494: `-----------------------------------*/
                   2495: yyabortlab:
                   2496:   yyresult = 1;
                   2497:   goto yyreturn;
                   2498: 
                   2499: #ifndef yyoverflow
                   2500: /*----------------------------------------------.
                   2501: | yyoverflowlab -- parser overflow comes here.  |
                   2502: `----------------------------------------------*/
                   2503: yyoverflowlab:
                   2504:   yyerror ("parser stack overflow");
                   2505:   yyresult = 2;
                   2506:   /* Fall through.  */
                   2507: #endif
                   2508: 
                   2509: yyreturn:
                   2510: #ifndef yyoverflow
                   2511:   if (yyss != yyssa)
                   2512:     YYSTACK_FREE (yyss);
1.1       parser   2513: #endif
1.112     paf      2514:   return yyresult;
1.1       parser   2515: }
1.112     paf      2516: 
                   2517: 
1.126   ! misha    2518: #line 702 "compile.y"
1.1       parser   2519: 
                   2520: #endif
                   2521: 
                   2522: /*
                   2523:        000$111(2222)00 
                   2524:                000$111{3333}00
                   2525:        $,^: push,=0
                   2526:        1:( { break=pop
                   2527:        2:( )  pop
                   2528:        3:{ }  pop
                   2529: 
                   2530:        000^111(2222)4444{33333}4000
                   2531:        $,^: push,=0
                   2532:        1:( { break=pop
                   2533:        2:( )=4
                   2534:        3:{ }=4
                   2535:                4:[^({]=pop
                   2536: */
                   2537: 
1.84      paf      2538: inline void ungetc(Parse_control& pc, uint last_line_end_col) {
                   2539:        pc.source--;
                   2540:        if(pc.pos.col==0) {
                   2541:                --pc.pos.line; pc.pos.col=last_line_end_col;
                   2542:        } else
                   2543:                --pc.pos.col;
                   2544: 
                   2545: }
                   2546: static int yylex(YYSTYPE *lvalp, void *apc) {
                   2547:        register Parse_control& pc=*static_cast<Parse_control*>(apc);
                   2548: 
                   2549:        #define lexical_brackets_nestage pc.brackets_nestages[pc.ls_sp]
1.1       parser   2550:        #define RC {result=c; goto break2; }
                   2551: 
1.84      paf      2552:        register int c;
                   2553:        int result;
1.1       parser   2554:        
1.84      paf      2555:        if(pc.pending_state) {
                   2556:                result=pc.pending_state;
                   2557:                pc.pending_state=0;
1.1       parser   2558:                return result;
                   2559:        }
                   2560:        
1.84      paf      2561:        const char *begin=pc.source;
                   2562:        Pos begin_pos=pc.pos;
1.1       parser   2563:        const char *end;
                   2564:        int skip_analized=0;
                   2565:        while(true) {
1.84      paf      2566:                c=*(end=(pc.source++));
                   2567: //             fprintf(stderr, "\nchar: %c %02X; nestage: %d, sp=%d", c, c, lexical_brackets_nestage, pc.sp);
1.1       parser   2568: 
1.96      paf      2569:                if(c=='\n')
1.84      paf      2570:                        pc.pos_next_line();
1.96      paf      2571:                else
1.84      paf      2572:                        pc.pos_next_c(c);
1.96      paf      2573: //             fprintf(stderr, "\nchar: %c file(%d:%d)", c, pc.pos.line, pc.pos.col);
1.1       parser   2574: 
1.96      paf      2575:                if(pc.pos.col==0+1 && c=='@') {
1.84      paf      2576:                        if(pc.ls==LS_DEF_SPECIAL_BODY) {
1.31      paf      2577:                                // @SPECIAL
                   2578:                                // ...
                   2579:                                // @<here = 
1.84      paf      2580:                                pop_LS(pc); // exiting from LS_DEF_SPECIAL_BODY state
1.31      paf      2581:                        } // continuing checks
1.84      paf      2582:                        if(pc.ls==LS_USER) {
                   2583:                                push_LS(pc, LS_DEF_NAME);
1.20      parser   2584:                                RC;
1.31      paf      2585:                        } else // @ in first column inside some code [when could that be?]
1.20      parser   2586:                                result=BAD_METHOD_DECL_START;
                   2587:                        goto break2;
1.97      paf      2588:                }
                   2589:                if(c=='^') {
1.84      paf      2590:                        if(pc.ls==LS_METHOD_AFTER) {
1.75      paf      2591:                                // handle after-method situation
1.84      paf      2592:                                pop_LS(pc);
1.75      paf      2593:                                result=EON;
                   2594:                                skip_analized=-1; // return to punctuation afterwards to assure it's literality
                   2595:                                goto break2;
                   2596:                        }
1.84      paf      2597:                        switch(pc.ls) {
1.15      parser   2598: case LS_EXPRESSION_VAR_NAME_WITH_COLON:
                   2599: case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:
                   2600: case LS_VAR_NAME_SIMPLE_WITH_COLON:
                   2601: case LS_VAR_NAME_SIMPLE_WITHOUT_COLON:
                   2602: case LS_VAR_NAME_CURLY:
                   2603: case LS_METHOD_NAME:
1.66      paf      2604: case LS_USER_COMMENT:
1.15      parser   2605: case LS_DEF_COMMENT:
                   2606:        // no literals in names, please
                   2607:        break;
                   2608: default:
1.84      paf      2609:                        switch(*pc.source) {
1.10      parser   2610:                        // ^escaping some punctuators
1.121     misha    2611:                        case '^': case '$': case ';': case '@':
1.1       parser   2612:                        case '(': case ')':
                   2613:                        case '[': case ']':
                   2614:                        case '{': case '}':
1.23      parser   2615:                        case '"':  case ':':
1.1       parser   2616:                                if(end!=begin) {
1.84      paf      2617:                                        if(!pc.string_start)
                   2618:                                                pc.string_start=begin_pos;
1.1       parser   2619:                                        // append piece till ^
1.84      paf      2620:                                        pc.string.append_strdup_know_length(begin, end-begin);
1.1       parser   2621:                                }
                   2622:                                // reset piece 'begin' position & line
1.84      paf      2623:                                begin=pc.source; // ->punctuation
                   2624:                                begin_pos=pc.pos;
1.75      paf      2625:                                // skip over _ after ^
1.84      paf      2626:                                pc.source++;  pc.pos.col++;
1.75      paf      2627:                                // skip analysis = forced literal
                   2628:                                continue;
1.1       parser   2629: 
                   2630:                        // converting ^#HH into char(hex(HH))
                   2631:                        case '#':
                   2632:                                if(end!=begin) {
1.84      paf      2633:                                        if(!pc.string_start)
                   2634:                                                pc.string_start=begin_pos;
1.1       parser   2635:                                        // append piece till ^
1.84      paf      2636:                                        pc.string.append_strdup_know_length(begin, end-begin);
1.1       parser   2637:                                }
                   2638:                                // #HH ?
1.121     misha    2639:                                if(pc.source[1] && isxdigit(pc.source[1]) && pc.source[2] && isxdigit(pc.source[2])) {
1.110     paf      2640:                                        char c=(char)(
1.84      paf      2641:                                                hex_value[(unsigned char)pc.source[1]]*0x10+
1.110     paf      2642:                                                hex_value[(unsigned char)pc.source[2]]);
1.84      paf      2643:                                        if(c==0) {
1.1       parser   2644:                                                result=BAD_HEX_LITERAL;
                   2645:                                                goto break2; // wrong hex value[no ^#00 chars allowed]: bail out
                   2646:                                        }
                   2647:                                        // append char(hex(HH))
1.84      paf      2648:                                        pc.string.append(c);
1.1       parser   2649:                                        // skip over ^#HH
1.84      paf      2650:                                        pc.source+=3;
                   2651:                                        pc.pos.col+=3;
1.1       parser   2652:                                        // reset piece 'begin' position & line
1.84      paf      2653:                                        begin=pc.source; // ->after ^#HH
                   2654:                                        begin_pos=pc.pos;
1.75      paf      2655:                                        // skip analysis = forced literal
1.1       parser   2656:                                        continue;
                   2657:                                }
1.121     misha    2658:                                // just escaped char
                   2659:                                // reset piece 'begin' position & line
                   2660:                                begin=pc.source;
                   2661:                                begin_pos=pc.pos;
                   2662:                                // skip over _ after ^
                   2663:                                pc.source++;  pc.pos.col++;
                   2664:                                // skip analysis = forced literal
                   2665:                                continue;
1.1       parser   2666:                        }
1.15      parser   2667:                        break;
1.75      paf      2668:                        }
1.15      parser   2669:                }
1.1       parser   2670:                // #comment  start skipping
1.84      paf      2671:                if(c=='#' && pc.pos.col==1) {
1.1       parser   2672:                        if(end!=begin) {
1.84      paf      2673:                                if(!pc.string_start)
                   2674:                                        pc.string_start=begin_pos;
1.1       parser   2675:                                // append piece till #
1.84      paf      2676:                                pc.string.append_strdup_know_length(begin, end-begin);
1.1       parser   2677:                        }
                   2678:                        // fall into COMMENT lexical state [wait for \n]
1.84      paf      2679:                        push_LS(pc, LS_USER_COMMENT);
1.31      paf      2680:                        continue;
1.1       parser   2681:                }
1.84      paf      2682:                switch(pc.ls) {
1.1       parser   2683: 
                   2684:                // USER'S = NOT OURS
                   2685:                case LS_USER:
1.84      paf      2686:                case LS_NAME_SQUARE_PART: // name.[here].xxx
                   2687:                        if(pc.trim_bof)
1.1       parser   2688:                                switch(c) {
                   2689:                                case '\n': case ' ': case '\t':
1.84      paf      2690:                                        begin=pc.source;
                   2691:                                        begin_pos=pc.pos;
1.1       parser   2692:                                        continue; // skip it
                   2693:                                default:
1.84      paf      2694:                                        pc.trim_bof=false;
1.1       parser   2695:                                }
                   2696:                        switch(c) {
                   2697:                        case '$':
1.84      paf      2698:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   2699:                                RC;
                   2700:                        case '^':
1.84      paf      2701:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   2702:                                RC;
1.11      parser   2703:                        case ']':
1.84      paf      2704:                                if(pc.ls==LS_NAME_SQUARE_PART)
1.11      parser   2705:                                        if(--lexical_brackets_nestage==0) {// $name.[co<]?>de<]?>
1.84      paf      2706:                                                pop_LS(pc); // $name.[co<]>de<]!>
1.11      parser   2707:                                                RC;
                   2708:                                        }
1.3       parser   2709:                                break;
1.11      parser   2710:                        case '[': // $name.[co<[>de]
1.84      paf      2711:                                if(pc.ls==LS_NAME_SQUARE_PART)
1.11      parser   2712:                                        lexical_brackets_nestage++;
1.4       parser   2713:                                break;
1.1       parser   2714:                        }
1.97      paf      2715:                        if(pc.explicit_result && c)
                   2716:                                switch(c) {
                   2717:                                case '\n': case ' ': case '\t':
                   2718:                                        begin=pc.source;
                   2719:                                        begin_pos=pc.pos;
                   2720:                                        continue; // skip it
                   2721:                                default:
                   2722:                                        result=BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE;
                   2723:                                        goto break2;
                   2724:                                }
1.1       parser   2725:                        break;
                   2726:                        
                   2727:                // #COMMENT
1.66      paf      2728:                case LS_USER_COMMENT:
1.1       parser   2729:                        if(c=='\n') {
                   2730:                                // skip comment
1.84      paf      2731:                                begin=pc.source;
                   2732:                                begin_pos=pc.pos;
1.1       parser   2733: 
1.84      paf      2734:                                pop_LS(pc);
1.1       parser   2735:                                continue;
                   2736:                        }
                   2737:                        break;
                   2738:                        
                   2739:                // STRING IN EXPRESSION
                   2740:                case LS_EXPRESSION_STRING_QUOTED:
                   2741:                case LS_EXPRESSION_STRING_APOSTROFED:
                   2742:                        switch(c) {
                   2743:                        case '"':
                   2744:                        case '\'':
                   2745:                                if(
1.84      paf      2746:                                        pc.ls == LS_EXPRESSION_STRING_QUOTED && c=='"' ||
                   2747:                                        pc.ls == LS_EXPRESSION_STRING_APOSTROFED && c=='\'') {
                   2748:                                        pop_LS(pc); //"abc". | 'abc'.
1.1       parser   2749:                                        RC;
                   2750:                                }
                   2751:                                break;
                   2752:                        case '$':
1.84      paf      2753:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   2754:                                RC;
                   2755:                        case '^':
1.84      paf      2756:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   2757:                                RC;
                   2758:                        }
                   2759:                        break;
                   2760: 
                   2761:                // METHOD DEFINITION
                   2762:                case LS_DEF_NAME:
                   2763:                        switch(c) {
                   2764:                        case '[':
1.84      paf      2765:                                pc.ls=LS_DEF_PARAMS;
1.1       parser   2766:                                RC;
                   2767:                        case '\n':
1.84      paf      2768:                                pc.ls=LS_DEF_SPECIAL_BODY;
1.1       parser   2769:                                RC;
                   2770:                        }
                   2771:                        break;
                   2772: 
                   2773:                case LS_DEF_PARAMS:
                   2774:                        switch(c) {
1.64      paf      2775:                        case '$': // common error
1.65      paf      2776:                                result=BAD_METHOD_PARAMETER_NAME_CHARACTER;
                   2777:                                goto break2;
1.1       parser   2778:                        case ';':
                   2779:                                RC;
                   2780:                        case ']':
1.84      paf      2781:                                pc.ls=*pc.source=='['?LS_DEF_LOCALS:LS_DEF_COMMENT;
1.1       parser   2782:                                RC;
                   2783:                        case '\n': // wrong. bailing out
1.84      paf      2784:                                pop_LS(pc);
1.1       parser   2785:                                RC;
                   2786:                        }
                   2787:                        break;
                   2788: 
                   2789:                case LS_DEF_LOCALS:
                   2790:                        switch(c) {
                   2791:                        case '[':
                   2792:                        case ';':
                   2793:                                RC;
                   2794:                        case ']':
1.84      paf      2795:                                pc.ls=LS_DEF_COMMENT;
1.1       parser   2796:                                RC;
                   2797:                        case '\n': // wrong. bailing out
1.84      paf      2798:                                pop_LS(pc);
1.1       parser   2799:                                RC;
                   2800:                        }
                   2801:                        break;
                   2802: 
                   2803:                case LS_DEF_COMMENT:
                   2804:                        if(c=='\n') {
1.84      paf      2805:                                pop_LS(pc);
1.1       parser   2806:                                RC;
                   2807:                        }
                   2808:                        break;
                   2809: 
                   2810:                case LS_DEF_SPECIAL_BODY:
1.31      paf      2811:                        if(c=='\n')
1.1       parser   2812:                                RC;
                   2813:                        break;
                   2814: 
                   2815:                // (EXPRESSION)
                   2816:                case LS_VAR_ROUND:
                   2817:                case LS_METHOD_ROUND:
                   2818:                        switch(c) {
                   2819:                        case ')':
                   2820:                                if(--lexical_brackets_nestage==0)
1.84      paf      2821:                                        if(pc.ls==LS_METHOD_ROUND) // method round param ended
                   2822:                                                pc.ls=LS_METHOD_AFTER; // look for method end
                   2823:                                        else // pc.ls==LS_VAR_ROUND // variable constructor ended
                   2824:                                                pop_LS(pc); // return to normal life
1.1       parser   2825:                                RC;
1.66      paf      2826:                        case '#': // comment start skipping
                   2827:                                if(end!=begin) {
1.84      paf      2828:                                        if(!pc.string_start)
                   2829:                                                pc.string_start=begin_pos;
1.66      paf      2830:                                        // append piece till #
1.84      paf      2831:                                        pc.string.append_strdup_know_length(begin, end-begin);
1.66      paf      2832:                                }
                   2833:                                // fall into COMMENT lexical state [wait for \n]
1.84      paf      2834:                                push_LS(pc, LS_EXPRESSION_COMMENT);
1.66      paf      2835:                                lexical_brackets_nestage=1;
                   2836:                                continue;
1.1       parser   2837:                        case '$':
1.84      paf      2838:                                push_LS(pc, LS_EXPRESSION_VAR_NAME_WITH_COLON);                         
1.1       parser   2839:                                RC;
                   2840:                        case '^':
1.84      paf      2841:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   2842:                                RC;
                   2843:                        case '(':
                   2844:                                lexical_brackets_nestage++;
                   2845:                                RC;
                   2846:                        case '-':
1.84      paf      2847:                                switch(*pc.source) {
1.1       parser   2848:                                case 'f': // -f
                   2849:                                        skip_analized=1;
                   2850:                                        result=FEXISTS;
                   2851:                                        goto break2;
                   2852:                                case 'd': // -d
                   2853:                                        skip_analized=1;
                   2854:                                        result=DEXISTS;
                   2855:                                        goto break2;
1.63      paf      2856:                                default: // minus
1.1       parser   2857:                                        result=c;
                   2858:                                        goto break2;
                   2859:                                }
                   2860:                                goto break2;
1.25      paf      2861:                        case '+': case '*': case '/': case '%': case '\\':
1.1       parser   2862:                        case '~':
                   2863:                        case ';':
                   2864:                                RC;
1.65      paf      2865:                        case '&': case '|':
1.84      paf      2866:                                if(*pc.source==c) { // && ||
1.65      paf      2867:                                        result=c=='&'?LAND:LOR;
1.1       parser   2868:                                        skip_analized=1;
                   2869:                                } else
                   2870:                                        result=c;
                   2871:                                goto break2;
1.65      paf      2872:                        case '!':
1.84      paf      2873:                                switch(pc.source[0]) { 
1.65      paf      2874:                                case '|': // !| !||
                   2875:                                        skip_analized=1;
1.84      paf      2876:                                        if(pc.source[1]=='|') {
1.65      paf      2877:                                                skip_analized++;
                   2878:                                                result=LXOR;
                   2879:                                        } else
                   2880:                                                result=NXOR;
                   2881:                                        goto break2;
                   2882:                                case '=': // !=
                   2883:                                        skip_analized=1;
                   2884:                                        result=NNE; 
                   2885:                                        goto break2;
                   2886:                                }
                   2887:                                RC;
1.67      paf      2888: 
                   2889:                        case '<': // <<, <=, <
1.84      paf      2890:                                switch(*pc.source) {
1.67      paf      2891:                                case '<': // <[<]
                   2892:                                        skip_analized=1; result=NSL; break;
                   2893:                                case '=': // <[=]
                   2894:                                        skip_analized=1; result=NLE; break;
                   2895:                                default: // <[]
                   2896:                                        result=c; break;
                   2897:                                }
                   2898:                                goto break2;
                   2899:                        case '>': // >>, >=, >
1.84      paf      2900:                                switch(*pc.source) {
1.67      paf      2901:                                case '>': // >[>]
                   2902:                                        skip_analized=1; result=NSR; break;
                   2903:                                case '=': // >[=]
                   2904:                                        skip_analized=1; result=NGE; break;
                   2905:                                default: // >[]
                   2906:                                        result=c; break;
                   2907:                                }
                   2908:                                goto break2;
                   2909:                        case '=': // ==
1.84      paf      2910:                                switch(*pc.source) {
1.67      paf      2911:                                case '=': // =[=]
                   2912:                                        skip_analized=1; result=NEQ; break;
                   2913:                                default: // =[]
                   2914:                                        result=c; break; // not used now
                   2915:                                }
1.1       parser   2916:                                goto break2;
1.67      paf      2917: 
1.1       parser   2918:                        case '"':
1.84      paf      2919:                                push_LS(pc, LS_EXPRESSION_STRING_QUOTED);
1.1       parser   2920:                                RC;
                   2921:                        case '\'':
1.84      paf      2922:                                push_LS(pc, LS_EXPRESSION_STRING_APOSTROFED);
1.1       parser   2923:                                RC;
                   2924:                        case 'l': case 'g': case 'e': case 'n':
                   2925:                                if(end==begin) // right after whitespace
1.84      paf      2926:                                        if(isspace(pc.source[1])) {
                   2927:                                                switch(*pc.source) {
1.1       parser   2928:                                                        //                                      case '?': // ok [and bad cases, yacc would bark at them]
                   2929:                                                case 't': // lt gt [et nt]
                   2930:                                                        result=c=='l'?SLT:c=='g'?SGT:BAD_STRING_COMPARISON_OPERATOR;
                   2931:                                                        skip_analized=1;
                   2932:                                                        goto break2;
                   2933:                                                case 'e': // le ge ne [ee]
                   2934:                                                        result=c=='l'?SLE:c=='g'?SGE:c=='n'?SNE:BAD_STRING_COMPARISON_OPERATOR;
                   2935:                                                        skip_analized=1;
                   2936:                                                        goto break2;
                   2937:                                                case 'q': // eq [lq gq nq]
                   2938:                                                        result=c=='e'?SEQ:BAD_STRING_COMPARISON_OPERATOR;
                   2939:                                                        skip_analized=1;
                   2940:                                                        goto break2;
                   2941:                                                }
                   2942:                                        }
                   2943:                                break;
                   2944:                        case 'i':
                   2945:                                if(end==begin) // right after whitespace
1.84      paf      2946:                                        if(isspace(pc.source[1])) {
                   2947:                                                switch(pc.source[0]) {
1.1       parser   2948:                                                case 'n': // in
                   2949:                                                        skip_analized=1;
                   2950:                                                        result=IN;
                   2951:                                                        goto break2;
                   2952:                                                case 's': // is
                   2953:                                                        skip_analized=1;
                   2954:                                                        result=IS;
                   2955:                                                        goto break2;
                   2956:                                                }
                   2957:                                        }
                   2958:                                break;
                   2959:                        case 'd':
                   2960:                                if(end==begin) // right after whitespace
1.84      paf      2961:                                        if(pc.source[0]=='e' && pc.source[1]=='f') { // def
1.118     misha    2962:                                                switch(pc.source[2]){
                   2963:                                                case ' ': case '\t': case '\n': case '"': case '\'': case '^': case '$': // non-quoted string without whitespace after 'def' is not allowed
                   2964:                                                        skip_analized=2;
                   2965:                                                        result=DEF;
                   2966:                                                        goto break2;
                   2967:                                                }
                   2968:                                                // error: incorrect char after 'def'
1.1       parser   2969:                                        }
                   2970:                                break;
1.107     paf      2971:                        case 't':
                   2972:                                if(end==begin) // right after whitespace
1.118     misha    2973:                                        if(pc.source[0]=='r' && pc.source[1]=='u' && pc.source[2]=='e') { // true
1.107     paf      2974:                                                skip_analized=3;
                   2975:                                                result=LITERAL_TRUE;
                   2976:                                                goto break2;
                   2977:                                        }
                   2978:                                break;
                   2979:                        case 'f':
                   2980:                                if(end==begin) // right after whitespace
1.118     misha    2981:                                        if(pc.source[0]=='a' && pc.source[1]=='l' && pc.source[2]=='s' && pc.source[3]=='e') { // false
1.107     paf      2982:                                                skip_analized=4;
                   2983:                                                result=LITERAL_FALSE;
                   2984:                                                goto break2;
                   2985:                                        }
                   2986:                                break;
1.1       parser   2987:                        case ' ': case '\t': case '\n':
                   2988:                                if(end!=begin) { // there were a string after previous operator?
                   2989:                                        result=0; // return that string
                   2990:                                        goto break2;
                   2991:                                }
                   2992:                                // that's a leading|traling space or after-operator-space
                   2993:                                // ignoring it
                   2994:                                // reset piece 'begin' position & line
1.84      paf      2995:                                begin=pc.source; // after whitespace char
                   2996:                                begin_pos=pc.pos;
1.1       parser   2997:                                continue;
                   2998:                        }
                   2999:                        break;
1.66      paf      3000:                case LS_EXPRESSION_COMMENT:
                   3001:                        if(c=='(')
                   3002:                                lexical_brackets_nestage++;
                   3003:                        
1.84      paf      3004:                        switch(*pc.source) {
1.66      paf      3005:                        case '\n': case ')':
1.84      paf      3006:                                if(*pc.source==')')
1.66      paf      3007:                                        if(--lexical_brackets_nestage!=0)
                   3008:                                                continue;
                   3009: 
                   3010:                                // skip comment
1.84      paf      3011:                                begin=pc.source;
                   3012:                                begin_pos=pc.pos;
1.66      paf      3013: 
1.84      paf      3014:                                pop_LS(pc);
1.66      paf      3015:                                continue;
                   3016:                        }
                   3017:                        break;
1.1       parser   3018: 
                   3019:                // VARIABLE GET/PUT/WITH
1.11      parser   3020:                case LS_VAR_NAME_SIMPLE_WITH_COLON: 
                   3021:                case LS_VAR_NAME_SIMPLE_WITHOUT_COLON:
                   3022:                case LS_EXPRESSION_VAR_NAME_WITH_COLON: 
                   3023:                case LS_EXPRESSION_VAR_NAME_WITHOUT_COLON:
                   3024:                        if(
1.84      paf      3025:                                pc.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON ||
                   3026:                                pc.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) {
1.41      paf      3027:                                // name in expr ends also before 
1.1       parser   3028:                                switch(c) {
1.41      paf      3029:                                // expression minus
1.1       parser   3030:                                case '-': 
1.41      paf      3031:                                // expression integer division
                   3032:                                case '\\':
1.84      paf      3033:                                        pop_LS(pc);
                   3034:                                        pc.ungetc();
1.1       parser   3035:                                        result=EON;
                   3036:                                        goto break2;
                   3037:                                }
                   3038:                        }
1.11      parser   3039:                        if(
1.84      paf      3040:                                pc.ls==LS_VAR_NAME_SIMPLE_WITHOUT_COLON ||
                   3041:                                pc.ls==LS_EXPRESSION_VAR_NAME_WITHOUT_COLON) {
1.1       parser   3042:                                // name already has ':', stop before next 
                   3043:                                switch(c) {
                   3044:                                case ':': 
1.84      paf      3045:                                        pop_LS(pc);
                   3046:                                        pc.ungetc();
1.1       parser   3047:                                        result=EON;
                   3048:                                        goto break2;
                   3049:                                }
                   3050:                        }
                   3051:                        switch(c) {
                   3052:                        case 0:
                   3053:                        case ' ': case '\t': case '\n':
                   3054:                        case ';':
                   3055:                        case ']': case '}': case ')': 
                   3056:                        case '"': case '\'':
                   3057:                        case '<': case '>':  // these stand for HTML brackets AND expression binary ops
                   3058:                        case '+': case '*': case '/': case '%': 
                   3059:                        case '&': case '|': 
                   3060:                        case '=': case '!':
                   3061:                        // common delimiters
1.62      paf      3062:                        case ',': case '?': case '#':
1.113     paf      3063:                        // mysql column separators
                   3064:                        case '`':
1.1       parser   3065:                        // before call
                   3066:                        case '^': 
1.84      paf      3067:                                pop_LS(pc);
                   3068:                                pc.ungetc();
1.1       parser   3069:                                result=EON;
                   3070:                                goto break2;
                   3071:                        case '[':
1.5       parser   3072:                                // $name.<[>code]
1.84      paf      3073:                                if(pc.pos.col>1/*not first column*/ && (
1.6       parser   3074:                                        end[-1]=='$'/*was start of get*/ ||
                   3075:                                        end[-1]==':'/*was class name delim */ ||
                   3076:                                        end[-1]=='.'/*was name delim */
1.5       parser   3077:                                        )) {
1.84      paf      3078:                                        push_LS(pc, LS_NAME_SQUARE_PART);
1.5       parser   3079:                                        lexical_brackets_nestage=1;
                   3080:                                        RC;
                   3081:                                }
1.84      paf      3082:                                pc.ls=LS_VAR_SQUARE;
1.1       parser   3083:                                lexical_brackets_nestage=1;
                   3084:                                RC;
                   3085:                        case '{':
                   3086:                                if(begin==end) { // ${name}, no need of EON, switching LS
1.84      paf      3087:                                        pc.ls=LS_VAR_NAME_CURLY; 
1.1       parser   3088:                                } else {
1.84      paf      3089:                                        pc.ls=LS_VAR_CURLY;
1.1       parser   3090:                                        lexical_brackets_nestage=1;
                   3091:                                }
                   3092: 
                   3093:                                RC;
                   3094:                        case '(':
1.84      paf      3095:                                pc.ls=LS_VAR_ROUND;
1.1       parser   3096:                                lexical_brackets_nestage=1;
                   3097:                                RC;
                   3098:                        case '.': // name part delim
                   3099:                        case '$': // name part subvar
1.3       parser   3100:                        case ':': // class<:>name
1.11      parser   3101:                                // go to _WITHOUT_COLON state variant...
1.84      paf      3102:                                if(pc.ls==LS_VAR_NAME_SIMPLE_WITH_COLON)
                   3103:                                        pc.ls=LS_VAR_NAME_SIMPLE_WITHOUT_COLON;
                   3104:                                else if(pc.ls==LS_EXPRESSION_VAR_NAME_WITH_COLON)
                   3105:                                        pc.ls=LS_EXPRESSION_VAR_NAME_WITHOUT_COLON;
1.11      parser   3106:                                // ...stop before next ':'
1.1       parser   3107:                                RC;
                   3108:                        }
                   3109:                        break;
                   3110: 
                   3111:                case LS_VAR_NAME_CURLY:
                   3112:                        switch(c) {
1.5       parser   3113:                        case '[':
1.11      parser   3114:                                // ${name.<[>code]}
1.84      paf      3115:                                push_LS(pc, LS_NAME_SQUARE_PART);
1.3       parser   3116:                                lexical_brackets_nestage=1;
                   3117:                                RC;
1.1       parser   3118:                        case '}': // ${name} finished, restoring LS
1.84      paf      3119:                                pop_LS(pc);
1.1       parser   3120:                                RC;
                   3121:                        case '.': // name part delim
                   3122:                        case '$': // name part subvar
                   3123:                        case ':': // ':name' or 'class:name'
                   3124:                                RC;
                   3125:                        }
                   3126:                        break;
                   3127: 
                   3128:                case LS_VAR_SQUARE:
                   3129:                        switch(c) {
                   3130:                        case '$':
1.84      paf      3131:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   3132:                                RC;
                   3133:                        case '^':
1.84      paf      3134:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   3135:                                RC;
                   3136:                        case ']':
                   3137:                                if(--lexical_brackets_nestage==0) {
1.84      paf      3138:                                        pop_LS(pc);
1.1       parser   3139:                                        RC;
                   3140:                                }
                   3141:                                break;
                   3142:                        case ';': // operator_or_fmt;value delim
                   3143:                                RC;
                   3144:                        case '[':
                   3145:                                lexical_brackets_nestage++;
                   3146:                                break;
                   3147:                        }
                   3148:                        break;
                   3149: 
                   3150:                case LS_VAR_CURLY:
                   3151:                        switch(c) {
                   3152:                        case '$':
1.84      paf      3153:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   3154:                                RC;
                   3155:                        case '^':
1.84      paf      3156:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   3157:                                RC;
                   3158:                        case '}':
                   3159:                                if(--lexical_brackets_nestage==0) {
1.84      paf      3160:                                        pop_LS(pc);
1.1       parser   3161:                                        RC;
                   3162:                                }
                   3163:                                break;
                   3164:                        case '{':
                   3165:                                lexical_brackets_nestage++;
                   3166:                                break;
                   3167:                        }
                   3168:                        break;
                   3169: 
                   3170:                // METHOD CALL
                   3171:                case LS_METHOD_NAME:
                   3172:                        switch(c) {
                   3173:                        case '[':
1.11      parser   3174:                                // ^name.<[>code].xxx
1.84      paf      3175:                                if(pc.pos.col>1/*not first column*/ && (
1.6       parser   3176:                                        end[-1]=='^'/*was start of call*/ || // never, ^[ is literal...
                   3177:                                        end[-1]==':'/*was class name delim */ ||
                   3178:                                        end[-1]=='.'/*was name delim */
1.5       parser   3179:                                        )) {
1.84      paf      3180:                                        push_LS(pc, LS_NAME_SQUARE_PART);
1.5       parser   3181:                                        lexical_brackets_nestage=1;
                   3182:                                        RC;
                   3183:                                }
1.84      paf      3184:                                pc.ls=LS_METHOD_SQUARE;
1.1       parser   3185:                                lexical_brackets_nestage=1;
                   3186:                                RC;
                   3187:                        case '{':
1.84      paf      3188:                                pc.ls=LS_METHOD_CURLY;
1.1       parser   3189:                                lexical_brackets_nestage=1;
                   3190:                                RC;
                   3191:                        case '(':
1.84      paf      3192:                                pc.ls=LS_METHOD_ROUND;
1.1       parser   3193:                                lexical_brackets_nestage=1;
                   3194:                                RC;
                   3195:                        case '.': // name part delim 
                   3196:                        case '$': // name part subvar
                   3197:                        case ':': // ':name' or 'class:name'
1.19      parser   3198:                        case '^': // ^abc^xxx wrong. bailing out
                   3199:                        case ']': case '}': case ')': // ^abc]}) wrong. bailing out
1.90      paf      3200:                        case ' ': // ^if ( wrong. bailing out
1.1       parser   3201:                                RC;
                   3202:                        }
                   3203:                        break;
                   3204: 
                   3205:                case LS_METHOD_SQUARE:
                   3206:                        switch(c) {
                   3207:                        case '$':
1.84      paf      3208:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   3209:                                RC;
                   3210:                        case '^':
1.84      paf      3211:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   3212:                                RC;
                   3213:                        case ';': // param delim
                   3214:                                RC;
                   3215:                        case ']':
                   3216:                                if(--lexical_brackets_nestage==0) {
1.84      paf      3217:                                        pc.ls=LS_METHOD_AFTER;
1.1       parser   3218:                                        RC;
                   3219:                                }
                   3220:                                break;
                   3221:                        case '[':
                   3222:                                lexical_brackets_nestage++;
                   3223:                                break;
                   3224:                        }
                   3225:                        break;
                   3226: 
                   3227:                case LS_METHOD_CURLY:
                   3228:                        switch(c) {
                   3229:                        case '$':
1.84      paf      3230:                                push_LS(pc, LS_VAR_NAME_SIMPLE_WITH_COLON);
1.1       parser   3231:                                RC;
                   3232:                        case '^':
1.84      paf      3233:                                push_LS(pc, LS_METHOD_NAME);
1.1       parser   3234:                                RC;
                   3235:                        case ';': // param delim
                   3236:                                RC;
                   3237:                        case '}':
                   3238:                                if(--lexical_brackets_nestage==0) {
1.84      paf      3239:                                        pc.ls=LS_METHOD_AFTER;
1.1       parser   3240:                                        RC;
                   3241:                                }
                   3242:                                break;
                   3243:                        case '{':
                   3244:                                lexical_brackets_nestage++;
                   3245:                                break;
                   3246:                        }
1.97      paf      3247:                        if(pc.explicit_result && c)
                   3248:                                switch(c) {
                   3249:                                case '\n': case ' ': case '\t':
                   3250:                                        begin=pc.source;
                   3251:                                        begin_pos=pc.pos;
                   3252:                                        continue; // skip it
                   3253:                                default:
                   3254:                                        result=BAD_NONWHITESPACE_CHARACTER_IN_EXPLICIT_RESULT_MODE;
                   3255:                                        goto break2;
                   3256:                                }
1.1       parser   3257:                        break;
                   3258: 
                   3259:                case LS_METHOD_AFTER:
                   3260:                        if(c=='[') {/* ][ }[ )[ */
1.84      paf      3261:                                pc.ls=LS_METHOD_SQUARE;
1.1       parser   3262:                                lexical_brackets_nestage=1;
                   3263:                                RC;
                   3264:                        }                                          
                   3265:                        if(c=='{') {/* ]{ }{ ){ */
1.84      paf      3266:                                pc.ls=LS_METHOD_CURLY;
1.1       parser   3267:                                lexical_brackets_nestage=1;
                   3268:                                RC;
                   3269:                        }                                          
                   3270:                        if(c=='(') {/* ]( }( )( */
1.84      paf      3271:                                pc.ls=LS_METHOD_ROUND;
1.1       parser   3272:                                lexical_brackets_nestage=1;
                   3273:                                RC;
                   3274:                        }                                          
1.84      paf      3275:                        pop_LS(pc);
                   3276:                        pc.ungetc();
1.1       parser   3277:                        result=EON;
                   3278:                        goto break2;
                   3279:                }
                   3280:                if(c==0) {
                   3281:                        result=-1;
                   3282:                        break;
                   3283:                }
                   3284:        }
                   3285: 
                   3286: break2:
                   3287:        if(end!=begin) { // there is last piece?
                   3288:                if((c=='@' || c==0) && end[-1]=='\n') { // we are before LS_DEF_NAME or EOF?
                   3289:                        // strip last \n
                   3290:                        end--;
                   3291:                        if(end!=begin && end[-1]=='\n') // allow one empty line before LS_DEF_NAME
                   3292:                                end--;
                   3293:                }
1.84      paf      3294:                if(end!=begin && pc.ls!=LS_USER_COMMENT) { // last piece still alive and not comment?
                   3295:                        if(!pc.string_start)
                   3296:                                pc.string_start=begin_pos;
1.1       parser   3297:                        // append it
1.84      paf      3298:                        pc.string.append_strdup_know_length(begin, end-begin);
1.1       parser   3299:                }
                   3300:        }
1.84      paf      3301:        if(!pc.string.is_empty()) { // something accumulated?
                   3302:                // create STRING value: array of OP_VALUE+origin+vstring
                   3303:                *lvalp=VL(
                   3304:                        new VString(*new String(pc.string, String::L_CLEAN)),
                   3305:                        pc.file_no, pc.string_start.line, pc.string_start.col);
1.1       parser   3306:                // new pieces storage
1.84      paf      3307:                pc.string.clear();
                   3308:                pc.string_start.clear();
1.1       parser   3309:                // make current result be pending for next call, return STRING for now
1.84      paf      3310:                pc.pending_state=result;  result=STRING;
1.1       parser   3311:        }
                   3312:        if(skip_analized) {
1.84      paf      3313:                pc.source+=skip_analized;  pc.pos.col+=skip_analized;
1.1       parser   3314:        }
                   3315:        return result;
                   3316: }
                   3317: 
1.84      paf      3318: static int real_yyerror(Parse_control *pc, char *s) {  // Called by yyparse on error
1.10      parser   3319:           strncpy(PC.error, s, MAX_STRING);
1.1       parser   3320:           return 1;
                   3321: }
                   3322: 
                   3323: static void yyprint(FILE *file, int type, YYSTYPE value) {
                   3324:        if(type==STRING)
1.84      paf      3325:                fprintf(file, " \"%s\"", LA2S(*value)->cstr());
1.1       parser   3326: }
1.112     paf      3327: 
                   3328: 

E-mail: