diff options
Diffstat (limited to 'src/prebuilt/ast-parser-gen.cc')
-rw-r--r-- | src/prebuilt/ast-parser-gen.cc | 4532 |
1 files changed, 4532 insertions, 0 deletions
diff --git a/src/prebuilt/ast-parser-gen.cc b/src/prebuilt/ast-parser-gen.cc new file mode 100644 index 00000000..f8544a3c --- /dev/null +++ b/src/prebuilt/ast-parser-gen.cc @@ -0,0 +1,4532 @@ +/* A Bison parser, made by GNU Bison 3.0.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2013 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 yy or YY, 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 YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "3.0.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Substitute the type names. */ +#define YYSTYPE WABT_AST_PARSER_STYPE +#define YYLTYPE WABT_AST_PARSER_LTYPE +/* Substitute the variable and function names. */ +#define yyparse wabt_ast_parser_parse +#define yylex wabt_ast_parser_lex +#define yyerror wabt_ast_parser_error +#define yydebug wabt_ast_parser_debug +#define yynerrs wabt_ast_parser_nerrs + + +/* Copy the first part of user declarations. */ +#line 17 "src/ast-parser.y" /* yacc.c:339 */ + +#include <assert.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +#include "ast-parser.h" +#include "ast-parser-lexer-shared.h" +#include "binary-reader-ast.h" +#include "binary-reader.h" +#include "literal.h" + +#define INVALID_VAR_INDEX (-1) + +#define RELOCATE_STACK(type, array, stack_base, old_byte_size, new_size) \ + do { \ + if ((stack_base) == (array)) { \ + (stack_base) = (type*)wabt_alloc((new_size) * sizeof(*(stack_base))); \ + memcpy((stack_base), (array), old_byte_size); \ + } else { \ + (stack_base) = (type*)wabt_realloc((stack_base), \ + (new_size) * sizeof(*(stack_base))); \ + } \ + /* Cache the pointer in the parser struct to be free'd later. */ \ + parser->array = (stack_base); \ + } while (0) + +#define yyoverflow(message, ss, ss_size, vs, vs_size, ls, ls_size, new_size) \ + do { \ + *(new_size) *= 2; \ + RELOCATE_STACK(yytype_int16, yyssa, *(ss), (ss_size), *(new_size)); \ + RELOCATE_STACK(YYSTYPE, yyvsa, *(vs), (vs_size), *(new_size)); \ + RELOCATE_STACK(YYLTYPE, yylsa, *(ls), (ls_size), *(new_size)); \ + } while (0) + +#define DUPTEXT(dst, src) \ + (dst).start = wabt_strndup((src).start, (src).length); \ + (dst).length = (src).length + +#define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) { \ + (Current).filename = YYRHSLOC(Rhs, 1).filename; \ + (Current).line = YYRHSLOC(Rhs, 1).line; \ + (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ + (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ + } else { \ + (Current).filename = NULL; \ + (Current).line = YYRHSLOC(Rhs, 0).line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC(Rhs, 0).last_column; \ + } \ + while (0) + +#define APPEND_FIELD_TO_LIST(module, field, KIND, kind, loc_, item) \ + do { \ + field = wabt_append_module_field(module); \ + field->loc = loc_; \ + field->type = WABT_MODULE_FIELD_TYPE_##KIND; \ + field->kind = item; \ + } while (0) + +#define APPEND_ITEM_TO_VECTOR(module, Kind, kind, kinds, item_ptr) \ + do { \ + Wabt##Kind* dummy = item_ptr; \ + wabt_append_##kind##_ptr_value(&(module)->kinds, &dummy); \ + } while (0) + +#define INSERT_BINDING(module, kind, kinds, loc_, name) \ + do \ + if ((name).start) { \ + WabtBinding* binding = \ + wabt_insert_binding(&(module)->kind##_bindings, &(name)); \ + binding->loc = loc_; \ + binding->index = (module)->kinds.size - 1; \ + } \ + while (0) + +#define APPEND_INLINE_EXPORT(module, KIND, loc_, value, index_) \ + do \ + if ((value).export_.has_export) { \ + WabtModuleField* export_field; \ + APPEND_FIELD_TO_LIST(module, export_field, EXPORT, export_, loc_, \ + (value).export_.export_); \ + export_field->export_.kind = WABT_EXTERNAL_KIND_##KIND; \ + export_field->export_.var.loc = loc_; \ + export_field->export_.var.index = index_; \ + APPEND_ITEM_TO_VECTOR(module, Export, export, exports, \ + &export_field->export_); \ + INSERT_BINDING(module, export, exports, export_field->loc, \ + export_field->export_.name); \ + } \ + while (0) + +#define CHECK_IMPORT_ORDERING(module, kind, kinds, loc_) \ + do { \ + if ((module)->kinds.size != (module)->num_##kind##_imports) { \ + wabt_ast_parser_error( \ + &loc_, lexer, parser, \ + "imports must occur before all non-import definitions"); \ + } \ + } while (0) + +#define CHECK_END_LABEL(loc, begin_label, end_label) \ + do { \ + if (!wabt_string_slice_is_empty(&(end_label))) { \ + if (wabt_string_slice_is_empty(&(begin_label))) { \ + wabt_ast_parser_error(&loc, lexer, parser, \ + "unexpected label \"" PRIstringslice "\"", \ + WABT_PRINTF_STRING_SLICE_ARG(end_label)); \ + } else if (!wabt_string_slices_are_equal(&(begin_label), \ + &(end_label))) { \ + wabt_ast_parser_error(&loc, lexer, parser, \ + "mismatching label \"" PRIstringslice \ + "\" != \"" PRIstringslice "\"", \ + WABT_PRINTF_STRING_SLICE_ARG(begin_label), \ + WABT_PRINTF_STRING_SLICE_ARG(end_label)); \ + } \ + wabt_destroy_string_slice(&(end_label)); \ + } \ + } while (0) + +#define YYMALLOC(size) wabt_alloc(size) +#define YYFREE(p) wabt_free(p) + +#define USE_NATURAL_ALIGNMENT (~0) + +static WabtExprList join_exprs1(WabtLocation* loc, WabtExpr* expr1); +static WabtExprList join_exprs2(WabtLocation* loc, WabtExprList* expr1, + WabtExpr* expr2); + +static WabtFuncField* new_func_field(void) { + return (WabtFuncField*)wabt_alloc_zero(sizeof(WabtFuncField)); +} + +static WabtFunc* new_func(void) { + return (WabtFunc*)wabt_alloc_zero(sizeof(WabtFunc)); +} + +static WabtCommand* new_command(void) { + return (WabtCommand*)wabt_alloc_zero(sizeof(WabtCommand)); +} + +static WabtModule* new_module(void) { + return (WabtModule*)wabt_alloc_zero(sizeof(WabtModule)); +} + +static WabtImport* new_import(void) { + return (WabtImport*)wabt_alloc_zero(sizeof(WabtImport)); +} + +static WabtTextListNode* new_text_list_node(void) { + return (WabtTextListNode*)wabt_alloc_zero(sizeof(WabtTextListNode)); +} + +static WabtResult parse_const(WabtType type, WabtLiteralType literal_type, + const char* s, const char* end, WabtConst* out); +static void dup_text_list(WabtTextList * text_list, void** out_data, + size_t* out_size); + +static bool is_empty_signature(WabtFuncSignature* sig); + +static void append_implicit_func_declaration(WabtLocation*, WabtModule*, + WabtFuncDeclaration*); + +typedef struct BinaryErrorCallbackData { + WabtLocation* loc; + WabtAstLexer* lexer; + WabtAstParser* parser; +} BinaryErrorCallbackData; + +static void on_read_binary_error(uint32_t offset, const char* error, + void* user_data); + +#define wabt_ast_parser_lex wabt_ast_lexer_lex + + +#line 252 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:339 */ + +# ifndef YY_NULLPTR +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* In a future release of Bison, this section will be replaced + by #include "ast-parser-gen.h". */ +#ifndef YY_WABT_AST_PARSER_SRC_PREBUILT_AST_PARSER_GEN_H_INCLUDED +# define YY_WABT_AST_PARSER_SRC_PREBUILT_AST_PARSER_GEN_H_INCLUDED +/* Debug traces. */ +#ifndef WABT_AST_PARSER_DEBUG +# if defined YYDEBUG +#if YYDEBUG +# define WABT_AST_PARSER_DEBUG 1 +# else +# define WABT_AST_PARSER_DEBUG 0 +# endif +# else /* ! defined YYDEBUG */ +# define WABT_AST_PARSER_DEBUG 0 +# endif /* ! defined YYDEBUG */ +#endif /* ! defined WABT_AST_PARSER_DEBUG */ +#if WABT_AST_PARSER_DEBUG +extern int wabt_ast_parser_debug; +#endif + +/* Token type. */ +#ifndef WABT_AST_PARSER_TOKENTYPE +# define WABT_AST_PARSER_TOKENTYPE + enum wabt_ast_parser_tokentype + { + WABT_TOKEN_TYPE_EOF = 0, + WABT_TOKEN_TYPE_LPAR = 258, + WABT_TOKEN_TYPE_RPAR = 259, + WABT_TOKEN_TYPE_NAT = 260, + WABT_TOKEN_TYPE_INT = 261, + WABT_TOKEN_TYPE_FLOAT = 262, + WABT_TOKEN_TYPE_TEXT = 263, + WABT_TOKEN_TYPE_VAR = 264, + WABT_TOKEN_TYPE_VALUE_TYPE = 265, + WABT_TOKEN_TYPE_ANYFUNC = 266, + WABT_TOKEN_TYPE_MUT = 267, + WABT_TOKEN_TYPE_NOP = 268, + WABT_TOKEN_TYPE_DROP = 269, + WABT_TOKEN_TYPE_BLOCK = 270, + WABT_TOKEN_TYPE_END = 271, + WABT_TOKEN_TYPE_IF = 272, + WABT_TOKEN_TYPE_THEN = 273, + WABT_TOKEN_TYPE_ELSE = 274, + WABT_TOKEN_TYPE_LOOP = 275, + WABT_TOKEN_TYPE_BR = 276, + WABT_TOKEN_TYPE_BR_IF = 277, + WABT_TOKEN_TYPE_BR_TABLE = 278, + WABT_TOKEN_TYPE_CALL = 279, + WABT_TOKEN_TYPE_CALL_IMPORT = 280, + WABT_TOKEN_TYPE_CALL_INDIRECT = 281, + WABT_TOKEN_TYPE_RETURN = 282, + WABT_TOKEN_TYPE_GET_LOCAL = 283, + WABT_TOKEN_TYPE_SET_LOCAL = 284, + WABT_TOKEN_TYPE_TEE_LOCAL = 285, + WABT_TOKEN_TYPE_GET_GLOBAL = 286, + WABT_TOKEN_TYPE_SET_GLOBAL = 287, + WABT_TOKEN_TYPE_LOAD = 288, + WABT_TOKEN_TYPE_STORE = 289, + WABT_TOKEN_TYPE_OFFSET_EQ_NAT = 290, + WABT_TOKEN_TYPE_ALIGN_EQ_NAT = 291, + WABT_TOKEN_TYPE_CONST = 292, + WABT_TOKEN_TYPE_UNARY = 293, + WABT_TOKEN_TYPE_BINARY = 294, + WABT_TOKEN_TYPE_COMPARE = 295, + WABT_TOKEN_TYPE_CONVERT = 296, + WABT_TOKEN_TYPE_SELECT = 297, + WABT_TOKEN_TYPE_UNREACHABLE = 298, + WABT_TOKEN_TYPE_CURRENT_MEMORY = 299, + WABT_TOKEN_TYPE_GROW_MEMORY = 300, + WABT_TOKEN_TYPE_FUNC = 301, + WABT_TOKEN_TYPE_START = 302, + WABT_TOKEN_TYPE_TYPE = 303, + WABT_TOKEN_TYPE_PARAM = 304, + WABT_TOKEN_TYPE_RESULT = 305, + WABT_TOKEN_TYPE_LOCAL = 306, + WABT_TOKEN_TYPE_GLOBAL = 307, + WABT_TOKEN_TYPE_MODULE = 308, + WABT_TOKEN_TYPE_TABLE = 309, + WABT_TOKEN_TYPE_ELEM = 310, + WABT_TOKEN_TYPE_MEMORY = 311, + WABT_TOKEN_TYPE_DATA = 312, + WABT_TOKEN_TYPE_OFFSET = 313, + WABT_TOKEN_TYPE_IMPORT = 314, + WABT_TOKEN_TYPE_EXPORT = 315, + WABT_TOKEN_TYPE_REGISTER = 316, + WABT_TOKEN_TYPE_INVOKE = 317, + WABT_TOKEN_TYPE_GET = 318, + WABT_TOKEN_TYPE_ASSERT_MALFORMED = 319, + WABT_TOKEN_TYPE_ASSERT_INVALID = 320, + WABT_TOKEN_TYPE_ASSERT_UNLINKABLE = 321, + WABT_TOKEN_TYPE_ASSERT_RETURN = 322, + WABT_TOKEN_TYPE_ASSERT_RETURN_NAN = 323, + WABT_TOKEN_TYPE_ASSERT_TRAP = 324, + WABT_TOKEN_TYPE_ASSERT_EXHAUSTION = 325, + WABT_TOKEN_TYPE_INPUT = 326, + WABT_TOKEN_TYPE_OUTPUT = 327, + WABT_TOKEN_TYPE_LOW = 328 + }; +#endif + +/* Value type. */ +#if ! defined WABT_AST_PARSER_STYPE && ! defined WABT_AST_PARSER_STYPE_IS_DECLARED +typedef WabtToken WABT_AST_PARSER_STYPE; +# define WABT_AST_PARSER_STYPE_IS_TRIVIAL 1 +# define WABT_AST_PARSER_STYPE_IS_DECLARED 1 +#endif + +/* Location type. */ +#if ! defined WABT_AST_PARSER_LTYPE && ! defined WABT_AST_PARSER_LTYPE_IS_DECLARED +typedef struct WABT_AST_PARSER_LTYPE WABT_AST_PARSER_LTYPE; +struct WABT_AST_PARSER_LTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +}; +# define WABT_AST_PARSER_LTYPE_IS_DECLARED 1 +# define WABT_AST_PARSER_LTYPE_IS_TRIVIAL 1 +#endif + + + +int wabt_ast_parser_parse (WabtAstLexer* lexer, WabtAstParser* parser); + +#endif /* !YY_WABT_AST_PARSER_SRC_PREBUILT_AST_PARSER_GEN_H_INCLUDED */ + +/* Copy the second part of user declarations. */ + +#line 399 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:358 */ + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_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 YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_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 YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_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 YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined WABT_AST_PARSER_LTYPE_IS_TRIVIAL && WABT_AST_PARSER_LTYPE_IS_TRIVIAL \ + && defined WABT_AST_PARSER_STYPE_IS_TRIVIAL && WABT_AST_PARSER_STYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; + YYLTYPE yyls_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 10 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 794 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 74 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 63 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 171 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 402 + +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 328 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ +static const yytype_uint8 yytranslate[] = +{ + 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, 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, 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, 68, 69, 70, 71, 72, 73 +}; + +#if WABT_AST_PARSER_DEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 305, 305, 311, 321, 322, 326, 344, 345, 351, + 354, 359, 366, 369, 370, 374, 379, 386, 389, 392, + 397, 404, 410, 421, 425, 429, 436, 441, 448, 449, + 455, 456, 459, 463, 464, 468, 469, 479, 480, 491, + 492, 493, 496, 499, 502, 505, 508, 512, 516, 521, + 524, 528, 532, 536, 540, 544, 548, 552, 558, 564, + 576, 580, 584, 588, 592, 595, 600, 606, 612, 618, + 628, 636, 640, 643, 649, 655, 664, 670, 675, 681, + 686, 692, 700, 701, 709, 710, 718, 723, 724, 730, + 736, 746, 752, 758, 768, 822, 831, 838, 845, 855, + 858, 862, 868, 879, 885, 905, 912, 924, 931, 951, + 973, 980, 993, 1000, 1006, 1012, 1018, 1026, 1031, 1038, + 1044, 1050, 1056, 1065, 1073, 1078, 1083, 1088, 1095, 1102, + 1106, 1109, 1120, 1124, 1131, 1135, 1138, 1146, 1154, 1171, + 1187, 1197, 1204, 1211, 1217, 1256, 1266, 1288, 1298, 1324, + 1329, 1337, 1345, 1355, 1361, 1367, 1373, 1379, 1385, 1390, + 1396, 1405, 1410, 1411, 1417, 1426, 1427, 1435, 1447, 1448, + 1455, 1519 +}; +#endif + +#if WABT_AST_PARSER_DEBUG || YYERROR_VERBOSE || 1 +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"EOF\"", "error", "$undefined", "\"(\"", "\")\"", "NAT", "INT", + "FLOAT", "TEXT", "VAR", "VALUE_TYPE", "ANYFUNC", "MUT", "NOP", "DROP", + "BLOCK", "END", "IF", "THEN", "ELSE", "LOOP", "BR", "BR_IF", "BR_TABLE", + "CALL", "CALL_IMPORT", "CALL_INDIRECT", "RETURN", "GET_LOCAL", + "SET_LOCAL", "TEE_LOCAL", "GET_GLOBAL", "SET_GLOBAL", "LOAD", "STORE", + "OFFSET_EQ_NAT", "ALIGN_EQ_NAT", "CONST", "UNARY", "BINARY", "COMPARE", + "CONVERT", "SELECT", "UNREACHABLE", "CURRENT_MEMORY", "GROW_MEMORY", + "FUNC", "START", "TYPE", "PARAM", "RESULT", "LOCAL", "GLOBAL", "MODULE", + "TABLE", "ELEM", "MEMORY", "DATA", "OFFSET", "IMPORT", "EXPORT", + "REGISTER", "INVOKE", "GET", "ASSERT_MALFORMED", "ASSERT_INVALID", + "ASSERT_UNLINKABLE", "ASSERT_RETURN", "ASSERT_RETURN_NAN", "ASSERT_TRAP", + "ASSERT_EXHAUSTION", "INPUT", "OUTPUT", "LOW", "$accept", + "non_empty_text_list", "text_list", "quoted_text", "value_type_list", + "elem_type", "global_type", "func_type", "func_sig", "table_sig", + "memory_sig", "limits", "type_use", "nat", "literal", "var", "var_list", + "bind_var_opt", "bind_var", "labeling_opt", "offset_opt", "align_opt", + "instr", "plain_instr", "block_instr", "block", "expr", "expr1", "if_", + "instr_list", "expr_list", "const_expr", "func_fields", "func_body", + "func_info", "func", "offset", "elem", "table", "data", "memory", + "global", "import_kind", "import", "inline_import", "export_kind", + "export", "inline_export_opt", "inline_export", "type_def", "start", + "module_fields", "raw_module", "module", "script_var_opt", "action", + "assertion", "cmd", "cmd_list", "const", "const_list", "script", + "script_start", YY_NULLPTR +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_uint16 yytoknum[] = +{ + 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, 323, 324, + 325, 326, 327, 328 +}; +# endif + +#define YYPACT_NINF -271 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-271))) + +#define YYTABLE_NINF -30 + +#define yytable_value_is_error(Yytable_value) \ + 0 + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = +{ + -271, 26, -271, 77, 84, -271, -271, -271, -271, -271, + -271, 82, 94, 107, 107, 124, 124, 124, 157, 157, + 159, 157, -271, 106, -271, -271, 107, -271, 94, 94, + 123, 94, 94, 94, -12, -271, 160, 18, 94, 94, + 94, -271, 39, 140, 179, -271, 186, 194, 198, 215, + 213, -271, 230, 238, 245, -271, -271, 111, -271, -271, + -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + 248, -271, -271, -271, -271, 216, -271, -271, -271, -271, + -271, 82, 70, 85, 82, 82, 117, 82, 117, 94, + 94, -271, 200, 405, -271, -271, -271, 266, 142, 267, + 270, 58, 271, 326, 272, -271, -271, 273, 272, 106, + 94, 274, -271, -271, -271, 275, 285, -271, -271, 82, + 82, 82, 70, 70, -271, 70, 70, -271, 70, 70, + 70, 70, 70, 246, 246, 200, -271, -271, -271, -271, + -271, -271, -271, -271, 438, 471, -271, -271, -271, -271, + -271, -271, 276, 279, 504, -271, 280, -271, 281, 25, + -271, 471, 87, 87, 196, 282, 118, -271, 82, 82, + 82, 471, 283, 284, -271, 220, 184, 282, 282, 286, + 106, 293, 287, 289, 53, 299, -271, 70, 82, -271, + 82, 94, 94, -271, -271, -271, -271, -271, -271, 70, + -271, -271, -271, -271, -271, -271, -271, -271, 254, 254, + -271, 609, 300, 749, -271, -271, 197, 306, 316, 570, + 438, 317, 209, 327, -271, 322, -271, 333, 330, 334, + 471, 347, 350, 282, -271, 290, 358, -271, -271, -271, + 368, 283, -271, -271, 223, -271, -271, 106, 369, -271, + 370, 227, 373, -271, 65, 374, 70, 70, 70, 70, + -271, 375, 121, 366, 151, 177, 371, 94, 376, 372, + 367, 48, 381, 125, -271, -271, -271, -271, -271, -271, + -271, -271, 384, -271, -271, 386, -271, -271, 387, -271, + -271, -271, 352, -271, -271, 105, -271, -271, -271, -271, + 417, -271, -271, 106, -271, 82, 82, 82, 82, -271, + 419, 420, 426, 436, -271, 438, -271, 450, 537, 537, + 452, 453, -271, -271, 82, 82, 82, 82, 182, 189, + -271, -271, -271, -271, 683, 460, -271, 469, 483, 279, + 87, 282, 282, -271, -271, -271, -271, -271, 438, 648, + -271, -271, 537, -271, -271, -271, 471, -271, 486, -271, + 226, 471, 716, 283, -271, 492, 502, 516, 518, 519, + 525, -271, -271, 474, 489, 549, 551, 471, -271, -271, + -271, -271, -271, -271, -271, 82, -271, -271, 553, 558, + -271, 191, 554, 569, -271, 471, 567, 584, 471, -271, + 585, -271 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 165, 170, 171, 0, 0, 148, 163, 161, 162, 166, + 1, 30, 0, 149, 149, 0, 0, 0, 0, 0, + 0, 0, 32, 135, 31, 6, 149, 150, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 168, 0, 0, 0, 0, + 0, 158, 0, 0, 0, 147, 3, 0, 146, 140, + 141, 138, 142, 139, 137, 144, 145, 136, 143, 164, + 0, 152, 153, 154, 155, 0, 157, 169, 156, 159, + 160, 30, 0, 0, 30, 30, 0, 30, 0, 0, + 0, 151, 0, 82, 22, 27, 26, 0, 0, 0, + 0, 0, 129, 0, 0, 100, 28, 129, 0, 4, + 0, 0, 23, 24, 25, 0, 0, 43, 44, 33, + 33, 33, 0, 0, 28, 0, 0, 49, 0, 0, + 0, 0, 0, 35, 35, 0, 60, 61, 62, 63, + 45, 42, 64, 65, 82, 82, 39, 40, 41, 91, + 94, 87, 0, 13, 82, 134, 13, 132, 0, 0, + 10, 82, 0, 0, 0, 0, 0, 130, 33, 33, + 33, 82, 84, 0, 28, 0, 0, 0, 0, 130, + 4, 5, 0, 0, 0, 0, 167, 0, 7, 7, + 7, 0, 0, 34, 7, 7, 7, 46, 47, 0, + 50, 51, 52, 53, 54, 55, 56, 36, 37, 37, + 59, 0, 0, 0, 83, 98, 0, 0, 0, 0, + 82, 0, 0, 0, 133, 0, 86, 0, 0, 0, + 82, 0, 0, 19, 9, 0, 0, 7, 7, 7, + 0, 84, 72, 71, 0, 102, 29, 4, 0, 18, + 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 48, 38, 57, 58, 96, 7, 7, + 119, 118, 0, 97, 12, 0, 111, 122, 0, 120, + 17, 20, 0, 103, 73, 0, 74, 99, 85, 101, + 0, 121, 107, 4, 105, 30, 30, 30, 30, 117, + 0, 0, 0, 0, 21, 82, 8, 0, 82, 82, + 0, 0, 131, 70, 33, 33, 33, 33, 0, 0, + 95, 11, 110, 28, 0, 0, 75, 0, 0, 13, + 0, 0, 0, 124, 127, 125, 126, 89, 82, 0, + 88, 92, 82, 123, 66, 68, 82, 67, 14, 16, + 0, 82, 0, 81, 109, 0, 0, 0, 0, 0, + 0, 90, 93, 0, 0, 0, 0, 82, 80, 108, + 113, 112, 116, 114, 115, 33, 7, 104, 77, 0, + 69, 0, 0, 79, 15, 82, 0, 0, 82, 76, + 0, 78 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -271, 572, -134, -7, -178, 385, -146, 505, -143, -152, + -160, -142, -148, -138, 481, 10, -115, -43, -11, -113, + 472, 416, -271, -101, -271, -133, -85, -271, -271, -141, + 393, -137, -270, -266, -96, -271, -39, -271, -271, -271, + -271, -271, -271, -271, 71, -271, -271, 520, 73, -271, + -271, -271, 206, -271, 40, 219, -271, -271, -271, -271, + 583, -271, -271 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 181, 182, 26, 269, 235, 161, 99, 217, 231, + 248, 232, 144, 96, 115, 246, 175, 23, 193, 194, + 208, 275, 145, 146, 147, 270, 148, 173, 336, 149, + 242, 227, 150, 151, 152, 59, 106, 60, 61, 62, + 63, 64, 255, 65, 153, 185, 66, 166, 154, 67, + 68, 43, 5, 6, 28, 7, 8, 9, 1, 77, + 50, 2, 3 +}; + + /* YYTABLE[YYPACT[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 YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 24, 105, 172, 105, 214, 218, 220, 195, 196, 199, + 262, 264, 265, 223, 236, 172, 229, 230, 250, 105, + 226, 45, 46, 105, 47, 48, 49, 233, 233, 4, + 226, 52, 53, 54, 240, 249, 249, 225, 93, 233, + 233, 101, 102, 55, 107, 347, 252, 56, 212, 109, + 13, 14, 350, 351, 29, 237, 238, 239, 221, 244, + 295, 159, 271, 272, 325, 174, 44, 326, 160, 180, + 24, 11, 100, 24, 24, 94, 24, 10, 371, 95, + 13, 14, 110, 111, 191, 192, 372, 241, 98, 226, + 228, 22, 97, 288, 22, 291, 104, 160, 108, 256, + 328, 329, 25, 183, 294, 257, 296, 258, 334, 259, + 172, 305, 172, 300, 41, 316, 27, 306, 172, 307, + 103, 308, 94, 94, 282, 315, 95, 30, 323, 234, + -29, 316, 197, 198, -29, 200, 201, 11, 202, 203, + 204, 205, 206, 57, 58, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 318, 241, 81, 82, 83, + 34, 316, 37, 84, 51, 85, 86, 87, 88, 338, + 89, 90, 162, 165, 163, 167, 11, 263, 177, 266, + 179, 319, 370, 69, 267, 268, 358, 316, 156, 369, + 71, 367, 316, 359, 368, 394, 366, 261, 72, 316, + 249, 316, 73, 233, 233, 112, 113, 114, 391, 273, + 335, 354, 355, 356, 357, 373, 75, 76, 360, 74, + 376, 31, 32, 33, 245, 94, 38, 299, 94, 95, + 375, 94, 95, 172, 78, 95, 389, 35, 36, 39, + 40, 247, 79, 191, 192, 187, 278, 279, 172, 80, + 363, 75, 91, 92, 397, 191, 192, 400, 278, 279, + 321, 172, 339, 340, 341, 342, 310, 311, 312, 313, + 155, 157, 390, 98, 164, 103, 176, 184, 378, 186, + 215, 207, 216, 222, 303, 224, 213, 94, 243, 251, + 274, 253, 254, 292, 24, 24, 24, 24, 117, 118, + 168, 56, 169, 260, 277, 170, 122, 123, 124, 125, + 280, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 281, 283, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 284, 285, 187, 188, 189, 190, 286, 287, 117, + 118, 168, 225, 169, 191, 192, 170, 122, 123, 124, + 125, 289, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 234, 293, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 297, 301, 302, 213, 317, 304, 309, 314, + 322, 320, 316, 324, 171, 117, 118, 119, 330, 120, + 331, 332, 121, 122, 123, 124, 125, 327, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 333, 116, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 117, 118, + 119, 337, 120, 343, 344, 121, 122, 123, 124, 125, + 345, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 346, 211, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 117, 118, 119, 348, 120, 352, 353, 121, 122, + 123, 124, 125, 362, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 364, 213, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 117, 118, 119, 365, 120, 374, + 385, 121, 122, 123, 124, 125, 379, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 380, 219, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 117, 118, 119, + 381, 120, 382, 383, 121, 122, 123, 124, 125, 384, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 386, + 349, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 117, 118, 119, 387, 120, 388, 392, 121, 122, 123, + 124, 125, 393, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 396, 395, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 117, 118, 168, 398, 169, 399, 401, + 170, 122, 123, 124, 125, 42, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 158, 209, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 210, 290, 187, 188, + 189, 190, 117, 118, 168, 276, 169, 178, 70, 170, + 122, 123, 124, 125, 298, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 0, 0, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 188, 189, + 190, 117, 118, 168, 0, 169, 0, 0, 170, 122, + 123, 124, 125, 0, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 0, 0, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 0, 0, 117, 118, 168, 190, + 169, 361, 0, 170, 122, 123, 124, 125, 0, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 0, 0, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 117, + 118, 168, 0, 169, 377, 0, 170, 122, 123, 124, + 125, 0, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 0, 0, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 117, 118, 168, 0, 169, 0, 0, 170, + 122, 123, 124, 125, 0, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 0, 0, 135, 136, 137, 138, + 139, 140, 141, 142, 143 +}; + +static const yytype_int16 yycheck[] = +{ + 11, 86, 103, 88, 145, 153, 154, 120, 121, 124, + 188, 189, 190, 156, 166, 116, 162, 163, 178, 104, + 161, 28, 29, 108, 31, 32, 33, 165, 166, 3, + 171, 38, 39, 40, 171, 177, 178, 12, 81, 177, + 178, 84, 85, 4, 87, 315, 180, 8, 144, 88, + 62, 63, 318, 319, 14, 168, 169, 170, 154, 174, + 238, 3, 195, 196, 16, 104, 26, 19, 10, 108, + 81, 53, 83, 84, 85, 5, 87, 0, 348, 9, + 62, 63, 89, 90, 59, 60, 352, 172, 3, 230, + 3, 9, 82, 230, 9, 233, 86, 10, 88, 46, + 278, 279, 8, 110, 237, 52, 239, 54, 3, 56, + 211, 46, 213, 247, 8, 10, 9, 52, 219, 54, + 3, 56, 5, 5, 220, 4, 9, 3, 269, 11, + 5, 10, 122, 123, 9, 125, 126, 53, 128, 129, + 130, 131, 132, 3, 4, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 4, 241, 46, 47, 48, + 3, 10, 3, 52, 4, 54, 55, 56, 57, 303, + 59, 60, 101, 102, 101, 102, 53, 188, 107, 190, + 107, 4, 342, 4, 191, 192, 4, 10, 46, 341, + 4, 339, 10, 4, 340, 4, 339, 187, 4, 10, + 342, 10, 4, 341, 342, 5, 6, 7, 386, 199, + 295, 324, 325, 326, 327, 356, 3, 4, 333, 4, + 361, 15, 16, 17, 4, 5, 20, 4, 5, 9, + 4, 5, 9, 334, 4, 9, 377, 18, 19, 20, + 21, 57, 4, 59, 60, 48, 49, 50, 349, 4, + 335, 3, 4, 37, 395, 59, 60, 398, 49, 50, + 267, 362, 305, 306, 307, 308, 256, 257, 258, 259, + 4, 4, 385, 3, 3, 3, 3, 3, 363, 4, + 4, 35, 3, 3, 57, 4, 3, 5, 4, 3, + 36, 4, 3, 3, 305, 306, 307, 308, 13, 14, + 15, 8, 17, 4, 4, 20, 21, 22, 23, 24, + 4, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 4, 4, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 4, 10, 48, 49, 50, 51, 4, 4, 13, + 14, 15, 12, 17, 59, 60, 20, 21, 22, 23, + 24, 4, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 11, 4, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 4, 4, 4, 3, 10, 4, 4, 4, + 4, 10, 10, 16, 58, 13, 14, 15, 4, 17, + 4, 4, 20, 21, 22, 23, 24, 16, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 55, 3, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 13, 14, + 15, 4, 17, 4, 4, 20, 21, 22, 23, 24, + 4, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 4, 3, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 13, 14, 15, 4, 17, 4, 4, 20, 21, + 22, 23, 24, 3, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 4, 3, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 13, 14, 15, 4, 17, 3, + 16, 20, 21, 22, 23, 24, 4, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 4, 3, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 13, 14, 15, + 4, 17, 4, 4, 20, 21, 22, 23, 24, 4, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 50, + 3, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 13, 14, 15, 4, 17, 4, 3, 20, 21, 22, + 23, 24, 4, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 3, 19, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 13, 14, 15, 19, 17, 4, 4, + 20, 21, 22, 23, 24, 23, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 100, 134, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 135, 232, 48, 49, + 50, 51, 13, 14, 15, 209, 17, 107, 45, 20, + 21, 22, 23, 24, 241, 26, 27, 28, 29, 30, + 31, 32, 33, 34, -1, -1, 37, 38, 39, 40, + 41, 42, 43, 44, 45, -1, -1, -1, 49, 50, + 51, 13, 14, 15, -1, 17, -1, -1, 20, 21, + 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, 37, 38, 39, 40, 41, + 42, 43, 44, 45, -1, -1, 13, 14, 15, 51, + 17, 18, -1, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, -1, -1, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 13, + 14, 15, -1, 17, 18, -1, 20, 21, 22, 23, + 24, -1, 26, 27, 28, 29, 30, 31, 32, 33, + 34, -1, -1, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 13, 14, 15, -1, 17, -1, -1, 20, + 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, -1, -1, 37, 38, 39, 40, + 41, 42, 43, 44, 45 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 132, 135, 136, 3, 126, 127, 129, 130, 131, + 0, 53, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 9, 91, 92, 8, 77, 9, 128, 128, + 3, 126, 126, 126, 3, 129, 129, 3, 126, 129, + 129, 8, 75, 125, 128, 77, 77, 77, 77, 77, + 134, 4, 77, 77, 77, 4, 8, 3, 4, 109, + 111, 112, 113, 114, 115, 117, 120, 123, 124, 4, + 134, 4, 4, 4, 4, 3, 4, 133, 4, 4, + 4, 46, 47, 48, 52, 54, 55, 56, 57, 59, + 60, 4, 37, 91, 5, 9, 87, 89, 3, 81, + 92, 91, 91, 3, 89, 100, 110, 91, 89, 110, + 77, 77, 5, 6, 7, 88, 3, 13, 14, 15, + 17, 20, 21, 22, 23, 24, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 86, 96, 97, 98, 100, 103, + 106, 107, 108, 118, 122, 4, 46, 4, 81, 3, + 10, 80, 118, 122, 3, 118, 121, 122, 15, 17, + 20, 58, 97, 101, 110, 90, 3, 118, 121, 122, + 110, 75, 76, 77, 3, 119, 4, 48, 49, 50, + 51, 59, 60, 92, 93, 93, 93, 89, 89, 90, + 89, 89, 89, 89, 89, 89, 89, 35, 94, 94, + 88, 3, 108, 3, 103, 4, 3, 82, 86, 3, + 86, 108, 3, 82, 4, 12, 103, 105, 3, 80, + 80, 83, 85, 87, 11, 79, 83, 93, 93, 93, + 105, 100, 104, 4, 90, 4, 89, 57, 84, 85, + 84, 3, 76, 4, 3, 116, 46, 52, 54, 56, + 4, 89, 78, 92, 78, 78, 92, 77, 77, 78, + 99, 99, 99, 89, 36, 95, 95, 4, 49, 50, + 4, 4, 108, 4, 4, 10, 4, 4, 105, 4, + 79, 87, 3, 4, 99, 78, 99, 4, 104, 4, + 76, 4, 4, 57, 4, 46, 52, 54, 56, 4, + 89, 89, 89, 89, 4, 4, 10, 10, 4, 4, + 10, 77, 4, 103, 16, 16, 19, 16, 78, 78, + 4, 4, 4, 55, 3, 100, 102, 4, 76, 91, + 91, 91, 91, 4, 4, 4, 4, 106, 4, 3, + 107, 107, 4, 4, 93, 93, 93, 93, 4, 4, + 90, 18, 3, 100, 4, 4, 82, 86, 80, 83, + 84, 106, 107, 103, 3, 4, 103, 18, 100, 4, + 4, 4, 4, 4, 4, 16, 50, 4, 4, 103, + 93, 78, 3, 4, 4, 19, 3, 103, 19, 4, + 103, 4 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 74, 75, 75, 76, 76, 77, 78, 78, 79, + 80, 80, 81, 82, 82, 82, 82, 83, 84, 85, + 85, 86, 87, 88, 88, 88, 89, 89, 90, 90, + 91, 91, 92, 93, 93, 94, 94, 95, 95, 96, + 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, + 99, 100, 101, 101, 101, 101, 102, 102, 102, 102, + 102, 102, 103, 103, 104, 104, 105, 106, 106, 106, + 106, 107, 107, 107, 108, 109, 109, 109, 109, 110, + 110, 111, 111, 112, 112, 113, 113, 114, 114, 114, + 115, 115, 116, 116, 116, 116, 116, 117, 117, 117, + 117, 117, 117, 118, 119, 119, 119, 119, 120, 121, + 121, 122, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 126, 127, 128, + 128, 129, 129, 130, 130, 130, 130, 130, 130, 130, + 130, 131, 131, 131, 131, 132, 132, 133, 134, 134, + 135, 136 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 0, 1, 1, 0, 2, 1, + 1, 4, 4, 0, 4, 8, 4, 2, 1, 1, + 2, 4, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 3, 1, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, + 1, 1, 1, 1, 1, 1, 5, 5, 5, 8, + 2, 3, 2, 3, 3, 4, 8, 4, 9, 5, + 3, 2, 0, 2, 0, 2, 1, 1, 5, 5, + 6, 1, 5, 6, 1, 7, 6, 6, 5, 4, + 1, 6, 5, 6, 10, 6, 5, 6, 9, 8, + 7, 6, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 5, 4, 4, 4, 4, 5, 0, + 1, 4, 4, 5, 4, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 5, 5, 1, 0, + 1, 6, 5, 5, 5, 5, 5, 5, 4, 5, + 5, 1, 1, 1, 5, 0, 2, 4, 0, 2, + 1, 1 +}; + + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (&yylloc, lexer, parser, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) + + +/* Enable debugging if requested. */ +#if WABT_AST_PARSER_DEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if defined WABT_AST_PARSER_LTYPE_IS_TRIVIAL && WABT_AST_PARSER_LTYPE_IS_TRIVIAL + +/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ + +YY_ATTRIBUTE_UNUSED +static unsigned +yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) +{ + unsigned res = 0; + int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; + if (0 <= yylocp->first_line) + { + res += YYFPRINTF (yyo, "%d", yylocp->first_line); + if (0 <= yylocp->first_column) + res += YYFPRINTF (yyo, ".%d", yylocp->first_column); + } + if (0 <= yylocp->last_line) + { + if (yylocp->first_line < yylocp->last_line) + { + res += YYFPRINTF (yyo, "-%d", yylocp->last_line); + if (0 <= end_col) + res += YYFPRINTF (yyo, ".%d", end_col); + } + else if (0 <= end_col && yylocp->first_column < end_col) + res += YYFPRINTF (yyo, "-%d", end_col); + } + return res; + } + +# define YY_LOCATION_PRINT(File, Loc) \ + yy_location_print_ (File, &(Loc)) + +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, Location, lexer, parser); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, WabtAstLexer* lexer, WabtAstParser* parser) +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + YYUSE (yylocationp); + YYUSE (lexer); + YYUSE (parser); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + YYUSE (yytype); +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, WabtAstLexer* lexer, WabtAstParser* parser) +{ + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + + YY_LOCATION_PRINT (yyoutput, *yylocationp); + YYFPRINTF (yyoutput, ": "); + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, lexer, parser); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, WabtAstLexer* lexer, WabtAstParser* parser) +{ + unsigned long int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , &(yylsp[(yyi + 1) - (yynrhs)]) , lexer, parser); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, yylsp, Rule, lexer, parser); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !WABT_AST_PARSER_DEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !WABT_AST_PARSER_DEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- 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 + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +yystrlen (const char *yystr) +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 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 yychar) 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 yychar. + - 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 (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_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 *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, WabtAstLexer* lexer, WabtAstParser* parser) +{ + YYUSE (yyvaluep); + YYUSE (yylocationp); + YYUSE (lexer); + YYUSE (parser); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yytype) + { + case 5: /* NAT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1663 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 6: /* INT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1669 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 7: /* FLOAT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1675 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 8: /* TEXT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1681 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 9: /* VAR */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1687 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 35: /* OFFSET_EQ_NAT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1693 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 36: /* ALIGN_EQ_NAT */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ + {} +#line 1699 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 75: /* non_empty_text_list */ +#line 289 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_text_list(&((*yyvaluep).text_list)); } +#line 1705 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 76: /* text_list */ +#line 289 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_text_list(&((*yyvaluep).text_list)); } +#line 1711 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 77: /* quoted_text */ +#line 288 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_string_slice(&((*yyvaluep).text)); } +#line 1717 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 78: /* value_type_list */ +#line 290 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_type_vector(&((*yyvaluep).types)); } +#line 1723 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 81: /* func_type */ +#line 280 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func_signature(&((*yyvaluep).func_sig)); } +#line 1729 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 82: /* func_sig */ +#line 280 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func_signature(&((*yyvaluep).func_sig)); } +#line 1735 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 86: /* type_use */ +#line 292 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_var(&((*yyvaluep).var)); } +#line 1741 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 88: /* literal */ +#line 286 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_string_slice(&((*yyvaluep).literal).text); } +#line 1747 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 89: /* var */ +#line 292 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_var(&((*yyvaluep).var)); } +#line 1753 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 90: /* var_list */ +#line 291 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_var_vector_and_elements(&((*yyvaluep).vars)); } +#line 1759 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 91: /* bind_var_opt */ +#line 288 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_string_slice(&((*yyvaluep).text)); } +#line 1765 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 92: /* bind_var */ +#line 288 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_string_slice(&((*yyvaluep).text)); } +#line 1771 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 93: /* labeling_opt */ +#line 288 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_string_slice(&((*yyvaluep).text)); } +#line 1777 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 96: /* instr */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1783 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 97: /* plain_instr */ +#line 276 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr(((*yyvaluep).expr)); } +#line 1789 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 98: /* block_instr */ +#line 276 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr(((*yyvaluep).expr)); } +#line 1795 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 99: /* block */ +#line 267 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_block(&((*yyvaluep).block)); } +#line 1801 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 100: /* expr */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1807 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 101: /* expr1 */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1813 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 102: /* if_ */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1819 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 103: /* instr_list */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1825 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 104: /* expr_list */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1831 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 105: /* const_expr */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1837 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 106: /* func_fields */ +#line 278 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func_fields(((*yyvaluep).func_fields)); } +#line 1843 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 107: /* func_body */ +#line 278 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func_fields(((*yyvaluep).func_fields)); } +#line 1849 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 108: /* func_info */ +#line 279 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func(((*yyvaluep).func)); wabt_free(((*yyvaluep).func)); } +#line 1855 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 109: /* func */ +#line 273 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_exported_func(&((*yyvaluep).exported_func)); } +#line 1861 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 110: /* offset */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_expr_list(((*yyvaluep).expr_list).first); } +#line 1867 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 111: /* elem */ +#line 271 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_elem_segment(&((*yyvaluep).elem_segment)); } +#line 1873 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 112: /* table */ +#line 275 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_exported_table(&((*yyvaluep).exported_table)); } +#line 1879 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 113: /* data */ +#line 283 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_data_segment(&((*yyvaluep).data_segment)); } +#line 1885 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 114: /* memory */ +#line 274 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_exported_memory(&((*yyvaluep).exported_memory)); } +#line 1891 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 116: /* import_kind */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_import(((*yyvaluep).import)); wabt_free(((*yyvaluep).import)); } +#line 1897 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 117: /* import */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_import(((*yyvaluep).import)); wabt_free(((*yyvaluep).import)); } +#line 1903 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 118: /* inline_import */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_import(((*yyvaluep).import)); wabt_free(((*yyvaluep).import)); } +#line 1909 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 119: /* export_kind */ +#line 272 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_export(&((*yyvaluep).export_)); } +#line 1915 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 120: /* export */ +#line 272 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_export(&((*yyvaluep).export_)); } +#line 1921 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 123: /* type_def */ +#line 281 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_func_type(&((*yyvaluep).func_type)); } +#line 1927 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 124: /* start */ +#line 292 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_var(&((*yyvaluep).var)); } +#line 1933 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 125: /* module_fields */ +#line 284 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_module(((*yyvaluep).module)); wabt_free(((*yyvaluep).module)); } +#line 1939 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 126: /* raw_module */ +#line 285 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_raw_module(&((*yyvaluep).raw_module)); } +#line 1945 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 127: /* module */ +#line 284 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_module(((*yyvaluep).module)); wabt_free(((*yyvaluep).module)); } +#line 1951 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 128: /* script_var_opt */ +#line 292 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_var(&((*yyvaluep).var)); } +#line 1957 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 130: /* assertion */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_command(((*yyvaluep).command)); wabt_free(((*yyvaluep).command)); } +#line 1963 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 131: /* cmd */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_command(((*yyvaluep).command)); wabt_free(((*yyvaluep).command)); } +#line 1969 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 132: /* cmd_list */ +#line 269 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_command_vector_and_elements(&((*yyvaluep).commands)); } +#line 1975 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 134: /* const_list */ +#line 270 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_const_vector(&((*yyvaluep).consts)); } +#line 1981 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + case 135: /* script */ +#line 287 "src/ast-parser.y" /* yacc.c:1257 */ + { wabt_destroy_script(&((*yyvaluep).script)); } +#line 1987 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ + break; + + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (WabtAstLexer* lexer, WabtAstParser* parser) +{ +/* The lookahead symbol. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + +/* Location data for the lookahead symbol. */ +static YYLTYPE yyloc_default +# if defined WABT_AST_PARSER_LTYPE_IS_TRIVIAL && WABT_AST_PARSER_LTYPE_IS_TRIVIAL + = { 1, 1, 1, 1 } +# endif +; +YYLTYPE yylloc = yyloc_default; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + 'yyss': related to states. + 'yyvs': related to semantic values. + 'yyls': related to locations. + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls; + YYLTYPE *yylsp; + + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[3]; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; + yylsp = yyls = yylsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + yylsp[0] = yylloc; + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; + + /* 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 yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); + + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); + YYSTACK_RELOCATE (yyls_alloc, yyls); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + yylsp = yyls + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* 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. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = yylex (&yylval, &yylloc, lexer, parser); + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + *++yylsp = yylloc; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 305 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtTextListNode* node = new_text_list_node(); + DUPTEXT(node->text, (yyvsp[0].text)); + node->next = NULL; + (yyval.text_list).first = (yyval.text_list).last = node; + } +#line 2286 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 3: +#line 311 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.text_list) = (yyvsp[-1].text_list); + WabtTextListNode* node = new_text_list_node(); + DUPTEXT(node->text, (yyvsp[0].text)); + node->next = NULL; + (yyval.text_list).last->next = node; + (yyval.text_list).last = node; + } +#line 2299 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 4: +#line 321 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.text_list).first = (yyval.text_list).last = NULL; } +#line 2305 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 6: +#line 326 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtTextListNode node; + node.text = (yyvsp[0].text); + node.next = NULL; + WabtTextList text_list; + text_list.first = &node; + text_list.last = &node; + void* data; + size_t size; + dup_text_list(&text_list, &data, &size); + (yyval.text).start = (const char*)data; + (yyval.text).length = size; + } +#line 2323 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 7: +#line 344 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.types)); } +#line 2329 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 8: +#line 345 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.types) = (yyvsp[-1].types); + wabt_append_type_value(&(yyval.types), &(yyvsp[0].type)); + } +#line 2338 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 9: +#line 351 "src/ast-parser.y" /* yacc.c:1646 */ + {} +#line 2344 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 10: +#line 354 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.global)); + (yyval.global).type = (yyvsp[0].type); + (yyval.global).mutable_ = false; + } +#line 2354 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 11: +#line 359 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.global)); + (yyval.global).type = (yyvsp[-1].type); + (yyval.global).mutable_ = true; + } +#line 2364 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 12: +#line 366 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.func_sig) = (yyvsp[-1].func_sig); } +#line 2370 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 13: +#line 369 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.func_sig)); } +#line 2376 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 14: +#line 370 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.func_sig)); + (yyval.func_sig).param_types = (yyvsp[-1].types); + } +#line 2385 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 15: +#line 374 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.func_sig)); + (yyval.func_sig).param_types = (yyvsp[-5].types); + (yyval.func_sig).result_types = (yyvsp[-1].types); + } +#line 2395 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 16: +#line 379 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.func_sig)); + (yyval.func_sig).result_types = (yyvsp[-1].types); + } +#line 2404 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 17: +#line 386 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.table).elem_limits = (yyvsp[-1].limits); } +#line 2410 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 18: +#line 389 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.memory).page_limits = (yyvsp[0].limits); } +#line 2416 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 19: +#line 392 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.limits).has_max = false; + (yyval.limits).initial = (yyvsp[0].u64); + (yyval.limits).max = 0; + } +#line 2426 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 20: +#line 397 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.limits).has_max = true; + (yyval.limits).initial = (yyvsp[-1].u64); + (yyval.limits).max = (yyvsp[0].u64); + } +#line 2436 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 21: +#line 404 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.var) = (yyvsp[-1].var); } +#line 2442 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 22: +#line 410 "src/ast-parser.y" /* yacc.c:1646 */ + { + if (WABT_FAILED(wabt_parse_uint64((yyvsp[0].literal).text.start, + (yyvsp[0].literal).text.start + (yyvsp[0].literal).text.length, &(yyval.u64)))) { + wabt_ast_parser_error(&(yylsp[0]), lexer, parser, + "invalid int " PRIstringslice "\"", + WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text)); + } + } +#line 2455 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 23: +#line 421 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.literal).type = (yyvsp[0].literal).type; + DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); + } +#line 2464 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 24: +#line 425 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.literal).type = (yyvsp[0].literal).type; + DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); + } +#line 2473 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 25: +#line 429 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.literal).type = (yyvsp[0].literal).type; + DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); + } +#line 2482 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 26: +#line 436 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.var).loc = (yylsp[0]); + (yyval.var).type = WABT_VAR_TYPE_INDEX; + (yyval.var).index = (yyvsp[0].u64); + } +#line 2492 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 27: +#line 441 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.var).loc = (yylsp[0]); + (yyval.var).type = WABT_VAR_TYPE_NAME; + DUPTEXT((yyval.var).name, (yyvsp[0].text)); + } +#line 2502 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 28: +#line 448 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.vars)); } +#line 2508 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 29: +#line 449 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.vars) = (yyvsp[-1].vars); + wabt_append_var_value(&(yyval.vars), &(yyvsp[0].var)); + } +#line 2517 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 30: +#line 455 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.text)); } +#line 2523 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 32: +#line 459 "src/ast-parser.y" /* yacc.c:1646 */ + { DUPTEXT((yyval.text), (yyvsp[0].text)); } +#line 2529 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 33: +#line 463 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.text)); } +#line 2535 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 35: +#line 468 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.u64) = 0; } +#line 2541 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 36: +#line 469 "src/ast-parser.y" /* yacc.c:1646 */ + { + if (WABT_FAILED(wabt_parse_int64((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &(yyval.u64), + WABT_PARSE_SIGNED_AND_UNSIGNED))) { + wabt_ast_parser_error(&(yylsp[0]), lexer, parser, + "invalid offset \"" PRIstringslice "\"", + WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].text))); + } + } +#line 2554 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 37: +#line 479 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.u32) = USE_NATURAL_ALIGNMENT; } +#line 2560 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 38: +#line 480 "src/ast-parser.y" /* yacc.c:1646 */ + { + if (WABT_FAILED(wabt_parse_int32((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &(yyval.u32), + WABT_PARSE_UNSIGNED_ONLY))) { + wabt_ast_parser_error(&(yylsp[0]), lexer, parser, + "invalid alignment \"" PRIstringslice "\"", + WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].text))); + } + } +#line 2573 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 39: +#line 491 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } +#line 2579 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 40: +#line 492 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } +#line 2585 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 41: +#line 493 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.expr_list) = (yyvsp[0].expr_list); } +#line 2591 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 42: +#line 496 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_unreachable_expr(); + } +#line 2599 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 43: +#line 499 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_nop_expr(); + } +#line 2607 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 44: +#line 502 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_drop_expr(); + } +#line 2615 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 45: +#line 505 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_select_expr(); + } +#line 2623 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 46: +#line 508 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_br_expr(); + (yyval.expr)->br.var = (yyvsp[0].var); + } +#line 2632 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 47: +#line 512 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_br_if_expr(); + (yyval.expr)->br_if.var = (yyvsp[0].var); + } +#line 2641 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 48: +#line 516 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_br_table_expr(); + (yyval.expr)->br_table.targets = (yyvsp[-1].vars); + (yyval.expr)->br_table.default_target = (yyvsp[0].var); + } +#line 2651 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 49: +#line 521 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_return_expr(); + } +#line 2659 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 50: +#line 524 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_call_expr(); + (yyval.expr)->call.var = (yyvsp[0].var); + } +#line 2668 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 51: +#line 528 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_call_indirect_expr(); + (yyval.expr)->call_indirect.var = (yyvsp[0].var); + } +#line 2677 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 52: +#line 532 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_get_local_expr(); + (yyval.expr)->get_local.var = (yyvsp[0].var); + } +#line 2686 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 53: +#line 536 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_set_local_expr(); + (yyval.expr)->set_local.var = (yyvsp[0].var); + } +#line 2695 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 54: +#line 540 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_tee_local_expr(); + (yyval.expr)->tee_local.var = (yyvsp[0].var); + } +#line 2704 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 55: +#line 544 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_get_global_expr(); + (yyval.expr)->get_global.var = (yyvsp[0].var); + } +#line 2713 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 56: +#line 548 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_set_global_expr(); + (yyval.expr)->set_global.var = (yyvsp[0].var); + } +#line 2722 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 57: +#line 552 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_load_expr(); + (yyval.expr)->load.opcode = (yyvsp[-2].opcode); + (yyval.expr)->load.offset = (yyvsp[-1].u64); + (yyval.expr)->load.align = (yyvsp[0].u32); + } +#line 2733 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 58: +#line 558 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_store_expr(); + (yyval.expr)->store.opcode = (yyvsp[-2].opcode); + (yyval.expr)->store.offset = (yyvsp[-1].u64); + (yyval.expr)->store.align = (yyvsp[0].u32); + } +#line 2744 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 59: +#line 564 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_const_expr(); + (yyval.expr)->const_.loc = (yylsp[-1]); + if (WABT_FAILED(parse_const((yyvsp[-1].type), (yyvsp[0].literal).type, (yyvsp[0].literal).text.start, + (yyvsp[0].literal).text.start + (yyvsp[0].literal).text.length, + &(yyval.expr)->const_))) { + wabt_ast_parser_error(&(yylsp[0]), lexer, parser, + "invalid literal \"" PRIstringslice "\"", + WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text)); + } + wabt_free((char*)(yyvsp[0].literal).text.start); + } +#line 2761 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 60: +#line 576 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_unary_expr(); + (yyval.expr)->unary.opcode = (yyvsp[0].opcode); + } +#line 2770 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 61: +#line 580 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_binary_expr(); + (yyval.expr)->binary.opcode = (yyvsp[0].opcode); + } +#line 2779 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 62: +#line 584 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_compare_expr(); + (yyval.expr)->compare.opcode = (yyvsp[0].opcode); + } +#line 2788 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 63: +#line 588 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_convert_expr(); + (yyval.expr)->convert.opcode = (yyvsp[0].opcode); + } +#line 2797 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 64: +#line 592 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_current_memory_expr(); + } +#line 2805 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 65: +#line 595 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_grow_memory_expr(); + } +#line 2813 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 66: +#line 600 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_block_expr(); + (yyval.expr)->block = (yyvsp[-2].block); + (yyval.expr)->block.label = (yyvsp[-3].text); + CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block.label, (yyvsp[0].text)); + } +#line 2824 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 67: +#line 606 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_loop_expr(); + (yyval.expr)->loop = (yyvsp[-2].block); + (yyval.expr)->loop.label = (yyvsp[-3].text); + CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block.label, (yyvsp[0].text)); + } +#line 2835 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 68: +#line 612 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_if_expr(); + (yyval.expr)->if_.true_ = (yyvsp[-2].block); + (yyval.expr)->if_.true_.label = (yyvsp[-3].text); + CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block.label, (yyvsp[0].text)); + } +#line 2846 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 69: +#line 618 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = wabt_new_if_expr(); + (yyval.expr)->if_.true_ = (yyvsp[-5].block); + (yyval.expr)->if_.true_.label = (yyvsp[-6].text); + (yyval.expr)->if_.false_ = (yyvsp[-2].expr_list).first; + CHECK_END_LABEL((yylsp[-3]), (yyval.expr)->block.label, (yyvsp[-3].text)); + CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block.label, (yyvsp[0].text)); + } +#line 2859 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 70: +#line 628 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.block)); + (yyval.block).sig = (yyvsp[-1].types); + (yyval.block).first = (yyvsp[0].expr_list).first; + } +#line 2869 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 71: +#line 636 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.expr_list) = (yyvsp[-1].expr_list); } +#line 2875 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 72: +#line 640 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[0].expr_list), (yyvsp[-1].expr)); + } +#line 2883 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 73: +#line 643 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_block_expr(); + expr->block = (yyvsp[0].block); + expr->block.label = (yyvsp[-1].text); + (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); + } +#line 2894 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 74: +#line 649 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_loop_expr(); + expr->loop = (yyvsp[0].block); + expr->loop.label = (yyvsp[-1].text); + (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); + } +#line 2905 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 75: +#line 655 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr_list) = (yyvsp[0].expr_list); + WabtExpr* if_ = (yyvsp[0].expr_list).last; + assert(if_->type == WABT_EXPR_TYPE_IF); + if_->if_.true_.label = (yyvsp[-2].text); + if_->if_.true_.sig = (yyvsp[-1].types); + } +#line 2917 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 76: +#line 664 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[-5].expr_list).first; + expr->if_.false_ = (yyvsp[-1].expr_list).first; + (yyval.expr_list) = join_exprs1(&(yylsp[-7]), expr); + } +#line 2928 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 77: +#line 670 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[-1].expr_list).first; + (yyval.expr_list) = join_exprs1(&(yylsp[-3]), expr); + } +#line 2938 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 78: +#line 675 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[-5].expr_list).first; + expr->if_.false_ = (yyvsp[-1].expr_list).first; + (yyval.expr_list) = join_exprs2(&(yylsp[-8]), &(yyvsp[-8].expr_list), expr); + } +#line 2949 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 79: +#line 681 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[-1].expr_list).first; + (yyval.expr_list) = join_exprs2(&(yylsp[-4]), &(yyvsp[-4].expr_list), expr); + } +#line 2959 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 80: +#line 686 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[-1].expr_list).first; + expr->if_.false_ = (yyvsp[0].expr_list).first; + (yyval.expr_list) = join_exprs2(&(yylsp[-2]), &(yyvsp[-2].expr_list), expr); + } +#line 2970 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 81: +#line 692 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_if_expr(); + expr->if_.true_.first = (yyvsp[0].expr_list).first; + (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[-1].expr_list), expr); + } +#line 2980 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 82: +#line 700 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.expr_list)); } +#line 2986 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 83: +#line 701 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr_list).first = (yyvsp[-1].expr_list).first; + (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; + (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; + (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; + } +#line 2997 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 84: +#line 709 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.expr_list)); } +#line 3003 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 85: +#line 710 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr_list).first = (yyvsp[-1].expr_list).first; + (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; + (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; + (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; + } +#line 3014 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 88: +#line 724 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_RESULT_TYPES; + (yyval.func_fields)->types = (yyvsp[-2].types); + (yyval.func_fields)->next = (yyvsp[0].func_fields); + } +#line 3025 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 89: +#line 730 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_PARAM_TYPES; + (yyval.func_fields)->types = (yyvsp[-2].types); + (yyval.func_fields)->next = (yyvsp[0].func_fields); + } +#line 3036 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 90: +#line 736 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_BOUND_PARAM; + (yyval.func_fields)->bound_type.loc = (yylsp[-4]); + (yyval.func_fields)->bound_type.name = (yyvsp[-3].text); + (yyval.func_fields)->bound_type.type = (yyvsp[-2].type); + (yyval.func_fields)->next = (yyvsp[0].func_fields); + } +#line 3049 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 91: +#line 746 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_EXPRS; + (yyval.func_fields)->first_expr = (yyvsp[0].expr_list).first; + (yyval.func_fields)->next = NULL; + } +#line 3060 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 92: +#line 752 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_LOCAL_TYPES; + (yyval.func_fields)->types = (yyvsp[-2].types); + (yyval.func_fields)->next = (yyvsp[0].func_fields); + } +#line 3071 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 93: +#line 758 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_fields) = new_func_field(); + (yyval.func_fields)->type = WABT_FUNC_FIELD_TYPE_BOUND_LOCAL; + (yyval.func_fields)->bound_type.loc = (yylsp[-4]); + (yyval.func_fields)->bound_type.name = (yyvsp[-3].text); + (yyval.func_fields)->bound_type.type = (yyvsp[-2].type); + (yyval.func_fields)->next = (yyvsp[0].func_fields); + } +#line 3084 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 94: +#line 768 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func) = new_func(); + WabtFuncField* field = (yyvsp[0].func_fields); + + while (field) { + WabtFuncField* next = field->next; + switch (field->type) { + case WABT_FUNC_FIELD_TYPE_EXPRS: + (yyval.func)->first_expr = field->first_expr; + break; + + case WABT_FUNC_FIELD_TYPE_PARAM_TYPES: + case WABT_FUNC_FIELD_TYPE_LOCAL_TYPES: { + WabtTypeVector* types = + field->type == WABT_FUNC_FIELD_TYPE_PARAM_TYPES + ? &(yyval.func)->decl.sig.param_types + : &(yyval.func)->local_types; + wabt_extend_types(types, &field->types); + wabt_destroy_type_vector(&field->types); + break; + } + + case WABT_FUNC_FIELD_TYPE_BOUND_PARAM: + case WABT_FUNC_FIELD_TYPE_BOUND_LOCAL: { + WabtTypeVector* types; + WabtBindingHash* bindings; + if (field->type == WABT_FUNC_FIELD_TYPE_BOUND_PARAM) { + types = &(yyval.func)->decl.sig.param_types; + bindings = &(yyval.func)->param_bindings; + } else { + types = &(yyval.func)->local_types; + bindings = &(yyval.func)->local_bindings; + } + + wabt_append_type_value(types, &field->bound_type.type); + WabtBinding* binding = + wabt_insert_binding(bindings, &field->bound_type.name); + binding->loc = field->bound_type.loc; + binding->index = types->size - 1; + break; + } + + case WABT_FUNC_FIELD_TYPE_RESULT_TYPES: + (yyval.func)->decl.sig.result_types = field->types; + break; + } + + /* we steal memory from the func field, but not the linked list nodes */ + wabt_free(field); + field = next; + } + } +#line 3141 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 95: +#line 822 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_func)); + (yyval.exported_func).func = (yyvsp[-1].func); + (yyval.exported_func).func->decl.flags |= WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE; + (yyval.exported_func).func->decl.type_var = (yyvsp[-2].var); + (yyval.exported_func).func->name = (yyvsp[-4].text); + (yyval.exported_func).export_ = (yyvsp[-3].optional_export); + } +#line 3154 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 96: +#line 831 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_func)); + (yyval.exported_func).func = (yyvsp[-1].func); + (yyval.exported_func).func->decl.flags |= WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE; + (yyval.exported_func).func->decl.type_var = (yyvsp[-2].var); + (yyval.exported_func).func->name = (yyvsp[-3].text); + } +#line 3166 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 97: +#line 838 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_func)); + (yyval.exported_func).func = (yyvsp[-1].func); + (yyval.exported_func).func->name = (yyvsp[-3].text); + (yyval.exported_func).export_ = (yyvsp[-2].optional_export); + } +#line 3177 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 98: +#line 845 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_func)); + (yyval.exported_func).func = (yyvsp[-1].func); + (yyval.exported_func).func->name = (yyvsp[-2].text); + } +#line 3187 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 99: +#line 855 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr_list) = (yyvsp[-1].expr_list); + } +#line 3195 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 101: +#line 862 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.elem_segment)); + (yyval.elem_segment).table_var = (yyvsp[-3].var); + (yyval.elem_segment).offset = (yyvsp[-2].expr_list).first; + (yyval.elem_segment).vars = (yyvsp[-1].vars); + } +#line 3206 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 102: +#line 868 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.elem_segment)); + (yyval.elem_segment).table_var.loc = (yylsp[-3]); + (yyval.elem_segment).table_var.type = WABT_VAR_TYPE_INDEX; + (yyval.elem_segment).table_var.index = 0; + (yyval.elem_segment).offset = (yyvsp[-2].expr_list).first; + (yyval.elem_segment).vars = (yyvsp[-1].vars); + } +#line 3219 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 103: +#line 879 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.exported_table).table = (yyvsp[-1].table); + (yyval.exported_table).table.name = (yyvsp[-3].text); + (yyval.exported_table).has_elem_segment = false; + (yyval.exported_table).export_ = (yyvsp[-2].optional_export); + } +#line 3230 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 104: +#line 886 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_const_expr(); + expr->loc = (yylsp[-8]); + expr->const_.type = WABT_TYPE_I32; + expr->const_.u32 = 0; + + WABT_ZERO_MEMORY((yyval.exported_table)); + (yyval.exported_table).table.name = (yyvsp[-7].text); + (yyval.exported_table).table.elem_limits.initial = (yyvsp[-2].vars).size; + (yyval.exported_table).table.elem_limits.max = (yyvsp[-2].vars).size; + (yyval.exported_table).table.elem_limits.has_max = true; + (yyval.exported_table).has_elem_segment = true; + (yyval.exported_table).elem_segment.offset = expr; + (yyval.exported_table).elem_segment.vars = (yyvsp[-2].vars); + (yyval.exported_table).export_ = (yyvsp[-6].optional_export); + } +#line 3251 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 105: +#line 905 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.data_segment)); + (yyval.data_segment).memory_var = (yyvsp[-3].var); + (yyval.data_segment).offset = (yyvsp[-2].expr_list).first; + dup_text_list(&(yyvsp[-1].text_list), &(yyval.data_segment).data, &(yyval.data_segment).size); + wabt_destroy_text_list(&(yyvsp[-1].text_list)); + } +#line 3263 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 106: +#line 912 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.data_segment)); + (yyval.data_segment).memory_var.loc = (yylsp[-3]); + (yyval.data_segment).memory_var.type = WABT_VAR_TYPE_INDEX; + (yyval.data_segment).memory_var.index = 0; + (yyval.data_segment).offset = (yyvsp[-2].expr_list).first; + dup_text_list(&(yyvsp[-1].text_list), &(yyval.data_segment).data, &(yyval.data_segment).size); + wabt_destroy_text_list(&(yyvsp[-1].text_list)); + } +#line 3277 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 107: +#line 924 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_memory)); + (yyval.exported_memory).memory = (yyvsp[-1].memory); + (yyval.exported_memory).memory.name = (yyvsp[-3].text); + (yyval.exported_memory).has_data_segment = false; + (yyval.exported_memory).export_ = (yyvsp[-2].optional_export); + } +#line 3289 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 108: +#line 931 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_const_expr(); + expr->loc = (yylsp[-7]); + expr->const_.type = WABT_TYPE_I32; + expr->const_.u32 = 0; + + WABT_ZERO_MEMORY((yyval.exported_memory)); + (yyval.exported_memory).has_data_segment = true; + (yyval.exported_memory).data_segment.offset = expr; + dup_text_list(&(yyvsp[-2].text_list), &(yyval.exported_memory).data_segment.data, &(yyval.exported_memory).data_segment.size); + wabt_destroy_text_list(&(yyvsp[-2].text_list)); + uint32_t byte_size = WABT_ALIGN_UP_TO_PAGE((yyval.exported_memory).data_segment.size); + uint32_t page_size = WABT_BYTES_TO_PAGES(byte_size); + (yyval.exported_memory).memory.name = (yyvsp[-6].text); + (yyval.exported_memory).memory.page_limits.initial = page_size; + (yyval.exported_memory).memory.page_limits.max = page_size; + (yyval.exported_memory).memory.page_limits.has_max = true; + (yyval.exported_memory).export_ = (yyvsp[-5].optional_export); + } +#line 3313 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 109: +#line 951 "src/ast-parser.y" /* yacc.c:1646 */ + { + WabtExpr* expr = wabt_new_const_expr(); + expr->loc = (yylsp[-6]); + expr->const_.type = WABT_TYPE_I32; + expr->const_.u32 = 0; + + WABT_ZERO_MEMORY((yyval.exported_memory)); + (yyval.exported_memory).has_data_segment = true; + (yyval.exported_memory).data_segment.offset = expr; + dup_text_list(&(yyvsp[-2].text_list), &(yyval.exported_memory).data_segment.data, &(yyval.exported_memory).data_segment.size); + wabt_destroy_text_list(&(yyvsp[-2].text_list)); + uint32_t byte_size = WABT_ALIGN_UP_TO_PAGE((yyval.exported_memory).data_segment.size); + uint32_t page_size = WABT_BYTES_TO_PAGES(byte_size); + (yyval.exported_memory).memory.name = (yyvsp[-5].text); + (yyval.exported_memory).memory.page_limits.initial = page_size; + (yyval.exported_memory).memory.page_limits.max = page_size; + (yyval.exported_memory).memory.page_limits.has_max = true; + (yyval.exported_memory).export_.has_export = false; + } +#line 3337 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 110: +#line 973 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_global)); + (yyval.exported_global).global = (yyvsp[-2].global); + (yyval.exported_global).global.name = (yyvsp[-4].text); + (yyval.exported_global).global.init_expr = (yyvsp[-1].expr_list).first; + (yyval.exported_global).export_ = (yyvsp[-3].optional_export); + } +#line 3349 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 111: +#line 980 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.exported_global)); + (yyval.exported_global).global = (yyvsp[-2].global); + (yyval.exported_global).global.name = (yyvsp[-3].text); + (yyval.exported_global).global.init_expr = (yyvsp[-1].expr_list).first; + (yyval.exported_global).export_.has_export = false; + } +#line 3361 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 112: +#line 993 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->kind = WABT_EXTERNAL_KIND_FUNC; + (yyval.import)->func.name = (yyvsp[-2].text); + (yyval.import)->func.decl.flags = WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE; + (yyval.import)->func.decl.type_var = (yyvsp[-1].var); + } +#line 3373 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 113: +#line 1000 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->kind = WABT_EXTERNAL_KIND_FUNC; + (yyval.import)->func.name = (yyvsp[-2].text); + (yyval.import)->func.decl.sig = (yyvsp[-1].func_sig); + } +#line 3384 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 114: +#line 1006 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->kind = WABT_EXTERNAL_KIND_TABLE; + (yyval.import)->table = (yyvsp[-1].table); + (yyval.import)->table.name = (yyvsp[-2].text); + } +#line 3395 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 115: +#line 1012 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->kind = WABT_EXTERNAL_KIND_MEMORY; + (yyval.import)->memory = (yyvsp[-1].memory); + (yyval.import)->memory.name = (yyvsp[-2].text); + } +#line 3406 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 116: +#line 1018 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->kind = WABT_EXTERNAL_KIND_GLOBAL; + (yyval.import)->global = (yyvsp[-1].global); + (yyval.import)->global.name = (yyvsp[-2].text); + } +#line 3417 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 117: +#line 1026 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-1].import); + (yyval.import)->module_name = (yyvsp[-3].text); + (yyval.import)->field_name = (yyvsp[-2].text); + } +#line 3427 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 118: +#line 1031 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-2].import); + (yyval.import)->kind = WABT_EXTERNAL_KIND_FUNC; + (yyval.import)->func.name = (yyvsp[-3].text); + (yyval.import)->func.decl.flags = WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE; + (yyval.import)->func.decl.type_var = (yyvsp[-1].var); + } +#line 3439 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 119: +#line 1038 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-2].import); + (yyval.import)->kind = WABT_EXTERNAL_KIND_FUNC; + (yyval.import)->func.name = (yyvsp[-3].text); + (yyval.import)->func.decl.sig = (yyvsp[-1].func_sig); + } +#line 3450 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 120: +#line 1044 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-2].import); + (yyval.import)->kind = WABT_EXTERNAL_KIND_TABLE; + (yyval.import)->table = (yyvsp[-1].table); + (yyval.import)->table.name = (yyvsp[-3].text); + } +#line 3461 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 121: +#line 1050 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-2].import); + (yyval.import)->kind = WABT_EXTERNAL_KIND_MEMORY; + (yyval.import)->memory = (yyvsp[-1].memory); + (yyval.import)->memory.name = (yyvsp[-3].text); + } +#line 3472 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 122: +#line 1056 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = (yyvsp[-2].import); + (yyval.import)->kind = WABT_EXTERNAL_KIND_GLOBAL; + (yyval.import)->global = (yyvsp[-1].global); + (yyval.import)->global.name = (yyvsp[-3].text); + } +#line 3483 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 123: +#line 1065 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.import) = new_import(); + (yyval.import)->module_name = (yyvsp[-2].text); + (yyval.import)->field_name = (yyvsp[-1].text); + } +#line 3493 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 124: +#line 1073 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.export_)); + (yyval.export_).kind = WABT_EXTERNAL_KIND_FUNC; + (yyval.export_).var = (yyvsp[-1].var); + } +#line 3503 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 125: +#line 1078 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.export_)); + (yyval.export_).kind = WABT_EXTERNAL_KIND_TABLE; + (yyval.export_).var = (yyvsp[-1].var); + } +#line 3513 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 126: +#line 1083 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.export_)); + (yyval.export_).kind = WABT_EXTERNAL_KIND_MEMORY; + (yyval.export_).var = (yyvsp[-1].var); + } +#line 3523 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 127: +#line 1088 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.export_)); + (yyval.export_).kind = WABT_EXTERNAL_KIND_GLOBAL; + (yyval.export_).var = (yyvsp[-1].var); + } +#line 3533 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 128: +#line 1095 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.export_) = (yyvsp[-1].export_); + (yyval.export_).name = (yyvsp[-2].text); + } +#line 3542 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 129: +#line 1102 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.optional_export)); + (yyval.optional_export).has_export = false; + } +#line 3551 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 131: +#line 1109 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.optional_export)); + (yyval.optional_export).has_export = true; + (yyval.optional_export).export_.name = (yyvsp[-1].text); + } +#line 3561 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 132: +#line 1120 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.func_type)); + (yyval.func_type).sig = (yyvsp[-1].func_sig); + } +#line 3570 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 133: +#line 1124 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.func_type).name = (yyvsp[-2].text); + (yyval.func_type).sig = (yyvsp[-1].func_sig); + } +#line 3579 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 134: +#line 1131 "src/ast-parser.y" /* yacc.c:1646 */ + { (yyval.var) = (yyvsp[-1].var); } +#line 3585 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 135: +#line 1135 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = new_module(); + } +#line 3593 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 136: +#line 1138 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, FUNC_TYPE, func_type, (yylsp[0]), (yyvsp[0].func_type)); + APPEND_ITEM_TO_VECTOR((yyval.module), FuncType, func_type, func_types, + &field->func_type); + INSERT_BINDING((yyval.module), func_type, func_types, (yylsp[0]), (yyvsp[0].func_type).name); + } +#line 3606 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 137: +#line 1146 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, GLOBAL, global, (yylsp[0]), (yyvsp[0].exported_global).global); + APPEND_ITEM_TO_VECTOR((yyval.module), Global, global, globals, &field->global); + INSERT_BINDING((yyval.module), global, globals, (yylsp[0]), (yyvsp[0].exported_global).global.name); + APPEND_INLINE_EXPORT((yyval.module), GLOBAL, (yylsp[0]), (yyvsp[0].exported_global), (yyval.module)->globals.size - 1); + } +#line 3619 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 138: +#line 1154 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, TABLE, table, (yylsp[0]), (yyvsp[0].exported_table).table); + APPEND_ITEM_TO_VECTOR((yyval.module), Table, table, tables, &field->table); + INSERT_BINDING((yyval.module), table, tables, (yylsp[0]), (yyvsp[0].exported_table).table.name); + APPEND_INLINE_EXPORT((yyval.module), TABLE, (yylsp[0]), (yyvsp[0].exported_table), (yyval.module)->tables.size - 1); + + if ((yyvsp[0].exported_table).has_elem_segment) { + WabtModuleField* elem_segment_field; + APPEND_FIELD_TO_LIST((yyval.module), elem_segment_field, ELEM_SEGMENT, elem_segment, + (yylsp[0]), (yyvsp[0].exported_table).elem_segment); + APPEND_ITEM_TO_VECTOR((yyval.module), ElemSegment, elem_segment, elem_segments, + &elem_segment_field->elem_segment); + } + + } +#line 3641 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 139: +#line 1171 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, MEMORY, memory, (yylsp[0]), (yyvsp[0].exported_memory).memory); + APPEND_ITEM_TO_VECTOR((yyval.module), Memory, memory, memories, &field->memory); + INSERT_BINDING((yyval.module), memory, memories, (yylsp[0]), (yyvsp[0].exported_memory).memory.name); + APPEND_INLINE_EXPORT((yyval.module), MEMORY, (yylsp[0]), (yyvsp[0].exported_memory), (yyval.module)->memories.size - 1); + + if ((yyvsp[0].exported_memory).has_data_segment) { + WabtModuleField* data_segment_field; + APPEND_FIELD_TO_LIST((yyval.module), data_segment_field, DATA_SEGMENT, data_segment, + (yylsp[0]), (yyvsp[0].exported_memory).data_segment); + APPEND_ITEM_TO_VECTOR((yyval.module), DataSegment, data_segment, data_segments, + &data_segment_field->data_segment); + } + } +#line 3662 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 140: +#line 1187 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, FUNC, func, (yylsp[0]), *(yyvsp[0].exported_func).func); + append_implicit_func_declaration(&(yylsp[0]), (yyval.module), &field->func.decl); + APPEND_ITEM_TO_VECTOR((yyval.module), Func, func, funcs, &field->func); + INSERT_BINDING((yyval.module), func, funcs, (yylsp[0]), (yyvsp[0].exported_func).func->name); + APPEND_INLINE_EXPORT((yyval.module), FUNC, (yylsp[0]), (yyvsp[0].exported_func), (yyval.module)->funcs.size - 1); + wabt_free((yyvsp[0].exported_func).func); + } +#line 3677 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 141: +#line 1197 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, ELEM_SEGMENT, elem_segment, (yylsp[0]), (yyvsp[0].elem_segment)); + APPEND_ITEM_TO_VECTOR((yyval.module), ElemSegment, elem_segment, elem_segments, + &field->elem_segment); + } +#line 3689 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 142: +#line 1204 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, DATA_SEGMENT, data_segment, (yylsp[0]), (yyvsp[0].data_segment)); + APPEND_ITEM_TO_VECTOR((yyval.module), DataSegment, data_segment, data_segments, + &field->data_segment); + } +#line 3701 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 143: +#line 1211 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, START, start, (yylsp[0]), (yyvsp[0].var)); + (yyval.module)->start = &field->start; + } +#line 3712 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 144: +#line 1217 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field; + APPEND_FIELD_TO_LIST((yyval.module), field, IMPORT, import, (yylsp[0]), *(yyvsp[0].import)); + CHECK_IMPORT_ORDERING((yyval.module), func, funcs, (yylsp[0])); + CHECK_IMPORT_ORDERING((yyval.module), table, tables, (yylsp[0])); + CHECK_IMPORT_ORDERING((yyval.module), memory, memories, (yylsp[0])); + CHECK_IMPORT_ORDERING((yyval.module), global, globals, (yylsp[0])); + switch ((yyvsp[0].import)->kind) { + case WABT_EXTERNAL_KIND_FUNC: + append_implicit_func_declaration(&(yylsp[0]), (yyval.module), &field->import.func.decl); + APPEND_ITEM_TO_VECTOR((yyval.module), Func, func, funcs, &field->import.func); + INSERT_BINDING((yyval.module), func, funcs, (yylsp[0]), field->import.func.name); + (yyval.module)->num_func_imports++; + break; + case WABT_EXTERNAL_KIND_TABLE: + APPEND_ITEM_TO_VECTOR((yyval.module), Table, table, tables, &field->import.table); + INSERT_BINDING((yyval.module), table, tables, (yylsp[0]), field->import.table.name); + (yyval.module)->num_table_imports++; + break; + case WABT_EXTERNAL_KIND_MEMORY: + APPEND_ITEM_TO_VECTOR((yyval.module), Memory, memory, memories, + &field->import.memory); + INSERT_BINDING((yyval.module), memory, memories, (yylsp[0]), field->import.memory.name); + (yyval.module)->num_memory_imports++; + break; + case WABT_EXTERNAL_KIND_GLOBAL: + APPEND_ITEM_TO_VECTOR((yyval.module), Global, global, globals, + &field->import.global); + INSERT_BINDING((yyval.module), global, globals, (yylsp[0]), field->import.global.name); + (yyval.module)->num_global_imports++; + break; + case WABT_NUM_EXTERNAL_KINDS: + assert(0); + break; + } + wabt_free((yyvsp[0].import)); + APPEND_ITEM_TO_VECTOR((yyval.module), Import, import, imports, &field->import); + } +#line 3756 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 145: +#line 1256 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.module) = (yyvsp[-1].module); + WabtModuleField* field = wabt_append_module_field((yyval.module)); + APPEND_FIELD_TO_LIST((yyval.module), field, EXPORT, export_, (yylsp[0]), (yyvsp[0].export_)); + APPEND_ITEM_TO_VECTOR((yyval.module), Export, export, exports, &field->export_); + INSERT_BINDING((yyval.module), export, exports, (yylsp[0]), (yyvsp[0].export_).name); + } +#line 3768 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 146: +#line 1266 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.raw_module).type = WABT_RAW_MODULE_TYPE_TEXT; + (yyval.raw_module).text = (yyvsp[-1].module); + (yyval.raw_module).text->name = (yyvsp[-2].text); + (yyval.raw_module).text->loc = (yylsp[-3]); + + /* resolve func type variables where the signature was not specified + * explicitly */ + size_t i; + for (i = 0; i < (yyvsp[-1].module)->funcs.size; ++i) { + WabtFunc* func = (yyvsp[-1].module)->funcs.data[i]; + if (wabt_decl_has_func_type(&func->decl) && + is_empty_signature(&func->decl.sig)) { + WabtFuncType* func_type = + wabt_get_func_type_by_var((yyvsp[-1].module), &func->decl.type_var); + if (func_type) { + func->decl.sig = func_type->sig; + func->decl.flags |= WABT_FUNC_DECLARATION_FLAG_SHARED_SIGNATURE; + } + } + } + } +#line 3795 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 147: +#line 1288 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.raw_module).type = WABT_RAW_MODULE_TYPE_BINARY; + (yyval.raw_module).binary.name = (yyvsp[-2].text); + (yyval.raw_module).binary.loc = (yylsp[-3]); + dup_text_list(&(yyvsp[-1].text_list), &(yyval.raw_module).binary.data, &(yyval.raw_module).binary.size); + wabt_destroy_text_list(&(yyvsp[-1].text_list)); + } +#line 3807 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 148: +#line 1298 "src/ast-parser.y" /* yacc.c:1646 */ + { + if ((yyvsp[0].raw_module).type == WABT_RAW_MODULE_TYPE_TEXT) { + (yyval.module) = (yyvsp[0].raw_module).text; + } else { + assert((yyvsp[0].raw_module).type == WABT_RAW_MODULE_TYPE_BINARY); + (yyval.module) = new_module(); + WabtReadBinaryOptions options = WABT_READ_BINARY_OPTIONS_DEFAULT; + BinaryErrorCallbackData user_data; + user_data.loc = &(yyvsp[0].raw_module).binary.loc; + user_data.lexer = lexer; + user_data.parser = parser; + WabtBinaryErrorHandler error_handler; + error_handler.on_error = on_read_binary_error; + error_handler.user_data = &user_data; + wabt_read_binary_ast((yyvsp[0].raw_module).binary.data, (yyvsp[0].raw_module).binary.size, &options, + &error_handler, (yyval.module)); + wabt_free((yyvsp[0].raw_module).binary.data); + (yyval.module)->name = (yyvsp[0].raw_module).binary.name; + (yyval.module)->loc = (yyvsp[0].raw_module).binary.loc; + } + } +#line 3833 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 149: +#line 1324 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.var)); + (yyval.var).type = WABT_VAR_TYPE_INDEX; + (yyval.var).index = INVALID_VAR_INDEX; + } +#line 3843 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 150: +#line 1329 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.var)); + (yyval.var).type = WABT_VAR_TYPE_NAME; + DUPTEXT((yyval.var).name, (yyvsp[0].text)); + } +#line 3853 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 151: +#line 1337 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.action)); + (yyval.action).loc = (yylsp[-4]); + (yyval.action).module_var = (yyvsp[-3].var); + (yyval.action).type = WABT_ACTION_TYPE_INVOKE; + (yyval.action).invoke.name = (yyvsp[-2].text); + (yyval.action).invoke.args = (yyvsp[-1].consts); + } +#line 3866 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 152: +#line 1345 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.action)); + (yyval.action).loc = (yylsp[-3]); + (yyval.action).module_var = (yyvsp[-2].var); + (yyval.action).type = WABT_ACTION_TYPE_GET; + (yyval.action).invoke.name = (yyvsp[-1].text); + } +#line 3878 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 153: +#line 1355 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_MALFORMED; + (yyval.command)->assert_malformed.module = (yyvsp[-2].raw_module); + (yyval.command)->assert_malformed.text = (yyvsp[-1].text); + } +#line 3889 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 154: +#line 1361 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_INVALID; + (yyval.command)->assert_invalid.module = (yyvsp[-2].raw_module); + (yyval.command)->assert_invalid.text = (yyvsp[-1].text); + } +#line 3900 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 155: +#line 1367 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_UNLINKABLE; + (yyval.command)->assert_unlinkable.module = (yyvsp[-2].raw_module); + (yyval.command)->assert_unlinkable.text = (yyvsp[-1].text); + } +#line 3911 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 156: +#line 1373 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_UNINSTANTIABLE; + (yyval.command)->assert_uninstantiable.module = (yyvsp[-2].raw_module); + (yyval.command)->assert_uninstantiable.text = (yyvsp[-1].text); + } +#line 3922 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 157: +#line 1379 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_RETURN; + (yyval.command)->assert_return.action = (yyvsp[-2].action); + (yyval.command)->assert_return.expected = (yyvsp[-1].consts); + } +#line 3933 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 158: +#line 1385 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_RETURN_NAN; + (yyval.command)->assert_return_nan.action = (yyvsp[-1].action); + } +#line 3943 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 159: +#line 1390 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_TRAP; + (yyval.command)->assert_trap.action = (yyvsp[-2].action); + (yyval.command)->assert_trap.text = (yyvsp[-1].text); + } +#line 3954 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 160: +#line 1396 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ASSERT_EXHAUSTION; + (yyval.command)->assert_trap.action = (yyvsp[-2].action); + (yyval.command)->assert_trap.text = (yyvsp[-1].text); + } +#line 3965 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 161: +#line 1405 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_ACTION; + (yyval.command)->action = (yyvsp[0].action); + } +#line 3975 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 163: +#line 1411 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_MODULE; + (yyval.command)->module = *(yyvsp[0].module); + wabt_free((yyvsp[0].module)); + } +#line 3986 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 164: +#line 1417 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.command) = new_command(); + (yyval.command)->type = WABT_COMMAND_TYPE_REGISTER; + (yyval.command)->register_.module_name = (yyvsp[-2].text); + (yyval.command)->register_.var = (yyvsp[-1].var); + (yyval.command)->register_.var.loc = (yylsp[-1]); + } +#line 3998 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 165: +#line 1426 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.commands)); } +#line 4004 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 166: +#line 1427 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.commands) = (yyvsp[-1].commands); + wabt_append_command_value(&(yyval.commands), (yyvsp[0].command)); + wabt_free((yyvsp[0].command)); + } +#line 4014 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 167: +#line 1435 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.const_).loc = (yylsp[-2]); + if (WABT_FAILED(parse_const((yyvsp[-2].type), (yyvsp[-1].literal).type, (yyvsp[-1].literal).text.start, + (yyvsp[-1].literal).text.start + (yyvsp[-1].literal).text.length, &(yyval.const_)))) { + wabt_ast_parser_error(&(yylsp[-1]), lexer, parser, + "invalid literal \"" PRIstringslice "\"", + WABT_PRINTF_STRING_SLICE_ARG((yyvsp[-1].literal).text)); + } + wabt_free((char*)(yyvsp[-1].literal).text.start); + } +#line 4029 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 168: +#line 1447 "src/ast-parser.y" /* yacc.c:1646 */ + { WABT_ZERO_MEMORY((yyval.consts)); } +#line 4035 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 169: +#line 1448 "src/ast-parser.y" /* yacc.c:1646 */ + { + (yyval.consts) = (yyvsp[-1].consts); + wabt_append_const_value(&(yyval.consts), &(yyvsp[0].const_)); + } +#line 4044 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 170: +#line 1455 "src/ast-parser.y" /* yacc.c:1646 */ + { + WABT_ZERO_MEMORY((yyval.script)); + (yyval.script).commands = (yyvsp[0].commands); + + int last_module_index = -1; + size_t i; + for (i = 0; i < (yyval.script).commands.size; ++i) { + WabtCommand* command = &(yyval.script).commands.data[i]; + WabtVar* module_var = NULL; + switch (command->type) { + case WABT_COMMAND_TYPE_MODULE: { + last_module_index = i; + + /* Wire up module name bindings. */ + WabtModule* module = &command->module; + if (module->name.length == 0) + continue; + + WabtStringSlice module_name = wabt_dup_string_slice(module->name); + WabtBinding* binding = + wabt_insert_binding(&(yyval.script).module_bindings, &module_name); + binding->loc = module->loc; + binding->index = i; + break; + } + + case WABT_COMMAND_TYPE_ASSERT_RETURN: + module_var = &command->assert_return.action.module_var; + goto has_module_var; + case WABT_COMMAND_TYPE_ASSERT_RETURN_NAN: + module_var = &command->assert_return_nan.action.module_var; + goto has_module_var; + case WABT_COMMAND_TYPE_ASSERT_TRAP: + case WABT_COMMAND_TYPE_ASSERT_EXHAUSTION: + module_var = &command->assert_trap.action.module_var; + goto has_module_var; + case WABT_COMMAND_TYPE_ACTION: + module_var = &command->action.module_var; + goto has_module_var; + case WABT_COMMAND_TYPE_REGISTER: + module_var = &command->register_.var; + goto has_module_var; + + has_module_var: { + /* Resolve actions with an invalid index to use the preceding + * module. */ + if (module_var->type == WABT_VAR_TYPE_INDEX && + module_var->index == INVALID_VAR_INDEX) { + module_var->index = last_module_index; + } + break; + } + + default: + break; + } + } + parser->script = (yyval.script); + } +#line 4108 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + break; + + +#line 4112 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + *++yylsp = yyloc; + + /* 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. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (&yylloc, lexer, parser, YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (&yylloc, lexer, parser, yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + yyerror_range[1] = yylloc; + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc, lexer, parser); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + yyerror_range[1] = yylsp[1-yylen]; + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + yyerror_range[1] = *yylsp; + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yylsp, lexer, parser); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + yyerror_range[2] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + the lookahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, yyerror_range, 2); + *++yylsp = yyloc; + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined yyoverflow || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (&yylloc, lexer, parser, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, &yylloc, lexer, parser); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yylsp, lexer, parser); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + return yyresult; +} +#line 1522 "src/ast-parser.y" /* yacc.c:1906 */ + + +static void append_expr_list(WabtExprList* expr_list, WabtExprList* expr) { + if (!expr->first) + return; + if (expr_list->last) + expr_list->last->next = expr->first; + else + expr_list->first = expr->first; + expr_list->last = expr->last; + expr_list->size += expr->size; +} + +static void append_expr(WabtExprList* expr_list, WabtExpr* expr) { + if (expr_list->last) + expr_list->last->next = expr; + else + expr_list->first = expr; + expr_list->last = expr; + expr_list->size++; +} + +static WabtExprList join_exprs1(WabtLocation* loc, WabtExpr* expr1) { + WabtExprList result; + WABT_ZERO_MEMORY(result); + append_expr(&result, expr1); + expr1->loc = *loc; + return result; +} + +static WabtExprList join_exprs2(WabtLocation* loc, WabtExprList* expr1, + WabtExpr* expr2) { + WabtExprList result; + WABT_ZERO_MEMORY(result); + append_expr_list(&result, expr1); + append_expr(&result, expr2); + expr2->loc = *loc; + return result; +} + +static WabtResult parse_const(WabtType type, + WabtLiteralType literal_type, + const char* s, + const char* end, + WabtConst* out) { + out->type = type; + switch (type) { + case WABT_TYPE_I32: + return wabt_parse_int32(s, end, &out->u32, + WABT_PARSE_SIGNED_AND_UNSIGNED); + case WABT_TYPE_I64: + return wabt_parse_int64(s, end, &out->u64, + WABT_PARSE_SIGNED_AND_UNSIGNED); + case WABT_TYPE_F32: + return wabt_parse_float(literal_type, s, end, &out->f32_bits); + case WABT_TYPE_F64: + return wabt_parse_double(literal_type, s, end, &out->f64_bits); + default: + assert(0); + break; + } + return WABT_ERROR; +} + +static size_t copy_string_contents(WabtStringSlice* text, char* dest) { + const char* src = text->start + 1; + const char* end = text->start + text->length - 1; + + char* dest_start = dest; + + while (src < end) { + if (*src == '\\') { + src++; + switch (*src) { + case 'n': + *dest++ = '\n'; + break; + case 't': + *dest++ = '\t'; + break; + case '\\': + *dest++ = '\\'; + break; + case '\'': + *dest++ = '\''; + break; + case '\"': + *dest++ = '\"'; + break; + default: { + /* The string should be validated already, so we know this is a hex + * sequence */ + uint32_t hi; + uint32_t lo; + if (WABT_SUCCEEDED(wabt_parse_hexdigit(src[0], &hi)) && + WABT_SUCCEEDED(wabt_parse_hexdigit(src[1], &lo))) { + *dest++ = (hi << 4) | lo; + } else { + assert(0); + } + src++; + break; + } + } + src++; + } else { + *dest++ = *src++; + } + } + /* return the data length */ + return dest - dest_start; +} + +static void dup_text_list(WabtTextList* text_list, + void** out_data, + size_t* out_size) { + /* walk the linked list to see how much total space is needed */ + size_t total_size = 0; + WabtTextListNode* node; + for (node = text_list->first; node; node = node->next) { + /* Always allocate enough space for the entire string including the escape + * characters. It will only get shorter, and this way we only have to + * iterate through the string once. */ + const char* src = node->text.start + 1; + const char* end = node->text.start + node->text.length - 1; + size_t size = (end > src) ? (end - src) : 0; + total_size += size; + } + char* result = (char*)wabt_alloc(total_size); + char* dest = result; + for (node = text_list->first; node; node = node->next) { + size_t actual_size = copy_string_contents(&node->text, dest); + dest += actual_size; + } + *out_data = result; + *out_size = dest - result; +} + +static bool is_empty_signature(WabtFuncSignature* sig) { + return sig->result_types.size == 0 && sig->param_types.size == 0; +} + +static void append_implicit_func_declaration(WabtLocation* loc, + WabtModule* module, + WabtFuncDeclaration* decl) { + if (wabt_decl_has_func_type(decl)) + return; + + int sig_index = wabt_get_func_type_index_by_decl(module, decl); + if (sig_index == -1) { + wabt_append_implicit_func_type(loc, module, &decl->sig); + } else { + /* signature already exists, share that one and destroy this one */ + wabt_destroy_func_signature(&decl->sig); + WabtFuncSignature* sig = &module->func_types.data[sig_index]->sig; + decl->sig = *sig; + } + + decl->flags |= WABT_FUNC_DECLARATION_FLAG_SHARED_SIGNATURE; +} + +WabtResult wabt_parse_ast(WabtAstLexer* lexer, + struct WabtScript* out_script, + WabtSourceErrorHandler* error_handler) { + WabtAstParser parser; + WABT_ZERO_MEMORY(parser); + parser.error_handler = error_handler; + int result = wabt_ast_parser_parse(lexer, &parser); + wabt_free(parser.yyssa); + wabt_free(parser.yyvsa); + wabt_free(parser.yylsa); + *out_script = parser.script; + return result == 0 && parser.errors == 0 ? WABT_OK : WABT_ERROR; +} + +static void on_read_binary_error(uint32_t offset, const char* error, + void* user_data) { + BinaryErrorCallbackData* data = (BinaryErrorCallbackData*)user_data; + if (offset == WABT_UNKNOWN_OFFSET) { + wabt_ast_parser_error(data->loc, data->lexer, data->parser, + "error in binary module: %s", error); + } else { + wabt_ast_parser_error(data->loc, data->lexer, data->parser, + "error in binary module: @0x%08x: %s", offset, error); + } +} |