+++ /dev/null
-/* A Bison parser, made by GNU Bison 3.0.4. */
-
-/* Bison implementation for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with ex or EX, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define EXBISON 1
-
-/* Bison version. */
-#define EXBISON_VERSION "3.0.4"
-
-/* Skeleton name. */
-#define EXSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define EXPURE 0
-
-/* Push parsers. */
-#define EXPUSH 0
-
-/* Pull parsers. */
-#define EXPULL 1
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 14 "../../lib/expr/exparse.y" /* yacc.c:339 */
-
-
-/*
- * Glenn Fowler
- * AT&T Research
- *
- * expression library grammar and compiler
- */
-
-#ifdef WIN32
-#include <config.h>
-
-#ifdef GVDLL
-#define _BLD_sfio 1
-#endif
-#endif
-
-#include <stdio.h>
-#include <ast.h>
-
-#undef RS /* hp.pa <signal.h> grabs this!! */
-
-
-#line 90 "y.tab.c" /* yacc.c:339 */
-
-# ifndef EX_NULLPTR
-# if defined __cplusplus && 201103L <= __cplusplus
-# define EX_NULLPTR nullptr
-# else
-# define EX_NULLPTR 0
-# endif
-# endif
-
-/* Enabling verbose error messages. */
-#ifdef EXERROR_VERBOSE
-# undef EXERROR_VERBOSE
-# define EXERROR_VERBOSE 1
-#else
-# define EXERROR_VERBOSE 0
-#endif
-
-/* In a future release of Bison, this section will be replaced
- by #include "y.tab.h". */
-#ifndef EX_EX_Y_TAB_H_INCLUDED
-# define EX_EX_Y_TAB_H_INCLUDED
-/* Debug traces. */
-#ifndef EXDEBUG
-# define EXDEBUG 1
-#endif
-#if EXDEBUG
-extern int exdebug;
-#endif
-
-/* Token type. */
-#ifndef EXTOKENTYPE
-# define EXTOKENTYPE
- enum extokentype
- {
- MINTOKEN = 258,
- INTEGER = 259,
- UNSIGNED = 260,
- CHARACTER = 261,
- FLOATING = 262,
- STRING = 263,
- VOIDTYPE = 264,
- STATIC = 265,
- ADDRESS = 266,
- ARRAY = 267,
- BREAK = 268,
- CALL = 269,
- CASE = 270,
- CONSTANT = 271,
- CONTINUE = 272,
- DECLARE = 273,
- DEFAULT = 274,
- DYNAMIC = 275,
- ELSE = 276,
- EXIT = 277,
- FOR = 278,
- FUNCTION = 279,
- GSUB = 280,
- ITERATE = 281,
- ITERATER = 282,
- ID = 283,
- IF = 284,
- LABEL = 285,
- MEMBER = 286,
- NAME = 287,
- POS = 288,
- PRAGMA = 289,
- PRE = 290,
- PRINT = 291,
- PRINTF = 292,
- PROCEDURE = 293,
- QUERY = 294,
- RAND = 295,
- RETURN = 296,
- SCANF = 297,
- SPLIT = 298,
- SPRINTF = 299,
- SRAND = 300,
- SSCANF = 301,
- SUB = 302,
- SUBSTR = 303,
- SWITCH = 304,
- TOKENS = 305,
- UNSET = 306,
- WHILE = 307,
- F2I = 308,
- F2S = 309,
- I2F = 310,
- I2S = 311,
- S2B = 312,
- S2F = 313,
- S2I = 314,
- F2X = 315,
- I2X = 316,
- S2X = 317,
- X2F = 318,
- X2I = 319,
- X2S = 320,
- X2X = 321,
- XPRINT = 322,
- OR = 323,
- AND = 324,
- EQ = 325,
- NE = 326,
- LE = 327,
- GE = 328,
- LS = 329,
- RS = 330,
- IN_OP = 331,
- UNARY = 332,
- INC = 333,
- DEC = 334,
- CAST = 335,
- MAXTOKEN = 336
- };
-#endif
-/* Tokens. */
-#define MINTOKEN 258
-#define INTEGER 259
-#define UNSIGNED 260
-#define CHARACTER 261
-#define FLOATING 262
-#define STRING 263
-#define VOIDTYPE 264
-#define STATIC 265
-#define ADDRESS 266
-#define ARRAY 267
-#define BREAK 268
-#define CALL 269
-#define CASE 270
-#define CONSTANT 271
-#define CONTINUE 272
-#define DECLARE 273
-#define DEFAULT 274
-#define DYNAMIC 275
-#define ELSE 276
-#define EXIT 277
-#define FOR 278
-#define FUNCTION 279
-#define GSUB 280
-#define ITERATE 281
-#define ITERATER 282
-#define ID 283
-#define IF 284
-#define LABEL 285
-#define MEMBER 286
-#define NAME 287
-#define POS 288
-#define PRAGMA 289
-#define PRE 290
-#define PRINT 291
-#define PRINTF 292
-#define PROCEDURE 293
-#define QUERY 294
-#define RAND 295
-#define RETURN 296
-#define SCANF 297
-#define SPLIT 298
-#define SPRINTF 299
-#define SRAND 300
-#define SSCANF 301
-#define SUB 302
-#define SUBSTR 303
-#define SWITCH 304
-#define TOKENS 305
-#define UNSET 306
-#define WHILE 307
-#define F2I 308
-#define F2S 309
-#define I2F 310
-#define I2S 311
-#define S2B 312
-#define S2F 313
-#define S2I 314
-#define F2X 315
-#define I2X 316
-#define S2X 317
-#define X2F 318
-#define X2I 319
-#define X2S 320
-#define X2X 321
-#define XPRINT 322
-#define OR 323
-#define AND 324
-#define EQ 325
-#define NE 326
-#define LE 327
-#define GE 328
-#define LS 329
-#define RS 330
-#define IN_OP 331
-#define UNARY 332
-#define INC 333
-#define DEC 334
-#define CAST 335
-#define MAXTOKEN 336
-
-/* Value type. */
-#if ! defined EXSTYPE && ! defined EXSTYPE_IS_DECLARED
-
-union EXSTYPE
-{
-#line 39 "../../lib/expr/exparse.y" /* yacc.c:355 */
-
- struct Exnode_s*expr;
- double floating;
- struct Exref_s* reference;
- struct Exid_s* id;
- Sflong_t integer;
- int op;
- char* string;
- void* user;
- struct Exbuf_s* buffer;
-
-#line 304 "y.tab.c" /* yacc.c:355 */
-};
-
-typedef union EXSTYPE EXSTYPE;
-# define EXSTYPE_IS_TRIVIAL 1
-# define EXSTYPE_IS_DECLARED 1
-#endif
-
-
-extern EXSTYPE exlval;
-
-int exparse (void);
-
-#endif /* !EX_EX_Y_TAB_H_INCLUDED */
-
-/* Copy the second part of user declarations. */
-#line 166 "../../lib/expr/exparse.y" /* yacc.c:358 */
-
-
-#include "exgram.h"
-
-
-#line 326 "y.tab.c" /* yacc.c:358 */
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef EXTYPE_UINT8
-typedef EXTYPE_UINT8 extype_uint8;
-#else
-typedef unsigned char extype_uint8;
-#endif
-
-#ifdef EXTYPE_INT8
-typedef EXTYPE_INT8 extype_int8;
-#else
-typedef signed char extype_int8;
-#endif
-
-#ifdef EXTYPE_UINT16
-typedef EXTYPE_UINT16 extype_uint16;
-#else
-typedef unsigned short int extype_uint16;
-#endif
-
-#ifdef EXTYPE_INT16
-typedef EXTYPE_INT16 extype_int16;
-#else
-typedef short int extype_int16;
-#endif
-
-#ifndef EXSIZE_T
-# ifdef __SIZE_TYPE__
-# define EXSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define EXSIZE_T size_t
-# elif ! defined EXSIZE_T
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define EXSIZE_T size_t
-# else
-# define EXSIZE_T unsigned int
-# endif
-#endif
-
-#define EXSIZE_MAXIMUM ((EXSIZE_T) -1)
-
-#ifndef EX_
-# if defined EXENABLE_NLS && EXENABLE_NLS
-# if ENABLE_NLS
-# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-# define EX_(Msgid) dgettext ("bison-runtime", Msgid)
-# endif
-# endif
-# ifndef EX_
-# define EX_(Msgid) Msgid
-# endif
-#endif
-
-#ifndef EX_ATTRIBUTE
-# if (defined __GNUC__ \
- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-# define EX_ATTRIBUTE(Spec) __attribute__(Spec)
-# else
-# define EX_ATTRIBUTE(Spec) /* empty */
-# endif
-#endif
-
-#ifndef EX_ATTRIBUTE_PURE
-# define EX_ATTRIBUTE_PURE EX_ATTRIBUTE ((__pure__))
-#endif
-
-#ifndef EX_ATTRIBUTE_UNUSED
-# define EX_ATTRIBUTE_UNUSED EX_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
- && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-# define _Noreturn __declspec (noreturn)
-# else
-# define _Noreturn EX_ATTRIBUTE ((__noreturn__))
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define EXUSE(E) ((void) (E))
-#else
-# define EXUSE(E) /* empty */
-#endif
-
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-/* Suppress an incorrect diagnostic about exlval being uninitialized. */
-# define EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
- _Pragma ("GCC diagnostic push") \
- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
- _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define EX_IGNORE_MAYBE_UNINITIALIZED_END \
- _Pragma ("GCC diagnostic pop")
-#else
-# define EX_INITIAL_VALUE(Value) Value
-#endif
-#ifndef EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define EX_IGNORE_MAYBE_UNINITIALIZED_END
-#endif
-#ifndef EX_INITIAL_VALUE
-# define EX_INITIAL_VALUE(Value) /* Nothing. */
-#endif
-
-
-#if ! defined exoverflow || EXERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef EXSTACK_USE_ALLOCA
-# if EXSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define EXSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define EXSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define EXSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
- /* Use EXIT_SUCCESS as a witness for stdlib.h. */
-# ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef EXSTACK_ALLOC
- /* Pacify GCC's 'empty if-body' warning. */
-# define EXSTACK_FREE(Ptr) do { /* empty */; } while (0)
-# ifndef EXSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define EXSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define EXSTACK_ALLOC EXMALLOC
-# define EXSTACK_FREE EXFREE
-# ifndef EXSTACK_ALLOC_MAXIMUM
-# define EXSTACK_ALLOC_MAXIMUM EXSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined EXIT_SUCCESS \
- && ! ((defined EXMALLOC || defined malloc) \
- && (defined EXFREE || defined free)))
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-# ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-# endif
-# endif
-# ifndef EXMALLOC
-# define EXMALLOC malloc
-# if ! defined malloc && ! defined EXIT_SUCCESS
-void *malloc (EXSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef EXFREE
-# define EXFREE free
-# if ! defined free && ! defined EXIT_SUCCESS
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined exoverflow || EXERROR_VERBOSE */
-
-
-#if (! defined exoverflow \
- && (! defined __cplusplus \
- || (defined EXSTYPE_IS_TRIVIAL && EXSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union exalloc
-{
- extype_int16 exss_alloc;
- EXSTYPE exvs_alloc;
-};
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define EXSTACK_GAP_MAXIMUM (sizeof (union exalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define EXSTACK_BYTES(N) \
- ((N) * (sizeof (extype_int16) + sizeof (EXSTYPE)) \
- + EXSTACK_GAP_MAXIMUM)
-
-# define EXCOPY_NEEDED 1
-
-/* Relocate STACK from its old location to the new one. The
- local variables EXSIZE and EXSTACKSIZE give the old and new number of
- elements in the stack, and EXPTR gives the new location of the
- stack. Advance EXPTR to a properly aligned location for the next
- stack. */
-# define EXSTACK_RELOCATE(Stack_alloc, Stack) \
- do \
- { \
- EXSIZE_T exnewbytes; \
- EXCOPY (&exptr->Stack_alloc, Stack, exsize); \
- Stack = &exptr->Stack_alloc; \
- exnewbytes = exstacksize * sizeof (*Stack) + EXSTACK_GAP_MAXIMUM; \
- exptr += exnewbytes / sizeof (*exptr); \
- } \
- while (0)
-
-#endif
-
-#if defined EXCOPY_NEEDED && EXCOPY_NEEDED
-/* Copy COUNT objects from SRC to DST. The source and destination do
- not overlap. */
-# ifndef EXCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define EXCOPY(Dst, Src, Count) \
- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
-# else
-# define EXCOPY(Dst, Src, Count) \
- do \
- { \
- EXSIZE_T exi; \
- for (exi = 0; exi < (Count); exi++) \
- (Dst)[exi] = (Src)[exi]; \
- } \
- while (0)
-# endif
-# endif
-#endif /* !EXCOPY_NEEDED */
-
-/* EXFINAL -- State number of the termination state. */
-#define EXFINAL 3
-/* EXLAST -- Last index in EXTABLE. */
-#define EXLAST 1112
-
-/* EXNTOKENS -- Number of terminals. */
-#define EXNTOKENS 107
-/* EXNNTS -- Number of nonterminals. */
-#define EXNNTS 44
-/* EXNRULES -- Number of rules. */
-#define EXNRULES 142
-/* EXNSTATES -- Number of states. */
-#define EXNSTATES 286
-
-/* EXTRANSLATE[EXX] -- Symbol number corresponding to EXX as returned
- by exlex, with out-of-bounds checking. */
-#define EXUNDEFTOK 2
-#define EXMAXUTOK 336
-
-#define EXTRANSLATE(EXX) \
- ((unsigned int) (EXX) <= EXMAXUTOK ? extranslate[EXX] : EXUNDEFTOK)
-
-/* EXTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
- as returned by exlex, without out-of-bounds checking. */
-static const extype_uint8 extranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 91, 2, 93, 2, 90, 76, 2,
- 98, 103, 88, 85, 68, 86, 106, 89, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 71, 102,
- 79, 69, 80, 70, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 104, 2, 105, 75, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 100, 74, 101, 92, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, 72, 73, 77, 78, 81, 82, 83,
- 84, 87, 94, 95, 96, 97, 99
-};
-
-#if EXDEBUG
- /* EXRLINE[EXN] -- Source line where rule number EXN was defined. */
-static const extype_uint16 exrline[] =
-{
- 0, 174, 174, 195, 196, 199, 199, 239, 242, 269,
- 273, 277, 277, 277, 282, 292, 305, 320, 333, 341,
- 352, 362, 362, 374, 386, 390, 403, 433, 436, 468,
- 469, 472, 493, 500, 503, 509, 510, 517, 517, 573,
- 574, 575, 576, 579, 580, 584, 587, 594, 597, 600,
- 604, 608, 661, 665, 669, 673, 677, 681, 685, 689,
- 693, 697, 701, 705, 709, 713, 717, 721, 734, 738,
- 748, 748, 748, 789, 809, 816, 820, 824, 828, 832,
- 836, 846, 850, 854, 858, 862, 866, 872, 876, 880,
- 886, 891, 895, 920, 956, 980, 988, 996, 1007, 1011,
- 1015, 1018, 1019, 1021, 1029, 1034, 1039, 1044, 1051, 1052,
- 1053, 1056, 1057, 1060, 1064, 1084, 1097, 1100, 1104, 1118,
- 1121, 1128, 1131, 1139, 1144, 1151, 1154, 1160, 1163, 1167,
- 1178, 1178, 1191, 1194, 1206, 1225, 1229, 1235, 1238, 1245,
- 1246, 1263, 1246
-};
-#endif
-
-#if EXDEBUG || EXERROR_VERBOSE || 0
-/* EXTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at EXNTOKENS, nonterminals. */
-static const char *const extname[] =
-{
- "$end", "error", "$undefined", "MINTOKEN", "INTEGER", "UNSIGNED",
- "CHARACTER", "FLOATING", "STRING", "VOIDTYPE", "STATIC", "ADDRESS",
- "ARRAY", "BREAK", "CALL", "CASE", "CONSTANT", "CONTINUE", "DECLARE",
- "DEFAULT", "DYNAMIC", "ELSE", "EXIT", "FOR", "FUNCTION", "GSUB",
- "ITERATE", "ITERATER", "ID", "IF", "LABEL", "MEMBER", "NAME", "POS",
- "PRAGMA", "PRE", "PRINT", "PRINTF", "PROCEDURE", "QUERY", "RAND",
- "RETURN", "SCANF", "SPLIT", "SPRINTF", "SRAND", "SSCANF", "SUB",
- "SUBSTR", "SWITCH", "TOKENS", "UNSET", "WHILE", "F2I", "F2S", "I2F",
- "I2S", "S2B", "S2F", "S2I", "F2X", "I2X", "S2X", "X2F", "X2I", "X2S",
- "X2X", "XPRINT", "','", "'='", "'?'", "':'", "OR", "AND", "'|'", "'^'",
- "'&'", "EQ", "NE", "'<'", "'>'", "LE", "GE", "LS", "RS", "'+'", "'-'",
- "IN_OP", "'*'", "'/'", "'%'", "'!'", "'~'", "'#'", "UNARY", "INC", "DEC",
- "CAST", "'('", "MAXTOKEN", "'{'", "'}'", "';'", "')'", "'['", "']'",
- "'.'", "$accept", "program", "action_list", "action", "$@1",
- "statement_list", "statement", "$@2", "$@3", "$@4", "switch_list",
- "switch_item", "case_list", "case_item", "static", "dcl_list",
- "dcl_item", "$@5", "dcl_name", "name", "else_opt", "expr_opt", "expr",
- "$@6", "$@7", "splitop", "constant", "print", "scan", "variable",
- "array", "index", "args", "arg_list", "formals", "formal_list",
- "formal_item", "$@8", "members", "member", "assign", "initialize", "$@9",
- "$@10", EX_NULLPTR
-};
-#endif
-
-# ifdef EXPRINT
-/* EXTOKNUM[NUM] -- (External) token number corresponding to the
- (internal) symbol number NUM (which must be that of a token). */
-static const extype_uint16 extoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
- 315, 316, 317, 318, 319, 320, 321, 322, 44, 61,
- 63, 58, 323, 324, 124, 94, 38, 325, 326, 60,
- 62, 327, 328, 329, 330, 43, 45, 331, 42, 47,
- 37, 33, 126, 35, 332, 333, 334, 335, 40, 336,
- 123, 125, 59, 41, 91, 93, 46
-};
-# endif
-
-#define EXPACT_NINF -144
-
-#define expact_value_is_default(Yystate) \
- (!!((Yystate) == (-144)))
-
-#define EXTABLE_NINF -127
-
-#define extable_value_is_error(Yytable_value) \
- (!!((Yytable_value) == (-127)))
-
- /* EXPACT[STATE-NUM] -- Index in EXTABLE of the portion describing
- STATE-NUM. */
-static const extype_int16 expact[] =
-{
- -144, 9, 200, -144, -144, -144, -144, -144, -144, -89,
- 691, -144, 691, -80, -71, -64, -63, -43, -35, -27,
- -11, -144, 11, -144, 16, -144, 20, 691, -144, -144,
- -144, 23, -144, 31, 39, 41, -144, 56, 57, 1,
- 691, 691, 691, 691, 79, 1, 1, 596, -144, 92,
- -144, -144, 49, 872, 58, -144, 60, 61, -37, 691,
- 65, 66, 691, -27, 691, 691, 691, 691, 1, -12,
- -144, -144, 691, 691, 691, 59, 68, 88, 691, 691,
- 691, 140, 691, -144, -144, -144, -144, -144, -144, -144,
- -144, 72, 284, 299, 100, -144, 158, -144, 691, -144,
- 691, 691, 691, 691, 691, 691, 691, 691, 691, 691,
- 691, 691, 691, 691, 691, 143, 691, 691, 691, 691,
- 691, 691, 691, -144, -144, -144, 916, 77, 109, -144,
- -144, 185, -144, 383, 83, -56, 84, 85, 95, 93,
- -144, 482, 97, 98, -144, -144, -144, 577, 106, 108,
- 872, -51, 672, 691, -144, -144, -144, -144, 916, 691,
- 934, 951, 967, 982, 996, 1010, 1010, 1022, 1022, 1022,
- 1022, 107, 107, 53, 53, -144, -144, -144, -144, 895,
- 111, 112, 916, -144, 691, -144, -144, 691, 497, -144,
- -144, 497, 29, -144, 497, -144, -144, -144, -144, -144,
- 116, 691, -144, 497, -144, -144, 87, 849, 786, -144,
- -144, 916, 124, -144, -144, -144, 168, 90, 767, -144,
- 200, -144, -144, -144, -144, -49, -144, -144, -144, -54,
- 691, 497, -144, -144, -144, 87, -144, 126, 691, 691,
- -144, 128, -144, -7, -144, -16, -44, 916, 815, 497,
- 145, 162, -144, -144, 86, -144, 129, -144, -144, -144,
- -144, -144, -144, 183, -144, 200, -144, -144, 238, -144,
- 174, -144, 210, -144, -10, 176, 262, -144, -144, -144,
- 181, -144, -144, -144, 398, -144
-};
-
- /* EXDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
- Performed when EXTABLE does not specify something else to do. Zero
- means the default is an error. */
-static const extype_uint8 exdefact[] =
-{
- 7, 0, 3, 1, 105, 107, 104, 106, 34, 0,
- 47, 103, 47, 119, 0, 0, 0, 0, 0, 132,
- 0, 115, 0, 108, 0, 109, 0, 47, 111, 101,
- 110, 0, 112, 0, 0, 0, 102, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,
- 8, 11, 0, 48, 0, 100, 0, 0, 137, 121,
- 0, 0, 0, 132, 0, 47, 121, 121, 0, 0,
- 113, 133, 0, 121, 121, 0, 0, 0, 121, 121,
- 0, 0, 0, 78, 77, 76, 73, 75, 74, 95,
- 98, 0, 0, 33, 0, 4, 0, 10, 0, 70,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 121, 121, 0, 96, 99, 94, 123, 0, 122, 23,
- 24, 0, 114, 0, 0, 137, 0, 0, 0, 135,
- 136, 0, 0, 0, 87, 25, 88, 0, 0, 0,
- 21, 0, 0, 0, 49, 9, 5, 12, 69, 0,
- 68, 67, 64, 65, 63, 61, 62, 51, 58, 59,
- 60, 56, 57, 66, 52, 97, 53, 54, 55, 0,
- 0, 0, 138, 79, 0, 120, 86, 47, 33, 80,
- 81, 33, 0, 134, 33, 91, 90, 89, 82, 83,
- 0, 0, 18, 33, 50, 7, 0, 0, 0, 92,
- 93, 124, 0, 15, 17, 135, 45, 0, 0, 20,
- 6, 40, 42, 41, 39, 0, 35, 37, 71, 119,
- 47, 33, 14, 26, 19, 0, 13, 116, 0, 0,
- 84, 0, 46, 0, 36, 0, 137, 72, 0, 33,
- 0, 0, 22, 27, 7, 29, 0, 117, 140, 139,
- 38, 85, 16, 0, 32, 28, 30, 118, 125, 31,
- 130, 141, 127, 128, 0, 0, 0, 44, 43, 131,
- 0, 130, 129, 7, 33, 142
-};
-
- /* EXPGOTO[NTERM-NUM]. */
-static const extype_int16 expgoto[] =
-{
- -144, -144, -144, -144, -144, -48, -143, -144, -144, -144,
- -144, -144, -144, 28, -144, -144, 48, -144, -144, -144,
- -144, -9, -36, -144, -144, -144, 34, -144, -144, 101,
- -144, -144, 24, -144, -144, -144, 12, -144, 224, 150,
- 51, -144, -144, -144
-};
-
- /* EXDEFGOTO[NTERM-NUM]. */
-static const extype_int16 exdefgoto[] =
-{
- -1, 1, 49, 95, 205, 2, 50, 96, 206, 200,
- 243, 253, 254, 255, 51, 225, 226, 237, 227, 279,
- 232, 52, 53, 159, 238, 54, 55, 56, 57, 58,
- 246, 63, 127, 128, 271, 272, 273, 274, 70, 71,
- 125, 260, 268, 275
-};
-
- /* EXTABLE[EXPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule whose
- number is the opposite. If EXTABLE_NINF, syntax error. */
-static const extype_int16 extable[] =
-{
- 93, 60, 256, 61, 84, 85, 86, 87, 250, 3,
- 277, 92, 251, 122, 239, 59, 139, 201, 76, 235,
- 140, 13, 278, 126, 62, 122, 131, 64, 133, 19,
- 126, 126, 122, 21, 65, 66, 141, 126, 126, 123,
- 124, 147, 126, 126, 150, 213, 152, 188, 214, 240,
- 62, 216, 202, 236, 258, 67, 134, 215, 123, 124,
- 219, 140, 158, 68, 160, 161, 162, 163, 164, 165,
- 166, 167, 168, 169, 170, 171, 172, 173, 174, 69,
- 176, 177, 178, 179, 126, 126, 182, 72, 242, 257,
- 136, 137, 4, 5, 252, 6, 7, 142, 143, 88,
- 9, 250, 148, 149, 11, 251, 262, 221, 13, 73,
- 14, 222, 16, 17, 74, 223, 19, 204, 75, 224,
- 21, 77, 94, 207, 22, 23, 24, 25, 26, 78,
- 28, 29, 30, 31, 32, 33, 34, 79, 36, 80,
- 83, 116, 117, 118, 180, 181, 89, 90, 211, 4,
- 5, 97, 6, 7, 81, 82, 119, 220, 120, 121,
- 151, 11, 144, 175, 39, 218, 135, 129, 130, 138,
- 145, 156, 158, 40, 41, 153, 157, 184, 212, 42,
- 43, 44, 183, 45, 46, 187, 47, 189, 190, 231,
- 233, 146, 113, 114, 115, 116, 117, 118, 191, 192,
- 195, 196, 247, 248, 4, 5, 265, 6, 7, 198,
- 8, 199, 9, 10, 209, 210, 11, 12, -33, 217,
- 13, 241, 14, 15, 16, 17, 230, 18, 19, 20,
- 245, 249, 21, 264, 267, 284, 22, 23, 24, 25,
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 98, 269, 99, 270, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 39, -126, 276, 280,
- 281, 283, 266, 244, 263, 40, 41, 132, 282, 193,
- 185, 42, 43, 44, 0, 45, 46, 259, 47, 0,
- 48, 0, -47, 4, 5, 0, 6, 7, 0, 8,
- 0, 9, 10, 0, 0, 11, 12, 0, 0, 13,
- 0, 14, 15, 16, 17, 0, 18, 19, 20, 0,
- 0, 21, 0, 0, 0, 22, 23, 24, 25, 26,
- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
- 37, 38, 98, 0, 99, 0, 100, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
- 114, 115, 116, 117, 118, 39, 0, 0, 0, 0,
- 0, 0, 0, 0, 40, 41, 0, 154, 0, 0,
- 42, 43, 44, 0, 45, 46, 0, 47, 0, 48,
- 155, -47, 4, 5, 0, 6, 7, 0, 8, 0,
- 9, 10, 0, 0, 11, 12, 0, 0, 13, 0,
- 14, 15, 16, 17, 0, 18, 19, 20, 0, 0,
- 21, 0, 0, 0, 22, 23, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 98, 0, 99, 0, 100, 101, 102, 103, 104,
- 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
- 115, 116, 117, 118, 39, 0, 0, 0, 0, 0,
- 0, 0, 0, 40, 41, 0, 186, 0, 0, 42,
- 43, 44, 0, 45, 46, 0, 47, 0, 48, 285,
- -47, 4, 5, 0, 6, 7, 0, 8, 0, 9,
- 10, 0, 0, 11, 12, 0, 0, 13, 0, 14,
- 15, 16, 17, 0, 18, 19, 20, 0, 0, 21,
- 0, 0, 0, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
- 98, 0, 99, 0, 100, 101, 102, 103, 104, 105,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 39, 0, 0, 0, 0, 0, 0,
- 0, 0, 40, 41, 0, 194, 0, 0, 42, 43,
- 44, 0, 45, 46, 0, 47, 0, 48, 0, -47,
- 4, 5, 0, 6, 7, 0, 0, 0, 9, 0,
- 0, 0, 11, 0, 91, 0, 13, 0, 14, 0,
- 16, 17, 0, 0, 19, 0, 0, 0, 21, 0,
- 0, 0, 22, 23, 24, 25, 26, 0, 28, 29,
- 30, 31, 32, 33, 34, 98, 36, 99, 0, 100,
- 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 0, 0,
- 0, 0, 39, 0, 0, 0, 0, 0, 0, 0,
- 197, 40, 41, 0, 0, 0, 0, 42, 43, 44,
- 0, 45, 46, 0, 47, 4, 5, 0, 6, 7,
- 0, 0, 0, 9, 0, 0, 0, 11, 0, 0,
- 0, 13, 0, 14, 0, 16, 17, 0, 0, 19,
- 0, 0, 0, 21, 0, 0, 0, 22, 23, 24,
- 25, 26, 0, 28, 29, 30, 31, 32, 33, 34,
- 98, 36, 99, 0, 100, 101, 102, 103, 104, 105,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 0, 0, 0, 0, 39, 0, 0,
- 0, 0, 0, 0, 0, 203, 40, 41, 0, 0,
- 0, 0, 42, 43, 44, 0, 45, 46, 0, 47,
- 4, 5, 0, 6, 7, 0, 0, 0, 9, 0,
- 0, 0, 11, 0, 0, 0, 229, 0, 14, 0,
- 16, 17, 0, 0, 19, 0, 0, 0, 21, 0,
- 0, 0, 22, 23, 24, 25, 26, 0, 28, 29,
- 30, 31, 32, 33, 34, 98, 36, 99, 0, 100,
- 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 0, 0,
- 0, 0, 39, 0, 0, 0, 0, 0, 0, 0,
- 234, 40, 41, 0, 0, 0, 0, 42, 43, 44,
- 0, 45, 46, 98, 47, 99, 0, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 98, 261, 99,
- 228, 100, 101, 102, 103, 104, 105, 106, 107, 108,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
- 98, 0, 99, 0, 100, 101, 102, 103, 104, 105,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 208, 0, 99, 0, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 99, 0, 100, 101,
- 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
- 114, 115, 116, 117, 118, 102, 103, 104, 105, 106,
- 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
- 117, 118, 103, 104, 105, 106, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 104, 105,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, -127, -127, 107,
- 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
- 118, -127, -127, -127, -127, 111, 112, 113, 114, 115,
- 116, 117, 118
-};
-
-static const extype_int16 excheck[] =
-{
- 48, 10, 18, 12, 40, 41, 42, 43, 15, 0,
- 20, 47, 19, 69, 68, 104, 28, 68, 27, 68,
- 32, 20, 32, 59, 104, 69, 62, 98, 64, 28,
- 66, 67, 69, 32, 98, 98, 72, 73, 74, 95,
- 96, 77, 78, 79, 80, 188, 82, 103, 191, 103,
- 104, 194, 103, 102, 98, 98, 65, 28, 95, 96,
- 203, 32, 98, 98, 100, 101, 102, 103, 104, 105,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 106,
- 116, 117, 118, 119, 120, 121, 122, 98, 231, 105,
- 66, 67, 4, 5, 101, 7, 8, 73, 74, 20,
- 12, 15, 78, 79, 16, 19, 249, 20, 20, 98,
- 22, 24, 24, 25, 98, 28, 28, 153, 98, 32,
- 32, 98, 30, 159, 36, 37, 38, 39, 40, 98,
- 42, 43, 44, 45, 46, 47, 48, 98, 50, 98,
- 39, 88, 89, 90, 120, 121, 45, 46, 184, 4,
- 5, 102, 7, 8, 98, 98, 98, 205, 98, 98,
- 20, 16, 103, 20, 76, 201, 65, 102, 102, 68,
- 102, 71, 208, 85, 86, 103, 18, 68, 187, 91,
- 92, 93, 105, 95, 96, 102, 98, 103, 103, 21,
- 100, 103, 85, 86, 87, 88, 89, 90, 103, 106,
- 103, 103, 238, 239, 4, 5, 254, 7, 8, 103,
- 10, 103, 12, 13, 103, 103, 16, 17, 18, 103,
- 20, 230, 22, 23, 24, 25, 102, 27, 28, 29,
- 104, 103, 32, 71, 105, 283, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
- 50, 51, 52, 68, 71, 70, 18, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 76, 103, 68, 103,
- 18, 100, 254, 235, 250, 85, 86, 63, 276, 139,
- 105, 91, 92, 93, -1, 95, 96, 246, 98, -1,
- 100, -1, 102, 4, 5, -1, 7, 8, -1, 10,
- -1, 12, 13, -1, -1, 16, 17, -1, -1, 20,
- -1, 22, 23, 24, 25, -1, 27, 28, 29, -1,
- -1, 32, -1, -1, -1, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 52, 68, -1, 70, -1, 72, 73, 74, 75,
- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
- 86, 87, 88, 89, 90, 76, -1, -1, -1, -1,
- -1, -1, -1, -1, 85, 86, -1, 103, -1, -1,
- 91, 92, 93, -1, 95, 96, -1, 98, -1, 100,
- 101, 102, 4, 5, -1, 7, 8, -1, 10, -1,
- 12, 13, -1, -1, 16, 17, -1, -1, 20, -1,
- 22, 23, 24, 25, -1, 27, 28, 29, -1, -1,
- 32, -1, -1, -1, 36, 37, 38, 39, 40, 41,
- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- 52, 68, -1, 70, -1, 72, 73, 74, 75, 76,
- 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 76, -1, -1, -1, -1, -1,
- -1, -1, -1, 85, 86, -1, 103, -1, -1, 91,
- 92, 93, -1, 95, 96, -1, 98, -1, 100, 101,
- 102, 4, 5, -1, 7, 8, -1, 10, -1, 12,
- 13, -1, -1, 16, 17, -1, -1, 20, -1, 22,
- 23, 24, 25, -1, 27, 28, 29, -1, -1, 32,
- -1, -1, -1, 36, 37, 38, 39, 40, 41, 42,
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- 68, -1, 70, -1, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 76, -1, -1, -1, -1, -1, -1,
- -1, -1, 85, 86, -1, 103, -1, -1, 91, 92,
- 93, -1, 95, 96, -1, 98, -1, 100, -1, 102,
- 4, 5, -1, 7, 8, -1, -1, -1, 12, -1,
- -1, -1, 16, -1, 18, -1, 20, -1, 22, -1,
- 24, 25, -1, -1, 28, -1, -1, -1, 32, -1,
- -1, -1, 36, 37, 38, 39, 40, -1, 42, 43,
- 44, 45, 46, 47, 48, 68, 50, 70, -1, 72,
- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
- 83, 84, 85, 86, 87, 88, 89, 90, -1, -1,
- -1, -1, 76, -1, -1, -1, -1, -1, -1, -1,
- 103, 85, 86, -1, -1, -1, -1, 91, 92, 93,
- -1, 95, 96, -1, 98, 4, 5, -1, 7, 8,
- -1, -1, -1, 12, -1, -1, -1, 16, -1, -1,
- -1, 20, -1, 22, -1, 24, 25, -1, -1, 28,
- -1, -1, -1, 32, -1, -1, -1, 36, 37, 38,
- 39, 40, -1, 42, 43, 44, 45, 46, 47, 48,
- 68, 50, 70, -1, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, -1, -1, -1, -1, 76, -1, -1,
- -1, -1, -1, -1, -1, 103, 85, 86, -1, -1,
- -1, -1, 91, 92, 93, -1, 95, 96, -1, 98,
- 4, 5, -1, 7, 8, -1, -1, -1, 12, -1,
- -1, -1, 16, -1, -1, -1, 20, -1, 22, -1,
- 24, 25, -1, -1, 28, -1, -1, -1, 32, -1,
- -1, -1, 36, 37, 38, 39, 40, -1, 42, 43,
- 44, 45, 46, 47, 48, 68, 50, 70, -1, 72,
- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
- 83, 84, 85, 86, 87, 88, 89, 90, -1, -1,
- -1, -1, 76, -1, -1, -1, -1, -1, -1, -1,
- 103, 85, 86, -1, -1, -1, -1, 91, 92, 93,
- -1, 95, 96, 68, 98, 70, -1, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 68, 103, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
- 68, -1, 70, -1, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 68, -1, 70, -1, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 70, -1, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- 84, 85, 86, 87, 88, 89, 90, 73, 74, 75,
- 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
- 86, 87, 88, 89, 90, 74, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 75, 76, 77, 78, 79, 80, 81, 82,
- 83, 84, 85, 86, 87, 88, 89, 90, 76, 77,
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 77, 78, 79, 80, 81, 82, 83,
- 84, 85, 86, 87, 88, 89, 90, 77, 78, 79,
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90
-};
-
- /* EXSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const extype_uint8 exstos[] =
-{
- 0, 108, 112, 0, 4, 5, 7, 8, 10, 12,
- 13, 16, 17, 20, 22, 23, 24, 25, 27, 28,
- 29, 32, 36, 37, 38, 39, 40, 41, 42, 43,
- 44, 45, 46, 47, 48, 49, 50, 51, 52, 76,
- 85, 86, 91, 92, 93, 95, 96, 98, 100, 109,
- 113, 121, 128, 129, 132, 133, 134, 135, 136, 104,
- 128, 128, 104, 138, 98, 98, 98, 98, 98, 106,
- 145, 146, 98, 98, 98, 98, 128, 98, 98, 98,
- 98, 98, 98, 136, 129, 129, 129, 129, 20, 136,
- 136, 18, 129, 112, 30, 110, 114, 102, 68, 70,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, 84, 85, 86, 87, 88, 89, 90, 98,
- 98, 98, 69, 95, 96, 147, 129, 139, 140, 102,
- 102, 129, 145, 129, 128, 136, 139, 139, 136, 28,
- 32, 129, 139, 139, 103, 102, 103, 129, 139, 139,
- 129, 20, 129, 103, 103, 101, 71, 18, 129, 130,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
- 129, 129, 129, 129, 129, 20, 129, 129, 129, 129,
- 139, 139, 129, 105, 68, 105, 103, 102, 103, 103,
- 103, 103, 106, 146, 103, 103, 103, 103, 103, 103,
- 116, 68, 103, 103, 129, 111, 115, 129, 68, 103,
- 103, 129, 128, 113, 113, 28, 113, 103, 129, 113,
- 112, 20, 24, 28, 32, 122, 123, 125, 71, 20,
- 102, 21, 127, 100, 103, 68, 102, 124, 131, 68,
- 103, 128, 113, 117, 123, 104, 137, 129, 129, 103,
- 15, 19, 101, 118, 119, 120, 18, 105, 98, 147,
- 148, 103, 113, 133, 71, 112, 120, 105, 149, 71,
- 18, 141, 142, 143, 144, 150, 68, 20, 32, 126,
- 103, 18, 143, 100, 112, 101
-};
-
- /* EXR1[EXN] -- Symbol number of symbol that rule EXN derives. */
-static const extype_uint8 exr1[] =
-{
- 0, 107, 108, 109, 109, 111, 110, 112, 112, 113,
- 113, 114, 115, 113, 113, 113, 113, 113, 113, 113,
- 113, 116, 113, 113, 113, 113, 117, 117, 118, 119,
- 119, 120, 120, 121, 121, 122, 122, 124, 123, 125,
- 125, 125, 125, 126, 126, 127, 127, 128, 128, 129,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
- 130, 131, 129, 129, 129, 129, 129, 129, 129, 129,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
- 129, 132, 132, 133, 133, 133, 133, 133, 134, 134,
- 134, 135, 135, 136, 136, 136, 137, 137, 137, 138,
- 138, 139, 139, 140, 140, 141, 141, 141, 142, 142,
- 144, 143, 145, 145, 145, 146, 146, 147, 147, 148,
- 149, 150, 148
-};
-
- /* EXR2[EXN] -- Number of symbols on the right hand side of rule EXN. */
-static const extype_uint8 exr2[] =
-{
- 0, 2, 2, 0, 2, 0, 4, 0, 2, 3,
- 2, 0, 0, 6, 6, 5, 9, 5, 4, 6,
- 5, 0, 8, 3, 3, 3, 0, 2, 2, 1,
- 2, 3, 2, 0, 1, 1, 3, 0, 4, 1,
- 1, 1, 1, 1, 1, 0, 2, 0, 1, 3,
- 4, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 0, 0, 7, 2, 2, 2, 2, 2, 2, 4,
- 4, 4, 4, 4, 6, 8, 4, 3, 3, 4,
- 4, 4, 4, 4, 2, 2, 2, 3, 2, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 3, 1, 0, 2, 3, 0,
- 3, 0, 1, 1, 3, 0, 1, 1, 1, 3,
- 0, 3, 0, 1, 3, 2, 2, 0, 2, 1,
- 0, 0, 8
-};
-
-
-#define exerrok (exerrstatus = 0)
-#define exclearin (exchar = EXEMPTY)
-#define EXEMPTY (-2)
-#define EXEOF 0
-
-#define EXACCEPT goto exacceptlab
-#define EXABORT goto exabortlab
-#define EXERROR goto exerrorlab
-
-
-#define EXRECOVERING() (!!exerrstatus)
-
-#define EXBACKUP(Token, Value) \
-do \
- if (exchar == EXEMPTY) \
- { \
- exchar = (Token); \
- exlval = (Value); \
- EXPOPSTACK (exlen); \
- exstate = *exssp; \
- goto exbackup; \
- } \
- else \
- { \
- exerror (EX_("syntax error: cannot back up")); \
- EXERROR; \
- } \
-while (0)
-
-/* Error token number */
-#define EXTERROR 1
-#define EXERRCODE 256
-
-
-
-/* Enable debugging if requested. */
-#if EXDEBUG
-
-# ifndef EXFPRINTF
-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-# define EXFPRINTF sfprintf
-# endif
-
-# define EXDPRINTF(Args) \
-do { \
- if (exdebug) \
- EXFPRINTF Args; \
-} while (0)
-
-/* This macro is provided for backward compatibility. */
-#ifndef EX_LOCATION_PRINT
-# define EX_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-# define EX_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (exdebug) \
- { \
- EXFPRINTF (sfstderr, "%s ", Title); \
- ex_symbol_print (sfstderr, \
- Type, Value); \
- EXFPRINTF (sfstderr, "\n"); \
- } \
-} while (0)
-
-
-/*----------------------------------------.
-| Print this symbol's value on EXOUTPUT. |
-`----------------------------------------*/
-
-static void
-ex_symbol_value_print (Sfio_t *exoutput, int extype, EXSTYPE const * const exvaluep)
-{
- Sfio_t *exo = exoutput;
- EXUSE (exo);
- if (!exvaluep)
- return;
-# ifdef EXPRINT
- if (extype < EXNTOKENS)
- EXPRINT (exoutput, extoknum[extype], *exvaluep);
-# endif
- EXUSE (extype);
-}
-
-
-/*--------------------------------.
-| Print this symbol on EXOUTPUT. |
-`--------------------------------*/
-
-static void
-ex_symbol_print (Sfio_t *exoutput, int extype, EXSTYPE const * const exvaluep)
-{
- EXFPRINTF (exoutput, "%s %s (",
- extype < EXNTOKENS ? "token" : "nterm", extname[extype]);
-
- ex_symbol_value_print (exoutput, extype, exvaluep);
- EXFPRINTF (exoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| ex_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-static void
-ex_stack_print (extype_int16 *exbottom, extype_int16 *extop)
-{
- EXFPRINTF (sfstderr, "Stack now");
- for (; exbottom <= extop; exbottom++)
- {
- int exbot = *exbottom;
- EXFPRINTF (sfstderr, " %d", exbot);
- }
- EXFPRINTF (sfstderr, "\n");
-}
-
-# define EX_STACK_PRINT(Bottom, Top) \
-do { \
- if (exdebug) \
- ex_stack_print ((Bottom), (Top)); \
-} while (0)
-
-
-/*------------------------------------------------.
-| Report that the EXRULE is going to be reduced. |
-`------------------------------------------------*/
-
-static void
-ex_reduce_print (extype_int16 *exssp, EXSTYPE *exvsp, int exrule)
-{
- unsigned long int exlno = exrline[exrule];
- int exnrhs = exr2[exrule];
- int exi;
- EXFPRINTF (sfstderr, "Reducing stack by rule %d (line %lu):\n",
- exrule - 1, exlno);
- /* The symbols being reduced. */
- for (exi = 0; exi < exnrhs; exi++)
- {
- EXFPRINTF (sfstderr, " $%d = ", exi + 1);
- ex_symbol_print (sfstderr,
- exstos[exssp[exi + 1 - exnrhs]],
- &(exvsp[(exi + 1) - (exnrhs)])
- );
- EXFPRINTF (sfstderr, "\n");
- }
-}
-
-# define EX_REDUCE_PRINT(Rule) \
-do { \
- if (exdebug) \
- ex_reduce_print (exssp, exvsp, Rule); \
-} while (0)
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int exdebug;
-#else /* !EXDEBUG */
-# define EXDPRINTF(Args)
-# define EX_SYMBOL_PRINT(Title, Type, Value, Location)
-# define EX_STACK_PRINT(Bottom, Top)
-# define EX_REDUCE_PRINT(Rule)
-#endif /* !EXDEBUG */
-
-
-/* EXINITDEPTH -- initial size of the parser's stacks. */
-#ifndef EXINITDEPTH
-# define EXINITDEPTH 200
-#endif
-
-/* EXMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- EXSTACK_ALLOC_MAXIMUM < EXSTACK_BYTES (EXMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef EXMAXDEPTH
-# define EXMAXDEPTH 10000
-#endif
-
-
-#if EXERROR_VERBOSE
-
-# ifndef exstrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define exstrlen strlen
-# else
-/* Return the length of EXSTR. */
-static EXSIZE_T
-exstrlen (const char *exstr)
-{
- EXSIZE_T exlen;
- for (exlen = 0; exstr[exlen]; exlen++)
- continue;
- return exlen;
-}
-# endif
-# endif
-
-# ifndef exstpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define exstpcpy stpcpy
-# else
-/* Copy EXSRC to EXDEST, returning the address of the terminating '\0' in
- EXDEST. */
-static char *
-exstpcpy (char *exdest, const char *exsrc)
-{
- char *exd = exdest;
- const char *exs = exsrc;
-
- while ((*exd++ = *exs++) != '\0')
- continue;
-
- return exd - 1;
-}
-# endif
-# endif
-
-# ifndef extnamerr
-/* Copy to EXRES the contents of EXSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for exerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). EXSTR is taken from extname. If EXRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static EXSIZE_T
-extnamerr (char *exres, const char *exstr)
-{
- if (*exstr == '"')
- {
- EXSIZE_T exn = 0;
- char const *exp = exstr;
-
- for (;;)
- switch (*++exp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++exp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (exres)
- exres[exn] = *exp;
- exn++;
- break;
-
- case '"':
- if (exres)
- exres[exn] = '\0';
- return exn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! exres)
- return exstrlen (exstr);
-
- return exstpcpy (exres, exstr) - exres;
-}
-# endif
-
-/* Copy into *EXMSG, which is of size *EXMSG_ALLOC, an error message
- about the unexpected token EXTOKEN for the state stack whose top is
- EXSSP.
-
- Return 0 if *EXMSG was successfully written. Return 1 if *EXMSG is
- not large enough to hold the message. In that case, also set
- *EXMSG_ALLOC to the required number of bytes. Return 2 if the
- required number of bytes is too large to store. */
-static int
-exsyntax_error (EXSIZE_T *exmsg_alloc, char **exmsg,
- extype_int16 *exssp, int extoken)
-{
- EXSIZE_T exsize0 = extnamerr (EX_NULLPTR, extname[extoken]);
- EXSIZE_T exsize = exsize0;
- enum { EXERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- /* Internationalized format string. */
- const char *exformat = EX_NULLPTR;
- /* Arguments of exformat. */
- char const *exarg[EXERROR_VERBOSE_ARGS_MAXIMUM];
- /* Number of reported tokens (one for the "unexpected", one per
- "expected"). */
- int excount = 0;
-
- /* There are many possibilities here to consider:
- - If this state is a consistent state with a default action, then
- the only way this function was invoked is if the default action
- is an error action. In that case, don't check for expected
- tokens because there are none.
- - The only way there can be no lookahead present (in exchar) is if
- this state is a consistent state with a default action. Thus,
- detecting the absence of a lookahead is sufficient to determine
- that there is no unexpected or expected token to report. In that
- case, just report a simple "syntax error".
- - Don't assume there isn't a lookahead just because this state is a
- consistent state with a default action. There might have been a
- previous inconsistent state, consistent state with a non-default
- action, or user semantic action that manipulated exchar.
- - Of course, the expected token list depends on states to have
- correct lookahead information, and it depends on the parser not
- to perform extra reductions after fetching a lookahead from the
- scanner and before detecting a syntax error. Thus, state merging
- (from LALR or IELR) and default reductions corrupt the expected
- token list. However, the list is correct for canonical LR with
- one exception: it will still contain any token that will not be
- accepted due to an error action in a later state.
- */
- if (extoken != EXEMPTY)
- {
- int exn = expact[*exssp];
- exarg[excount++] = extname[extoken];
- if (!expact_value_is_default (exn))
- {
- /* Start EXX at -EXN if negative to avoid negative indexes in
- EXCHECK. In other words, skip the first -EXN actions for
- this state because they are default actions. */
- int exxbegin = exn < 0 ? -exn : 0;
- /* Stay within bounds of both excheck and extname. */
- int exchecklim = EXLAST - exn + 1;
- int exxend = exchecklim < EXNTOKENS ? exchecklim : EXNTOKENS;
- int exx;
-
- for (exx = exxbegin; exx < exxend; ++exx)
- if (excheck[exx + exn] == exx && exx != EXTERROR
- && !extable_value_is_error (extable[exx + exn]))
- {
- if (excount == EXERROR_VERBOSE_ARGS_MAXIMUM)
- {
- excount = 1;
- exsize = exsize0;
- break;
- }
- exarg[excount++] = extname[exx];
- {
- EXSIZE_T exsize1 = exsize + extnamerr (EX_NULLPTR, extname[exx]);
- if (! (exsize <= exsize1
- && exsize1 <= EXSTACK_ALLOC_MAXIMUM))
- return 2;
- exsize = exsize1;
- }
- }
- }
- }
-
- switch (excount)
- {
-# define EXCASE_(N, S) \
- case N: \
- exformat = S; \
- break
- EXCASE_(0, EX_("syntax error"));
- EXCASE_(1, EX_("syntax error, unexpected %s"));
- EXCASE_(2, EX_("syntax error, unexpected %s, expecting %s"));
- EXCASE_(3, EX_("syntax error, unexpected %s, expecting %s or %s"));
- EXCASE_(4, EX_("syntax error, unexpected %s, expecting %s or %s or %s"));
- EXCASE_(5, EX_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef EXCASE_
- }
-
- {
- EXSIZE_T exsize1 = exsize + exstrlen (exformat);
- if (! (exsize <= exsize1 && exsize1 <= EXSTACK_ALLOC_MAXIMUM))
- return 2;
- exsize = exsize1;
- }
-
- if (*exmsg_alloc < exsize)
- {
- *exmsg_alloc = 2 * exsize;
- if (! (exsize <= *exmsg_alloc
- && *exmsg_alloc <= EXSTACK_ALLOC_MAXIMUM))
- *exmsg_alloc = EXSTACK_ALLOC_MAXIMUM;
- return 1;
- }
-
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- {
- char *exp = *exmsg;
- int exi = 0;
- while ((*exp = *exformat) != '\0')
- if (*exp == '%' && exformat[1] == 's' && exi < excount)
- {
- exp += extnamerr (exp, exarg[exi++]);
- exformat += 2;
- }
- else
- {
- exp++;
- exformat++;
- }
- }
- return 0;
-}
-#endif /* EXERROR_VERBOSE */
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-static void
-exdestruct (const char *exmsg, int extype, EXSTYPE *exvaluep)
-{
- EXUSE (exvaluep);
- if (!exmsg)
- exmsg = "Deleting";
- EX_SYMBOL_PRINT (exmsg, extype, exvaluep, exlocationp);
-
- EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- EXUSE (extype);
- EX_IGNORE_MAYBE_UNINITIALIZED_END
-}
-
-
-
-
-/* The lookahead symbol. */
-int exchar;
-
-/* The semantic value of the lookahead symbol. */
-EXSTYPE exlval;
-/* Number of syntax errors so far. */
-int exnerrs;
-
-
-/*----------.
-| exparse. |
-`----------*/
-
-int
-exparse (void)
-{
- int exstate;
- /* Number of tokens to shift before error messages enabled. */
- int exerrstatus;
-
- /* The stacks and their tools:
- 'exss': related to states.
- 'exvs': related to semantic values.
-
- Refer to the stacks through separate pointers, to allow exoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- extype_int16 exssa[EXINITDEPTH];
- extype_int16 *exss;
- extype_int16 *exssp;
-
- /* The semantic value stack. */
- EXSTYPE exvsa[EXINITDEPTH];
- EXSTYPE *exvs;
- EXSTYPE *exvsp;
-
- EXSIZE_T exstacksize;
-
- int exn;
- int exresult;
- /* Lookahead token as an internal (translated) token number. */
- int extoken = 0;
- /* The variables used to return semantic value and location from the
- action routines. */
- EXSTYPE exval;
-
-#if EXERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char exmsgbuf[128];
- char *exmsg = exmsgbuf;
- EXSIZE_T exmsg_alloc = sizeof exmsgbuf;
-#endif
-
-#define EXPOPSTACK(N) (exvsp -= (N), exssp -= (N))
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int exlen = 0;
-
- exssp = exss = exssa;
- exvsp = exvs = exvsa;
- exstacksize = EXINITDEPTH;
-
- EXDPRINTF ((sfstderr, "Starting parse\n"));
-
- exstate = 0;
- exerrstatus = 0;
- exnerrs = 0;
- exchar = EXEMPTY; /* Cause a token to be read. */
- goto exsetstate;
-
-/*------------------------------------------------------------.
-| exnewstate -- Push a new state, which is found in exstate. |
-`------------------------------------------------------------*/
- exnewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- exssp++;
-
- exsetstate:
- *exssp = exstate;
-
- if (exss + exstacksize - 1 <= exssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- EXSIZE_T exsize = exssp - exss + 1;
-
-#ifdef exoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- EXSTYPE *exvs1 = exvs;
- extype_int16 *exss1 = exss;
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if exoverflow is a macro. */
- exoverflow (EX_("memory exhausted"),
- &exss1, exsize * sizeof (*exssp),
- &exvs1, exsize * sizeof (*exvsp),
- &exstacksize);
-
- exss = exss1;
- exvs = exvs1;
- }
-#else /* no exoverflow */
-# ifndef EXSTACK_RELOCATE
- goto exexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (EXMAXDEPTH <= exstacksize)
- goto exexhaustedlab;
- exstacksize *= 2;
- if (EXMAXDEPTH < exstacksize)
- exstacksize = EXMAXDEPTH;
-
- {
- extype_int16 *exss1 = exss;
- union exalloc *exptr =
- (union exalloc *) EXSTACK_ALLOC (EXSTACK_BYTES (exstacksize));
- if (! exptr)
- goto exexhaustedlab;
- EXSTACK_RELOCATE (exss_alloc, exss);
- EXSTACK_RELOCATE (exvs_alloc, exvs);
-# undef EXSTACK_RELOCATE
- if (exss1 != exssa)
- EXSTACK_FREE (exss1);
- }
-# endif
-#endif /* no exoverflow */
-
- exssp = exss + exsize - 1;
- exvsp = exvs + exsize - 1;
-
- EXDPRINTF ((sfstderr, "Stack size increased to %lu\n",
- (unsigned long int) exstacksize));
-
- if (exss + exstacksize - 1 <= exssp)
- EXABORT;
- }
-
- EXDPRINTF ((sfstderr, "Entering state %d\n", exstate));
-
- if (exstate == EXFINAL)
- EXACCEPT;
-
- goto exbackup;
-
-/*-----------.
-| exbackup. |
-`-----------*/
-exbackup:
-
- /* Do appropriate processing given the current state. Read a
- lookahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to lookahead token. */
- exn = expact[exstate];
- if (expact_value_is_default (exn))
- goto exdefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* EXCHAR is either EXEMPTY or EXEOF or a valid lookahead symbol. */
- if (exchar == EXEMPTY)
- {
- EXDPRINTF ((sfstderr, "Reading a token: "));
- exchar = exlex ();
- }
-
- if (exchar <= EXEOF)
- {
- exchar = extoken = EXEOF;
- EXDPRINTF ((sfstderr, "Now at end of input.\n"));
- }
- else
- {
- extoken = EXTRANSLATE (exchar);
- EX_SYMBOL_PRINT ("Next token is", extoken, &exlval, &exlloc);
- }
-
- /* If the proper action on seeing token EXTOKEN is to reduce or to
- detect an error, take that action. */
- exn += extoken;
- if (exn < 0 || EXLAST < exn || excheck[exn] != extoken)
- goto exdefault;
- exn = extable[exn];
- if (exn <= 0)
- {
- if (extable_value_is_error (exn))
- goto exerrlab;
- exn = -exn;
- goto exreduce;
- }
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (exerrstatus)
- exerrstatus--;
-
- /* Shift the lookahead token. */
- EX_SYMBOL_PRINT ("Shifting", extoken, &exlval, &exlloc);
-
- /* Discard the shifted token. */
- exchar = EXEMPTY;
-
- exstate = exn;
- EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- *++exvsp = exlval;
- EX_IGNORE_MAYBE_UNINITIALIZED_END
-
- goto exnewstate;
-
-
-/*-----------------------------------------------------------.
-| exdefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-exdefault:
- exn = exdefact[exstate];
- if (exn == 0)
- goto exerrlab;
- goto exreduce;
-
-
-/*-----------------------------.
-| exreduce -- Do a reduction. |
-`-----------------------------*/
-exreduce:
- /* exn is the number of a rule to reduce with. */
- exlen = exr2[exn];
-
- /* If EXLEN is nonzero, implement the default value of the action:
- '$$ = $1'.
-
- Otherwise, the following line sets EXVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to EXVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that EXVAL may be used uninitialized. */
- exval = exvsp[1-exlen];
-
-
- EX_REDUCE_PRINT (exn);
- switch (exn)
- {
- case 2:
-#line 175 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[-1].expr) && !(expr.program->disc->flags & EX_STRICT))
- {
- if (expr.program->main.value && !(expr.program->disc->flags & EX_RETAIN))
- exfreenode(expr.program, expr.program->main.value);
- if ((exvsp[-1].expr)->op == S2B)
- {
- Exnode_t* x;
-
- x = (exvsp[-1].expr);
- (exvsp[-1].expr) = x->data.operand.left;
- x->data.operand.left = 0;
- exfreenode(expr.program, x);
- }
- expr.program->main.lex = PROCEDURE;
- expr.program->main.value = exnewnode(expr.program, PROCEDURE, 1, (exvsp[-1].expr)->type, NiL, (exvsp[-1].expr));
- }
- }
-#line 1801 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 5:
-#line 199 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Dtdisc_t* disc;
-
- if (expr.procedure)
- exerror("no nested function definitions");
- (exvsp[-1].id)->lex = PROCEDURE;
- expr.procedure = (exvsp[-1].id)->value = exnewnode(expr.program, PROCEDURE, 1, (exvsp[-1].id)->type, NiL, NiL);
- expr.procedure->type = INTEGER;
- if (!(disc = newof(0, Dtdisc_t, 1, 0)))
- exnospace();
- disc->key = offsetof(Exid_t, name);
- if (expr.assigned && !streq((exvsp[-1].id)->name, "begin"))
- {
- if (!(expr.procedure->data.procedure.frame = dtopen(disc, Dtset)) || !dtview(expr.procedure->data.procedure.frame, expr.program->symbols))
- exnospace();
- expr.program->symbols = expr.program->frame = expr.procedure->data.procedure.frame;
- }
- }
-#line 1824 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 6:
-#line 217 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- expr.procedure = 0;
- if (expr.program->frame)
- {
- expr.program->symbols = expr.program->frame->view;
- dtview(expr.program->frame, NiL);
- expr.program->frame = 0;
- }
- if ((exvsp[0].expr) && (exvsp[0].expr)->op == S2B)
- {
- Exnode_t* x;
-
- x = (exvsp[0].expr);
- (exvsp[0].expr) = x->data.operand.left;
- x->data.operand.left = 0;
- exfreenode(expr.program, x);
- }
- (exvsp[-3].id)->value->data.operand.right = excast(expr.program, (exvsp[0].expr), (exvsp[-3].id)->type, NiL, 0);
- }
-#line 1848 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 7:
-#line 239 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 1856 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 8:
-#line 243 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (!(exvsp[-1].expr))
- (exval.expr) = (exvsp[0].expr);
- else if (!(exvsp[0].expr))
- (exval.expr) = (exvsp[-1].expr);
- else if ((exvsp[-1].expr)->op == CONSTANT)
- {
- exfreenode(expr.program, (exvsp[-1].expr));
- (exval.expr) = (exvsp[0].expr);
- }
-#ifdef UNUSED
- else if ((exvsp[-1].expr)->op == ';')
- {
- (exval.expr) = (exvsp[-1].expr);
- (exvsp[-1].expr)->data.operand.last = (exvsp[-1].expr)->data.operand.last->data.operand.right = exnewnode(expr.program, ';', 1, (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- }
- else
- {
- (exval.expr) = exnewnode(expr.program, ';', 1, (exvsp[-1].expr)->type, (exvsp[-1].expr), NiL);
- (exval.expr)->data.operand.last = (exval.expr)->data.operand.right = exnewnode(expr.program, ';', 1, (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- }
-#endif
- else (exval.expr) = exnewnode(expr.program, ';', 1, (exvsp[0].expr)->type, (exvsp[-1].expr), (exvsp[0].expr));
- }
-#line 1885 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 9:
-#line 270 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[-1].expr);
- }
-#line 1893 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 10:
-#line 274 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = ((exvsp[-1].expr) && (exvsp[-1].expr)->type == STRING) ? exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-1].expr), NiL) : (exvsp[-1].expr);
- }
-#line 1901 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 11:
-#line 277 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.instatic=(exvsp[0].integer);}
-#line 1907 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 12:
-#line 277 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.declare=(exvsp[0].id)->type;}
-#line 1913 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 13:
-#line 278 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[-1].expr);
- expr.declare = 0;
- }
-#line 1922 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 14:
-#line 283 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (exisAssign ((exvsp[-3].expr)))
- exwarn ("assignment used as boolean in if statement");
- if ((exvsp[-3].expr)->type == STRING)
- (exvsp[-3].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-3].expr), NiL);
- else if (!INTEGRAL((exvsp[-3].expr)->type))
- (exvsp[-3].expr) = excast(expr.program, (exvsp[-3].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, (exvsp[-5].id)->index, 1, INTEGER, (exvsp[-3].expr), exnewnode(expr.program, ':', 1, (exvsp[-1].expr) ? (exvsp[-1].expr)->type : 0, (exvsp[-1].expr), (exvsp[0].expr)));
- }
-#line 1936 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 15:
-#line 293 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ITERATE, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.generate.array = (exvsp[-2].expr);
- if (!(exvsp[-2].expr)->data.variable.index || (exvsp[-2].expr)->data.variable.index->op != DYNAMIC)
- exerror("simple index variable expected");
- (exval.expr)->data.generate.index = (exvsp[-2].expr)->data.variable.index->data.variable.symbol;
- if ((exvsp[-2].expr)->op == ID && (exval.expr)->data.generate.index->type != INTEGER)
- exerror("integer index variable expected");
- exfreenode(expr.program, (exvsp[-2].expr)->data.variable.index);
- (exvsp[-2].expr)->data.variable.index = 0;
- (exval.expr)->data.generate.statement = (exvsp[0].expr);
- }
-#line 1953 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 16:
-#line 306 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (!(exvsp[-4].expr))
- {
- (exvsp[-4].expr) = exnewnode(expr.program, CONSTANT, 0, INTEGER, NiL, NiL);
- (exvsp[-4].expr)->data.constant.value.integer = 1;
- }
- else if ((exvsp[-4].expr)->type == STRING)
- (exvsp[-4].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-4].expr), NiL);
- else if (!INTEGRAL((exvsp[-4].expr)->type))
- (exvsp[-4].expr) = excast(expr.program, (exvsp[-4].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, (exvsp[-8].id)->index, 1, INTEGER, (exvsp[-4].expr), exnewnode(expr.program, ';', 1, 0, (exvsp[-2].expr), (exvsp[0].expr)));
- if ((exvsp[-6].expr))
- (exval.expr) = exnewnode(expr.program, ';', 1, INTEGER, (exvsp[-6].expr), (exval.expr));
- }
-#line 1972 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 17:
-#line 321 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ITERATER, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.generate.array = (exvsp[-2].expr);
- if (!(exvsp[-2].expr)->data.variable.index || (exvsp[-2].expr)->data.variable.index->op != DYNAMIC)
- exerror("simple index variable expected");
- (exval.expr)->data.generate.index = (exvsp[-2].expr)->data.variable.index->data.variable.symbol;
- if ((exvsp[-2].expr)->op == ID && (exval.expr)->data.generate.index->type != INTEGER)
- exerror("integer index variable expected");
- exfreenode(expr.program, (exvsp[-2].expr)->data.variable.index);
- (exvsp[-2].expr)->data.variable.index = 0;
- (exval.expr)->data.generate.statement = (exvsp[0].expr);
- }
-#line 1989 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 18:
-#line 334 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[-1].id)->local.pointer == 0)
- exerror("cannot apply unset to non-array %s", (exvsp[-1].id)->name);
- (exval.expr) = exnewnode(expr.program, UNSET, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[-1].id);
- (exval.expr)->data.variable.index = NiL;
- }
-#line 2001 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 19:
-#line 342 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[-3].id)->local.pointer == 0)
- exerror("cannot apply unset to non-array %s", (exvsp[-3].id)->name);
- if (((exvsp[-3].id)->index_type > 0) && ((exvsp[-1].expr)->type != (exvsp[-3].id)->index_type))
- exerror("%s indices must have type %s, not %s",
- (exvsp[-3].id)->name, extypename(expr.program, (exvsp[-3].id)->index_type),extypename(expr.program, (exvsp[-1].expr)->type));
- (exval.expr) = exnewnode(expr.program, UNSET, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[-3].id);
- (exval.expr)->data.variable.index = (exvsp[-1].expr);
- }
-#line 2016 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 20:
-#line 353 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (exisAssign ((exvsp[-2].expr)))
- exwarn ("assignment used as boolean in while statement");
- if ((exvsp[-2].expr)->type == STRING)
- (exvsp[-2].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-2].expr), NiL);
- else if (!INTEGRAL((exvsp[-2].expr)->type))
- (exvsp[-2].expr) = excast(expr.program, (exvsp[-2].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, (exvsp[-4].id)->index, 1, INTEGER, (exvsp[-2].expr), exnewnode(expr.program, ';', 1, 0, NiL, (exvsp[0].expr)));
- }
-#line 2030 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 21:
-#line 362 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.declare=(exvsp[0].expr)->type;}
-#line 2036 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 22:
-#line 363 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Switch_t* sw = expr.swstate;
-
- (exval.expr) = exnewnode(expr.program, (exvsp[-7].id)->index, 1, INTEGER, (exvsp[-5].expr), exnewnode(expr.program, DEFAULT, 1, 0, sw->defcase, sw->firstcase));
- expr.swstate = expr.swstate->prev;
- if (sw->base)
- free(sw->base);
- if (sw != &swstate)
- free(sw);
- expr.declare = 0;
- }
-#line 2052 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 23:
-#line 375 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- loopop:
- if (!(exvsp[-1].expr))
- {
- (exvsp[-1].expr) = exnewnode(expr.program, CONSTANT, 0, INTEGER, NiL, NiL);
- (exvsp[-1].expr)->data.constant.value.integer = 1;
- }
- else if (!INTEGRAL((exvsp[-1].expr)->type))
- (exvsp[-1].expr) = excast(expr.program, (exvsp[-1].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, (exvsp[-2].id)->index, 1, INTEGER, (exvsp[-1].expr), NiL);
- }
-#line 2068 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 24:
-#line 387 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto loopop;
- }
-#line 2076 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 25:
-#line 391 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[-1].expr))
- {
- if (expr.procedure && !expr.procedure->type)
- exerror("return in void function");
- (exvsp[-1].expr) = excast(expr.program, (exvsp[-1].expr), expr.procedure ? expr.procedure->type : INTEGER, NiL, 0);
- }
- (exval.expr) = exnewnode(expr.program, RETURN, 1, (exvsp[-1].expr) ? (exvsp[-1].expr)->type : 0, (exvsp[-1].expr), NiL);
- }
-#line 2090 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 26:
-#line 403 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Switch_t* sw;
- int n;
-
- if (expr.swstate)
- {
- if (!(sw = newof(0, Switch_t, 1, 0)))
- {
- exnospace();
- sw = &swstate;
- }
- sw->prev = expr.swstate;
- }
- else
- sw = &swstate;
- expr.swstate = sw;
- sw->type = expr.declare;
- sw->firstcase = 0;
- sw->lastcase = 0;
- sw->defcase = 0;
- sw->def = 0;
- n = 8;
- if (!(sw->base = newof(0, Extype_t*, n, 0)))
- {
- exnospace();
- n = 0;
- }
- sw->cur = sw->base;
- sw->last = sw->base + n;
- }
-#line 2125 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 28:
-#line 437 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Switch_t* sw = expr.swstate;
- int n;
-
- (exval.expr) = exnewnode(expr.program, CASE, 1, 0, (exvsp[0].expr), NiL);
- if (sw->cur > sw->base)
- {
- if (sw->lastcase)
- sw->lastcase->data.select.next = (exval.expr);
- else
- sw->firstcase = (exval.expr);
- sw->lastcase = (exval.expr);
- n = sw->cur - sw->base;
- sw->cur = sw->base;
- (exval.expr)->data.select.constant = (Extype_t**)exalloc(expr.program, (n + 1) * sizeof(Extype_t*));
- memcpy((exval.expr)->data.select.constant, sw->base, n * sizeof(Extype_t*));
- (exval.expr)->data.select.constant[n] = 0;
- }
- else
- (exval.expr)->data.select.constant = 0;
- if (sw->def)
- {
- sw->def = 0;
- if (sw->defcase)
- exerror("duplicate default in switch");
- else
- sw->defcase = (exvsp[0].expr);
- }
- }
-#line 2159 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 31:
-#line 473 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- int n;
-
- if (expr.swstate->cur >= expr.swstate->last)
- {
- n = expr.swstate->cur - expr.swstate->base;
- if (!(expr.swstate->base = newof(expr.swstate->base, Extype_t*, 2 * n, 0)))
- {
- exerror("too many case labels for switch");
- n = 0;
- }
- expr.swstate->cur = expr.swstate->base + n;
- expr.swstate->last = expr.swstate->base + 2 * n;
- }
- if (expr.swstate->cur)
- {
- (exvsp[-1].expr) = excast(expr.program, (exvsp[-1].expr), expr.swstate->type, NiL, 0);
- *expr.swstate->cur++ = &((exvsp[-1].expr)->data.constant.value);
- }
- }
-#line 2184 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 32:
-#line 494 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- expr.swstate->def = 1;
- }
-#line 2192 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 33:
-#line 500 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.integer) = 0;
- }
-#line 2200 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 34:
-#line 504 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.integer) = 1;
- }
-#line 2208 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 36:
-#line 511 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[0].expr))
- (exval.expr) = (exvsp[-2].expr) ? exnewnode(expr.program, ',', 1, (exvsp[0].expr)->type, (exvsp[-2].expr), (exvsp[0].expr)) : (exvsp[0].expr);
- }
-#line 2217 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 37:
-#line 517 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {checkName ((exvsp[0].id)); expr.id=(exvsp[0].id);}
-#line 2223 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 38:
-#line 518 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- if (!(exvsp[-3].id)->type || expr.declare)
- (exvsp[-3].id)->type = expr.declare;
- if ((exvsp[0].expr) && (exvsp[0].expr)->op == PROCEDURE)
- {
- (exvsp[-3].id)->lex = PROCEDURE;
- (exvsp[-3].id)->type = (exvsp[0].expr)->type;
- (exvsp[-3].id)->value = (exvsp[0].expr);
- }
- else
- {
- (exvsp[-3].id)->lex = DYNAMIC;
- (exvsp[-3].id)->value = exnewnode(expr.program, 0, 0, 0, NiL, NiL);
- if ((exvsp[-1].integer) && !(exvsp[-3].id)->local.pointer)
- {
- Dtdisc_t* disc;
-
- if (!(disc = newof(0, Dtdisc_t, 1, 0)))
- exnospace();
- if ((exvsp[-1].integer) == INTEGER) {
- disc->key = offsetof(Exassoc_t, key);
- disc->size = sizeof(Extype_t);
- disc->comparf = (Dtcompar_f)cmpKey;
- }
- else
- disc->key = offsetof(Exassoc_t, name);
- if (!((exvsp[-3].id)->local.pointer = (char*)dtopen(disc, Dtoset)))
- exerror("%s: cannot initialize associative array", (exvsp[-3].id)->name);
- (exvsp[-3].id)->index_type = (exvsp[-1].integer); /* -1 indicates no typechecking */
- }
- if ((exvsp[0].expr))
- {
- if ((exvsp[0].expr)->type != (exvsp[-3].id)->type)
- {
- (exvsp[0].expr)->type = (exvsp[-3].id)->type;
- (exvsp[0].expr)->data.operand.right = excast(expr.program, (exvsp[0].expr)->data.operand.right, (exvsp[-3].id)->type, NiL, 0);
- }
- (exvsp[0].expr)->data.operand.left = exnewnode(expr.program, DYNAMIC, 0, (exvsp[-3].id)->type, NiL, NiL);
- (exvsp[0].expr)->data.operand.left->data.variable.symbol = (exvsp[-3].id);
- (exval.expr) = (exvsp[0].expr);
-#if UNUSED
- if (!expr.program->frame && !expr.program->errors)
- {
- expr.assigned++;
- exeval(expr.program, (exval.expr), NiL);
- }
-#endif
- }
- else if (!(exvsp[-1].integer))
- (exvsp[-3].id)->value->data.value = exzero((exvsp[-3].id)->type);
- }
- }
-#line 2281 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 45:
-#line 584 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 2289 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 46:
-#line 588 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[0].expr);
- }
-#line 2297 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 47:
-#line 594 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 2305 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 49:
-#line 601 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[-1].expr);
- }
-#line 2313 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 50:
-#line 605 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = ((exvsp[0].expr)->type == (exvsp[-2].id)->type) ? (exvsp[0].expr) : excast(expr.program, (exvsp[0].expr), (exvsp[-2].id)->type, NiL, 0);
- }
-#line 2321 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 51:
-#line 609 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- int rel;
-
- relational:
- rel = INTEGER;
- goto coerce;
- binary:
- rel = 0;
- coerce:
- if (!(exvsp[-2].expr)->type)
- {
- if (!(exvsp[0].expr)->type)
- (exvsp[-2].expr)->type = (exvsp[0].expr)->type = rel ? STRING : INTEGER;
- else
- (exvsp[-2].expr)->type = (exvsp[0].expr)->type;
- }
- else if (!(exvsp[0].expr)->type)
- (exvsp[0].expr)->type = (exvsp[-2].expr)->type;
- if ((exvsp[-2].expr)->type != (exvsp[0].expr)->type)
- {
- if ((exvsp[-2].expr)->type == STRING)
- (exvsp[-2].expr) = excast(expr.program, (exvsp[-2].expr), (exvsp[0].expr)->type, (exvsp[0].expr), 0);
- else if ((exvsp[0].expr)->type == STRING)
- (exvsp[0].expr) = excast(expr.program, (exvsp[0].expr), (exvsp[-2].expr)->type, (exvsp[-2].expr), 0);
- else if ((exvsp[-2].expr)->type == FLOATING)
- (exvsp[0].expr) = excast(expr.program, (exvsp[0].expr), FLOATING, (exvsp[-2].expr), 0);
- else if ((exvsp[0].expr)->type == FLOATING)
- (exvsp[-2].expr) = excast(expr.program, (exvsp[-2].expr), FLOATING, (exvsp[0].expr), 0);
- }
- if (!rel)
- rel = ((exvsp[-2].expr)->type == STRING) ? STRING : (((exvsp[-2].expr)->type == UNSIGNED) ? UNSIGNED : (exvsp[0].expr)->type);
- (exval.expr) = exnewnode(expr.program, (exvsp[-1].op), 1, rel, (exvsp[-2].expr), (exvsp[0].expr));
- if (!expr.program->errors && (exvsp[-2].expr)->op == CONSTANT && (exvsp[0].expr)->op == CONSTANT)
- {
- (exval.expr)->data.constant.value = exeval(expr.program, (exval.expr), NiL);
- /* If a constant string, re-allocate from program heap. This is because the
- * value was constructed from string operators, which create a value in the
- * temporary heap, which is cleared when exeval is called again.
- */
- if ((exval.expr)->type == STRING) {
- (exval.expr)->data.constant.value.string =
- vmstrdup(expr.program->vm, (exval.expr)->data.constant.value.string);
- }
- (exval.expr)->binary = 0;
- (exval.expr)->op = CONSTANT;
- exfreenode(expr.program, (exvsp[-2].expr));
- exfreenode(expr.program, (exvsp[0].expr));
- }
- else if (!BUILTIN((exvsp[-2].expr)->type) || !BUILTIN((exvsp[0].expr)->type)) {
- checkBinary(expr.program, (exvsp[-2].expr), (exval.expr), (exvsp[0].expr));
- }
- }
-#line 2378 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 52:
-#line 662 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2386 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 53:
-#line 666 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2394 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 54:
-#line 670 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2402 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 55:
-#line 674 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2410 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 56:
-#line 678 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2418 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 57:
-#line 682 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2426 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 58:
-#line 686 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto relational;
- }
-#line 2434 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 59:
-#line 690 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto relational;
- }
-#line 2442 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 60:
-#line 694 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto relational;
- }
-#line 2450 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 61:
-#line 698 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto relational;
- }
-#line 2458 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 62:
-#line 702 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto relational;
- }
-#line 2466 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 63:
-#line 706 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2474 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 64:
-#line 710 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2482 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 65:
-#line 714 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2490 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 66:
-#line 718 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto binary;
- }
-#line 2498 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 67:
-#line 722 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- logical:
- if ((exvsp[-2].expr)->type == STRING)
- (exvsp[-2].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-2].expr), NiL);
- else if (!BUILTIN((exvsp[-2].expr)->type))
- (exvsp[-2].expr) = excast(expr.program, (exvsp[-2].expr), INTEGER, NiL, 0);
- if ((exvsp[0].expr)->type == STRING)
- (exvsp[0].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[0].expr), NiL);
- else if (!BUILTIN((exvsp[0].expr)->type))
- (exvsp[0].expr) = excast(expr.program, (exvsp[0].expr), INTEGER, NiL, 0);
- goto binary;
- }
-#line 2515 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 68:
-#line 735 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto logical;
- }
-#line 2523 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 69:
-#line 739 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[-2].expr)->op == CONSTANT)
- {
- exfreenode(expr.program, (exvsp[-2].expr));
- (exval.expr) = (exvsp[0].expr);
- }
- else
- (exval.expr) = exnewnode(expr.program, ',', 1, (exvsp[0].expr)->type, (exvsp[-2].expr), (exvsp[0].expr));
- }
-#line 2537 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 70:
-#line 748 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.nolabel=1;}
-#line 2543 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 71:
-#line 748 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.nolabel=0;}
-#line 2549 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 72:
-#line 749 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (!(exvsp[-3].expr)->type)
- {
- if (!(exvsp[0].expr)->type)
- (exvsp[-3].expr)->type = (exvsp[0].expr)->type = INTEGER;
- else
- (exvsp[-3].expr)->type = (exvsp[0].expr)->type;
- }
- else if (!(exvsp[0].expr)->type)
- (exvsp[0].expr)->type = (exvsp[-3].expr)->type;
- if ((exvsp[-6].expr)->type == STRING)
- (exvsp[-6].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[-6].expr), NiL);
- else if (!INTEGRAL((exvsp[-6].expr)->type))
- (exvsp[-6].expr) = excast(expr.program, (exvsp[-6].expr), INTEGER, NiL, 0);
- if ((exvsp[-3].expr)->type != (exvsp[0].expr)->type)
- {
- if ((exvsp[-3].expr)->type == STRING || (exvsp[0].expr)->type == STRING)
- exerror("if statement string type mismatch");
- else if ((exvsp[-3].expr)->type == FLOATING)
- (exvsp[0].expr) = excast(expr.program, (exvsp[0].expr), FLOATING, NiL, 0);
- else if ((exvsp[0].expr)->type == FLOATING)
- (exvsp[-3].expr) = excast(expr.program, (exvsp[-3].expr), FLOATING, NiL, 0);
- }
- if ((exvsp[-6].expr)->op == CONSTANT)
- {
- if ((exvsp[-6].expr)->data.constant.value.integer)
- {
- (exval.expr) = (exvsp[-3].expr);
- exfreenode(expr.program, (exvsp[0].expr));
- }
- else
- {
- (exval.expr) = (exvsp[0].expr);
- exfreenode(expr.program, (exvsp[-3].expr));
- }
- exfreenode(expr.program, (exvsp[-6].expr));
- }
- else
- (exval.expr) = exnewnode(expr.program, '?', 1, (exvsp[-3].expr)->type, (exvsp[-6].expr), exnewnode(expr.program, ':', 1, (exvsp[-3].expr)->type, (exvsp[-3].expr), (exvsp[0].expr)));
- }
-#line 2594 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 73:
-#line 790 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- iunary:
- if ((exvsp[0].expr)->type == STRING)
- (exvsp[0].expr) = exnewnode(expr.program, S2B, 1, INTEGER, (exvsp[0].expr), NiL);
- else if (!INTEGRAL((exvsp[0].expr)->type))
- (exvsp[0].expr) = excast(expr.program, (exvsp[0].expr), INTEGER, NiL, 0);
- unary:
- (exval.expr) = exnewnode(expr.program, (exvsp[-1].op), 1, (exvsp[0].expr)->type == UNSIGNED ? INTEGER : (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- if ((exvsp[0].expr)->op == CONSTANT)
- {
- (exval.expr)->data.constant.value = exeval(expr.program, (exval.expr), NiL);
- (exval.expr)->binary = 0;
- (exval.expr)->op = CONSTANT;
- exfreenode(expr.program, (exvsp[0].expr));
- }
- else if (!BUILTIN((exvsp[0].expr)->type)) {
- checkBinary(expr.program, (exvsp[0].expr), (exval.expr), 0);
- }
- }
-#line 2618 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 74:
-#line 810 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[0].id)->local.pointer == 0)
- exerror("cannot apply '#' operator to non-array %s", (exvsp[0].id)->name);
- (exval.expr) = exnewnode(expr.program, '#', 0, INTEGER, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[0].id);
- }
-#line 2629 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 75:
-#line 817 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto iunary;
- }
-#line 2637 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 76:
-#line 821 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto unary;
- }
-#line 2645 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 77:
-#line 825 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[0].expr);
- }
-#line 2653 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 78:
-#line 829 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ADDRESS, 0, T((exvsp[0].expr)->type), (exvsp[0].expr), NiL);
- }
-#line 2661 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 79:
-#line 833 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ARRAY, 1, T((exvsp[-3].id)->type), call(0, (exvsp[-3].id), (exvsp[-1].expr)), (exvsp[-1].expr));
- }
-#line 2669 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 80:
-#line 837 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, FUNCTION, 1, T((exvsp[-3].id)->type), call(0, (exvsp[-3].id), (exvsp[-1].expr)), (exvsp[-1].expr));
-#ifdef UNUSED
- if (!expr.program->disc->getf)
- exerror("%s: function references not supported", (exval.expr)->data.operand.left->data.variable.symbol->name);
- else if (expr.program->disc->reff)
- (*expr.program->disc->reff)(expr.program, (exval.expr)->data.operand.left, (exval.expr)->data.operand.left->data.variable.symbol, 0, NiL, EX_CALL, expr.program->disc);
-#endif
- }
-#line 2683 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 81:
-#line 847 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewsub (expr.program, (exvsp[-1].expr), GSUB);
- }
-#line 2691 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 82:
-#line 851 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewsub (expr.program, (exvsp[-1].expr), SUB);
- }
-#line 2699 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 83:
-#line 855 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewsubstr (expr.program, (exvsp[-1].expr));
- }
-#line 2707 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 84:
-#line 859 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewsplit (expr.program, (exvsp[-5].id)->index, (exvsp[-1].id), (exvsp[-3].expr), NiL);
- }
-#line 2715 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 85:
-#line 863 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewsplit (expr.program, (exvsp[-7].id)->index, (exvsp[-3].id), (exvsp[-5].expr), (exvsp[-1].expr));
- }
-#line 2723 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 86:
-#line 867 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (!INTEGRAL((exvsp[-1].expr)->type))
- (exvsp[-1].expr) = excast(expr.program, (exvsp[-1].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, EXIT, 1, INTEGER, (exvsp[-1].expr), NiL);
- }
-#line 2733 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 87:
-#line 873 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, RAND, 0, FLOATING, NiL, NiL);
- }
-#line 2741 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 88:
-#line 877 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, SRAND, 0, INTEGER, NiL, NiL);
- }
-#line 2749 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 89:
-#line 881 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if (!INTEGRAL((exvsp[-1].expr)->type))
- (exvsp[-1].expr) = excast(expr.program, (exvsp[-1].expr), INTEGER, NiL, 0);
- (exval.expr) = exnewnode(expr.program, SRAND, 1, INTEGER, (exvsp[-1].expr), NiL);
- }
-#line 2759 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 90:
-#line 887 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CALL, 1, (exvsp[-3].id)->type, NiL, (exvsp[-1].expr));
- (exval.expr)->data.call.procedure = (exvsp[-3].id);
- }
-#line 2768 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 91:
-#line 892 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exprint(expr.program, (exvsp[-3].id), (exvsp[-1].expr));
- }
-#line 2776 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 92:
-#line 896 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, (exvsp[-3].id)->index, 0, (exvsp[-3].id)->type, NiL, NiL);
- if ((exvsp[-1].expr) && (exvsp[-1].expr)->data.operand.left->type == INTEGER)
- {
- (exval.expr)->data.print.descriptor = (exvsp[-1].expr)->data.operand.left;
- (exvsp[-1].expr) = (exvsp[-1].expr)->data.operand.right;
- }
- else
- switch ((exvsp[-3].id)->index)
- {
- case QUERY:
- (exval.expr)->data.print.descriptor = exnewnode(expr.program, CONSTANT, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.print.descriptor->data.constant.value.integer = 2;
- break;
- case PRINTF:
- (exval.expr)->data.print.descriptor = exnewnode(expr.program, CONSTANT, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.print.descriptor->data.constant.value.integer = 1;
- break;
- case SPRINTF:
- (exval.expr)->data.print.descriptor = 0;
- break;
- }
- (exval.expr)->data.print.args = preprint((exvsp[-1].expr));
- }
-#line 2805 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 93:
-#line 921 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Exnode_t* x;
-
- (exval.expr) = exnewnode(expr.program, (exvsp[-3].id)->index, 0, (exvsp[-3].id)->type, NiL, NiL);
- if ((exvsp[-1].expr) && (exvsp[-1].expr)->data.operand.left->type == INTEGER)
- {
- (exval.expr)->data.scan.descriptor = (exvsp[-1].expr)->data.operand.left;
- (exvsp[-1].expr) = (exvsp[-1].expr)->data.operand.right;
- }
- else
- switch ((exvsp[-3].id)->index)
- {
- case SCANF:
- (exval.expr)->data.scan.descriptor = 0;
- break;
- case SSCANF:
- if ((exvsp[-1].expr) && (exvsp[-1].expr)->data.operand.left->type == STRING)
- {
- (exval.expr)->data.scan.descriptor = (exvsp[-1].expr)->data.operand.left;
- (exvsp[-1].expr) = (exvsp[-1].expr)->data.operand.right;
- }
- else
- exerror("%s: string argument expected", (exvsp[-3].id)->name);
- break;
- }
- if (!(exvsp[-1].expr) || !(exvsp[-1].expr)->data.operand.left || (exvsp[-1].expr)->data.operand.left->type != STRING)
- exerror("%s: format argument expected", (exvsp[-3].id)->name);
- (exval.expr)->data.scan.format = (exvsp[-1].expr)->data.operand.left;
- for (x = (exval.expr)->data.scan.args = (exvsp[-1].expr)->data.operand.right; x; x = x->data.operand.right)
- {
- if (x->data.operand.left->op != ADDRESS)
- exerror("%s: address argument expected", (exvsp[-3].id)->name);
- x->data.operand.left = x->data.operand.left->data.operand.left;
- }
- }
-#line 2845 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 94:
-#line 957 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[0].expr))
- {
- if ((exvsp[-1].expr)->op == ID && !expr.program->disc->setf)
- exerror("%s: variable assignment not supported", (exvsp[-1].expr)->data.variable.symbol->name);
- else
- {
- if (!(exvsp[-1].expr)->type)
- (exvsp[-1].expr)->type = (exvsp[0].expr)->type;
-#if 0
- else if ((exvsp[0].expr)->type != (exvsp[-1].expr)->type && (exvsp[-1].expr)->type >= 0200)
-#else
- else if ((exvsp[0].expr)->type != (exvsp[-1].expr)->type)
-#endif
- {
- (exvsp[0].expr)->type = (exvsp[-1].expr)->type;
- (exvsp[0].expr)->data.operand.right = excast(expr.program, (exvsp[0].expr)->data.operand.right, (exvsp[-1].expr)->type, NiL, 0);
- }
- (exvsp[0].expr)->data.operand.left = (exvsp[-1].expr);
- (exval.expr) = (exvsp[0].expr);
- }
- }
- }
-#line 2873 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 95:
-#line 981 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- pre:
- if ((exvsp[0].expr)->type == STRING)
- exerror("++ and -- invalid for string variables");
- (exval.expr) = exnewnode(expr.program, (exvsp[-1].op), 0, (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- (exval.expr)->subop = PRE;
- }
-#line 2885 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 96:
-#line 989 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- pos:
- if ((exvsp[-1].expr)->type == STRING)
- exerror("++ and -- invalid for string variables");
- (exval.expr) = exnewnode(expr.program, (exvsp[0].op), 0, (exvsp[-1].expr)->type, (exvsp[-1].expr), NiL);
- (exval.expr)->subop = POS;
- }
-#line 2897 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 97:
-#line 997 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- if ((exvsp[0].id)->local.pointer == 0)
- exerror("cannot apply IN to non-array %s", (exvsp[0].id)->name);
- if (((exvsp[0].id)->index_type > 0) && ((exvsp[-2].expr)->type != (exvsp[0].id)->index_type))
- exerror("%s indices must have type %s, not %s",
- (exvsp[0].id)->name, extypename(expr.program, (exvsp[0].id)->index_type),extypename(expr.program, (exvsp[-2].expr)->type));
- (exval.expr) = exnewnode(expr.program, IN_OP, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[0].id);
- (exval.expr)->data.variable.index = (exvsp[-2].expr);
- }
-#line 2912 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 98:
-#line 1008 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto pre;
- }
-#line 2920 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 99:
-#line 1012 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- goto pos;
- }
-#line 2928 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 103:
-#line 1022 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CONSTANT, 0, (exvsp[0].id)->type, NiL, NiL);
- if (!expr.program->disc->reff)
- exerror("%s: identifier references not supported", (exvsp[0].id)->name);
- else
- (exval.expr)->data.constant.value = (*expr.program->disc->reff)(expr.program, (exval.expr), (exvsp[0].id), NiL, NiL, EX_SCALAR, expr.program->disc);
- }
-#line 2940 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 104:
-#line 1030 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CONSTANT, 0, FLOATING, NiL, NiL);
- (exval.expr)->data.constant.value.floating = (exvsp[0].floating);
- }
-#line 2949 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 105:
-#line 1035 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CONSTANT, 0, INTEGER, NiL, NiL);
- (exval.expr)->data.constant.value.integer = (exvsp[0].integer);
- }
-#line 2958 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 106:
-#line 1040 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CONSTANT, 0, STRING, NiL, NiL);
- (exval.expr)->data.constant.value.string = (exvsp[0].string);
- }
-#line 2967 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 107:
-#line 1045 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, CONSTANT, 0, UNSIGNED, NiL, NiL);
- (exval.expr)->data.constant.value.integer = (exvsp[0].integer);
- }
-#line 2976 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 113:
-#line 1061 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = makeVar(expr.program, (exvsp[-1].id), 0, 0, (exvsp[0].reference));
- }
-#line 2984 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 114:
-#line 1065 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- Exnode_t* n;
-
- n = exnewnode(expr.program, DYNAMIC, 0, (exvsp[-2].id)->type, NiL, NiL);
- n->data.variable.symbol = (exvsp[-2].id);
- n->data.variable.reference = 0;
- if (((n->data.variable.index = (exvsp[-1].expr)) == 0) != ((exvsp[-2].id)->local.pointer == 0))
- exerror("%s: is%s an array", (exvsp[-2].id)->name, (exvsp[-2].id)->local.pointer ? "" : " not");
- if ((exvsp[-2].id)->local.pointer && ((exvsp[-2].id)->index_type > 0)) {
- if ((exvsp[-1].expr)->type != (exvsp[-2].id)->index_type)
- exerror("%s: indices must have type %s, not %s",
- (exvsp[-2].id)->name, extypename(expr.program, (exvsp[-2].id)->index_type),extypename(expr.program, (exvsp[-1].expr)->type));
- }
- if ((exvsp[0].reference)) {
- n->data.variable.dyna =exnewnode(expr.program, 0, 0, 0, NiL, NiL);
- (exval.expr) = makeVar(expr.program, (exvsp[-2].id), (exvsp[-1].expr), n, (exvsp[0].reference));
- }
- else (exval.expr) = n;
- }
-#line 3008 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 115:
-#line 1085 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ID, 0, STRING, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[0].id);
- (exval.expr)->data.variable.reference = 0;
- (exval.expr)->data.variable.index = 0;
- (exval.expr)->data.variable.dyna = 0;
- if (!(expr.program->disc->flags & EX_UNDECLARED))
- exerror("unknown identifier");
- }
-#line 3022 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 116:
-#line 1097 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.integer) = 0;
- }
-#line 3030 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 117:
-#line 1101 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.integer) = -1;
- }
-#line 3038 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 118:
-#line 1105 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- /* If DECLARE is VOID, its type is 0, so this acts like
- * the empty case.
- */
- if (INTEGRAL((exvsp[-1].id)->type))
- (exval.integer) = INTEGER;
- else
- (exval.integer) = (exvsp[-1].id)->type;
-
- }
-#line 3053 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 119:
-#line 1118 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 3061 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 120:
-#line 1122 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[-1].expr);
- }
-#line 3069 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 121:
-#line 1128 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 3077 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 122:
-#line 1132 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = (exvsp[0].expr)->data.operand.left;
- (exvsp[0].expr)->data.operand.left = (exvsp[0].expr)->data.operand.right = 0;
- exfreenode(expr.program, (exvsp[0].expr));
- }
-#line 3087 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 123:
-#line 1140 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ',', 1, 0, exnewnode(expr.program, ',', 1, (exvsp[0].expr)->type, (exvsp[0].expr), NiL), NiL);
- (exval.expr)->data.operand.right = (exval.expr)->data.operand.left;
- }
-#line 3096 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 124:
-#line 1145 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exvsp[-2].expr)->data.operand.right = (exvsp[-2].expr)->data.operand.right->data.operand.right = exnewnode(expr.program, ',', 1, (exvsp[-2].expr)->type, (exvsp[0].expr), NiL);
- }
-#line 3104 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 125:
-#line 1151 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 3112 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 126:
-#line 1155 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- if ((exvsp[0].id)->type)
- exerror("(void) expected");
- }
-#line 3122 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 128:
-#line 1164 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ',', 1, (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- }
-#line 3130 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 129:
-#line 1168 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Exnode_t* x;
- register Exnode_t* y;
-
- (exval.expr) = (exvsp[-2].expr);
- for (x = (exvsp[-2].expr); (y = x->data.operand.right); x = y);
- x->data.operand.right = exnewnode(expr.program, ',', 1, (exvsp[0].expr)->type, (exvsp[0].expr), NiL);
- }
-#line 3143 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 130:
-#line 1178 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {expr.declare=(exvsp[0].id)->type;}
-#line 3149 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 131:
-#line 1179 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, ID, 0, (exvsp[-2].id)->type, NiL, NiL);
- (exval.expr)->data.variable.symbol = (exvsp[0].id);
- (exvsp[0].id)->lex = DYNAMIC;
- (exvsp[0].id)->type = (exvsp[-2].id)->type;
- (exvsp[0].id)->value = exnewnode(expr.program, 0, 0, 0, NiL, NiL);
- expr.procedure->data.procedure.arity++;
- expr.declare = 0;
- }
-#line 3163 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 132:
-#line 1191 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.reference) = expr.refs = expr.lastref = 0;
- }
-#line 3171 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 133:
-#line 1195 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- Exref_t* r;
-
- r = ALLOCATE(expr.program, Exref_t);
- r->symbol = (exvsp[0].id);
- expr.refs = r;
- expr.lastref = r;
- r->next = 0;
- r->index = 0;
- (exval.reference) = expr.refs;
- }
-#line 3187 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 134:
-#line 1207 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- Exref_t* r;
- Exref_t* l;
-
- r = ALLOCATE(expr.program, Exref_t);
- r->symbol = (exvsp[0].id);
- r->index = 0;
- r->next = 0;
- l = ALLOCATE(expr.program, Exref_t);
- l->symbol = (exvsp[-1].id);
- l->index = 0;
- l->next = r;
- expr.refs = l;
- expr.lastref = r;
- (exval.reference) = expr.refs;
- }
-#line 3208 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 135:
-#line 1226 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.id) = (exvsp[0].id);
- }
-#line 3216 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 136:
-#line 1230 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.id) = (exvsp[0].id);
- }
-#line 3224 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 137:
-#line 1235 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = 0;
- }
-#line 3232 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 138:
-#line 1239 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = exnewnode(expr.program, '=', 1, (exvsp[0].expr)->type, NiL, (exvsp[0].expr));
- (exval.expr)->subop = (exvsp[-1].op);
- }
-#line 3241 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 140:
-#line 1246 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- register Dtdisc_t* disc;
-
- if (expr.procedure)
- exerror("%s: nested function definitions not supported", expr.id->name);
- expr.procedure = exnewnode(expr.program, PROCEDURE, 1, expr.declare, NiL, NiL);
- if (!(disc = newof(0, Dtdisc_t, 1, 0)))
- exnospace();
- disc->key = offsetof(Exid_t, name);
- if (!streq(expr.id->name, "begin"))
- {
- if (!(expr.procedure->data.procedure.frame = dtopen(disc, Dtset)) || !dtview(expr.procedure->data.procedure.frame, expr.program->symbols))
- exnospace();
- expr.program->symbols = expr.program->frame = expr.procedure->data.procedure.frame;
- expr.program->formals = 1;
- }
- expr.declare = 0;
- }
-#line 3264 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 141:
-#line 1263 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- expr.id->lex = PROCEDURE;
- expr.id->type = expr.procedure->type;
- expr.program->formals = 0;
- expr.declare = 0;
- }
-#line 3275 "y.tab.c" /* yacc.c:1646 */
- break;
-
- case 142:
-#line 1269 "../../lib/expr/exparse.y" /* yacc.c:1646 */
- {
- (exval.expr) = expr.procedure;
- expr.procedure = 0;
- if (expr.program->frame)
- {
- expr.program->symbols = expr.program->frame->view;
- dtview(expr.program->frame, NiL);
- expr.program->frame = 0;
- }
- (exval.expr)->data.operand.left = (exvsp[-5].expr);
- (exval.expr)->data.operand.right = excast(expr.program, (exvsp[-1].expr), (exval.expr)->type, NiL, 0);
-
- /*
- * NOTE: procedure definition was slipped into the
- * declaration initializer statement production,
- * therefore requiring the statement terminator
- */
-
- exunlex(expr.program, ';');
- }
-#line 3300 "y.tab.c" /* yacc.c:1646 */
- break;
-
-
-#line 3304 "y.tab.c" /* yacc.c:1646 */
- default: break;
- }
- /* User semantic actions sometimes alter exchar, and that requires
- that extoken be updated with the new translation. We take the
- approach of translating immediately before every use of extoken.
- One alternative is translating here after every semantic action,
- but that translation would be missed if the semantic action invokes
- EXABORT, EXACCEPT, or EXERROR immediately after altering exchar or
- if it invokes EXBACKUP. In the case of EXABORT or EXACCEPT, an
- incorrect destructor might then be invoked immediately. In the
- case of EXERROR or EXBACKUP, subsequent parser actions might lead
- to an incorrect destructor call or verbose syntax error message
- before the lookahead is translated. */
- EX_SYMBOL_PRINT ("-> $$ =", exr1[exn], &exval, &exloc);
-
- EXPOPSTACK (exlen);
- exlen = 0;
- EX_STACK_PRINT (exss, exssp);
-
- *++exvsp = exval;
-
- /* Now 'shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- exn = exr1[exn];
-
- exstate = expgoto[exn - EXNTOKENS] + *exssp;
- if (0 <= exstate && exstate <= EXLAST && excheck[exstate] == *exssp)
- exstate = extable[exstate];
- else
- exstate = exdefgoto[exn - EXNTOKENS];
-
- goto exnewstate;
-
-
-/*--------------------------------------.
-| exerrlab -- here on detecting error. |
-`--------------------------------------*/
-exerrlab:
- /* Make sure we have latest lookahead translation. See comments at
- user semantic actions for why this is necessary. */
- extoken = exchar == EXEMPTY ? EXEMPTY : EXTRANSLATE (exchar);
-
- /* If not already recovering from an error, report this error. */
- if (!exerrstatus)
- {
- ++exnerrs;
-#if ! EXERROR_VERBOSE
- exerror (EX_("syntax error"));
-#else
-# define EXSYNTAX_ERROR exsyntax_error (&exmsg_alloc, &exmsg, \
- exssp, extoken)
- {
- char const *exmsgp = EX_("syntax error");
- int exsyntax_error_status;
- exsyntax_error_status = EXSYNTAX_ERROR;
- if (exsyntax_error_status == 0)
- exmsgp = exmsg;
- else if (exsyntax_error_status == 1)
- {
- if (exmsg != exmsgbuf)
- EXSTACK_FREE (exmsg);
- exmsg = (char *) EXSTACK_ALLOC (exmsg_alloc);
- if (!exmsg)
- {
- exmsg = exmsgbuf;
- exmsg_alloc = sizeof exmsgbuf;
- exsyntax_error_status = 2;
- }
- else
- {
- exsyntax_error_status = EXSYNTAX_ERROR;
- exmsgp = exmsg;
- }
- }
- exerror (exmsgp);
- if (exsyntax_error_status == 2)
- goto exexhaustedlab;
- }
-# undef EXSYNTAX_ERROR
-#endif
- }
-
-
-
- if (exerrstatus == 3)
- {
- /* If just tried and failed to reuse lookahead token after an
- error, discard it. */
-
- if (exchar <= EXEOF)
- {
- /* Return failure if at end of input. */
- if (exchar == EXEOF)
- EXABORT;
- }
- else
- {
- exdestruct ("Error: discarding",
- extoken, &exlval);
- exchar = EXEMPTY;
- }
- }
-
- /* Else will try to reuse lookahead token after shifting the error
- token. */
- goto exerrlab1;
-
-
-/*---------------------------------------------------.
-| exerrorlab -- error raised explicitly by EXERROR. |
-`---------------------------------------------------*/
-exerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- EXERROR and the label exerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto exerrorlab;
-
- /* Do not reclaim the symbols of the rule whose action triggered
- this EXERROR. */
- EXPOPSTACK (exlen);
- exlen = 0;
- EX_STACK_PRINT (exss, exssp);
- exstate = *exssp;
- goto exerrlab1;
-
-
-/*-------------------------------------------------------------.
-| exerrlab1 -- common code for both syntax error and EXERROR. |
-`-------------------------------------------------------------*/
-exerrlab1:
- exerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- exn = expact[exstate];
- if (!expact_value_is_default (exn))
- {
- exn += EXTERROR;
- if (0 <= exn && exn <= EXLAST && excheck[exn] == EXTERROR)
- {
- exn = extable[exn];
- if (0 < exn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (exssp == exss)
- EXABORT;
-
-
- exdestruct ("Error: popping",
- exstos[exstate], exvsp);
- EXPOPSTACK (1);
- exstate = *exssp;
- EX_STACK_PRINT (exss, exssp);
- }
-
- EX_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- *++exvsp = exlval;
- EX_IGNORE_MAYBE_UNINITIALIZED_END
-
-
- /* Shift the error token. */
- EX_SYMBOL_PRINT ("Shifting", exstos[exn], exvsp, exlsp);
-
- exstate = exn;
- goto exnewstate;
-
-
-/*-------------------------------------.
-| exacceptlab -- EXACCEPT comes here. |
-`-------------------------------------*/
-exacceptlab:
- exresult = 0;
- goto exreturn;
-
-/*-----------------------------------.
-| exabortlab -- EXABORT comes here. |
-`-----------------------------------*/
-exabortlab:
- exresult = 1;
- goto exreturn;
-
-#if !defined exoverflow || EXERROR_VERBOSE
-/*-------------------------------------------------.
-| exexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-exexhaustedlab:
- exerror (EX_("memory exhausted"));
- exresult = 2;
- /* Fall through. */
-#endif
-
-exreturn:
- if (exchar != EXEMPTY)
- {
- /* Make sure we have latest lookahead translation. See comments at
- user semantic actions for why this is necessary. */
- extoken = EXTRANSLATE (exchar);
- exdestruct ("Cleanup: discarding lookahead",
- extoken, &exlval);
- }
- /* Do not reclaim the symbols of the rule whose action triggered
- this EXABORT or EXACCEPT. */
- EXPOPSTACK (exlen);
- EX_STACK_PRINT (exss, exssp);
- while (exssp != exss)
- {
- exdestruct ("Cleanup: popping",
- exstos[*exssp], exvsp);
- EXPOPSTACK (1);
- }
-#ifndef exoverflow
- if (exss != exssa)
- EXSTACK_FREE (exss);
-#endif
-#if EXERROR_VERBOSE
- if (exmsg != exmsgbuf)
- EXSTACK_FREE (exmsg);
-#endif
- return exresult;
-}
-#line 1291 "../../lib/expr/exparse.y" /* yacc.c:1906 */
-
-
-#include "exgram.h"