preprocessor_tab_autogen.cpp (61170B)
1 /* A Bison parser, made by GNU Bison 3.8.2. */ 2 3 /* Bison implementation for Yacc-like parsers in C 4 5 Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, 6 Inc. 7 8 This program is free software: you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation, either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 20 21 /* As a special exception, you may create a larger work that contains 22 part or all of the Bison parser skeleton and distribute that work 23 under terms of your choice, so long as that work isn't itself a 24 parser generator using the skeleton or a modified version thereof 25 as a parser skeleton. Alternatively, if you modify or redistribute 26 the parser skeleton itself, you may (at your option) remove this 27 special exception, which will cause the skeleton and the resulting 28 Bison output files to be licensed under the GNU General Public 29 License without this special exception. 30 31 This special exception was added by the Free Software Foundation in 32 version 2.2 of Bison. */ 33 34 /* C LALR(1) parser skeleton written by Richard Stallman, by 35 simplifying the original so-called "semantic" parser. */ 36 37 /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, 38 especially those whose name start with YY_ or yy_. They are 39 private implementation details that can be changed or removed. */ 40 41 /* All symbols defined below should begin with yy or YY, to avoid 42 infringing on user name space. This should be done even for local 43 variables, as they might otherwise be expanded by user macros. 44 There are some unavoidable exceptions within include files to 45 define necessary library symbols; they are noted "INFRINGES ON 46 USER NAME SPACE" below. */ 47 48 /* Identify Bison output, and Bison version. */ 49 #define YYBISON 30802 50 51 /* Bison version string. */ 52 #define YYBISON_VERSION "3.8.2" 53 54 /* Skeleton name. */ 55 #define YYSKELETON_NAME "yacc.c" 56 57 /* Pure parsers. */ 58 #define YYPURE 1 59 60 /* Push parsers. */ 61 #define YYPUSH 0 62 63 /* Pull parsers. */ 64 #define YYPULL 1 65 66 /* Substitute the type names. */ 67 #define YYSTYPE PPSTYPE 68 /* Substitute the variable and function names. */ 69 #define yyparse ppparse 70 #define yylex pplex 71 #define yyerror pperror 72 #define yydebug ppdebug 73 #define yynerrs ppnerrs 74 75 /* First part of user prologue. */ 76 77 // GENERATED FILE - DO NOT EDIT. 78 // Generated by generate_parser.py from preprocessor.y 79 // 80 // Copyright 2019 The ANGLE Project Authors. All rights reserved. 81 // Use of this source code is governed by a BSD-style license that can be 82 // found in the LICENSE file. 83 // 84 // preprocessor.y: 85 // Parser for the OpenGL shading language preprocessor. 86 87 #if defined(__GNUC__) 88 // Triggered by the auto-generated pplval variable. 89 # if !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) 90 # pragma GCC diagnostic ignored "-Wmaybe-uninitialized" 91 # else 92 # pragma GCC diagnostic ignored "-Wuninitialized" 93 # endif 94 #elif defined(_MSC_VER) 95 # pragma warning(disable : 4065 4244 4701 4702) 96 #endif 97 #if defined(__clang__) 98 # pragma clang diagnostic ignored "-Wunreachable-code" 99 # pragma clang diagnostic ignored "-Wunused-but-set-variable" 100 #endif 101 102 #include "ExpressionParser.h" 103 104 #if defined(_MSC_VER) 105 # include <malloc.h> 106 #else 107 # include <stdlib.h> 108 #endif 109 110 #include <stdint.h> 111 #include <cassert> 112 #include <sstream> 113 114 #include "DiagnosticsBase.h" 115 #include "Lexer.h" 116 #include "Token.h" 117 #include "common/mathutil.h" 118 119 typedef int32_t YYSTYPE; 120 typedef uint32_t UNSIGNED_TYPE; 121 122 #define YYENABLE_NLS 0 123 #define YYLTYPE_IS_TRIVIAL 1 124 #define YYSTYPE_IS_TRIVIAL 1 125 #define YYSTYPE_IS_DECLARED 1 126 127 namespace 128 { 129 struct Context 130 { 131 angle::pp::Diagnostics *diagnostics; 132 angle::pp::Lexer *lexer; 133 angle::pp::Token *token; 134 int *result; 135 bool parsePresetToken; 136 137 angle::pp::ExpressionParser::ErrorSettings errorSettings; 138 bool *valid; 139 140 void startIgnoreErrors() { ++ignoreErrors; } 141 void endIgnoreErrors() { --ignoreErrors; } 142 143 bool isIgnoringErrors() { return ignoreErrors > 0; } 144 145 int ignoreErrors; 146 }; 147 } // namespace 148 149 static int yylex(YYSTYPE *lvalp, Context *context); 150 static void yyerror(Context *context, const char *reason); 151 152 #ifndef YY_CAST 153 # ifdef __cplusplus 154 # define YY_CAST(Type, Val) static_cast<Type>(Val) 155 # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type>(Val) 156 # else 157 # define YY_CAST(Type, Val) ((Type)(Val)) 158 # define YY_REINTERPRET_CAST(Type, Val) ((Type)(Val)) 159 # endif 160 #endif 161 #ifndef YY_NULLPTR 162 # if defined __cplusplus 163 # if 201103L <= __cplusplus 164 # define YY_NULLPTR nullptr 165 # else 166 # define YY_NULLPTR 0 167 # endif 168 # else 169 # define YY_NULLPTR ((void *)0) 170 # endif 171 #endif 172 173 /* Debug traces. */ 174 #ifndef PPDEBUG 175 # if defined YYDEBUG 176 # if YYDEBUG 177 # define PPDEBUG 1 178 # else 179 # define PPDEBUG 0 180 # endif 181 # else /* ! defined YYDEBUG */ 182 # define PPDEBUG 0 183 # endif /* ! defined YYDEBUG */ 184 #endif /* ! defined PPDEBUG */ 185 #if PPDEBUG 186 extern int ppdebug; 187 #endif 188 189 /* Token kinds. */ 190 #ifndef PPTOKENTYPE 191 # define PPTOKENTYPE 192 enum pptokentype 193 { 194 PPEMPTY = -2, 195 PPEOF = 0, /* "end of file" */ 196 PPerror = 256, /* error */ 197 PPUNDEF = 257, /* "invalid token" */ 198 TOK_CONST_INT = 258, /* TOK_CONST_INT */ 199 TOK_IDENTIFIER = 259, /* TOK_IDENTIFIER */ 200 TOK_OP_OR = 260, /* TOK_OP_OR */ 201 TOK_OP_AND = 261, /* TOK_OP_AND */ 202 TOK_OP_EQ = 262, /* TOK_OP_EQ */ 203 TOK_OP_NE = 263, /* TOK_OP_NE */ 204 TOK_OP_LE = 264, /* TOK_OP_LE */ 205 TOK_OP_GE = 265, /* TOK_OP_GE */ 206 TOK_OP_LEFT = 266, /* TOK_OP_LEFT */ 207 TOK_OP_RIGHT = 267, /* TOK_OP_RIGHT */ 208 TOK_UNARY = 268 /* TOK_UNARY */ 209 }; 210 typedef enum pptokentype pptoken_kind_t; 211 #endif 212 213 /* Value type. */ 214 #if !defined PPSTYPE && !defined PPSTYPE_IS_DECLARED 215 typedef int PPSTYPE; 216 # define PPSTYPE_IS_TRIVIAL 1 217 # define PPSTYPE_IS_DECLARED 1 218 #endif 219 220 int ppparse(Context *context); 221 222 /* Symbol kind. */ 223 enum yysymbol_kind_t 224 { 225 YYSYMBOL_YYEMPTY = -2, 226 YYSYMBOL_YYEOF = 0, /* "end of file" */ 227 YYSYMBOL_YYerror = 1, /* error */ 228 YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ 229 YYSYMBOL_TOK_CONST_INT = 3, /* TOK_CONST_INT */ 230 YYSYMBOL_TOK_IDENTIFIER = 4, /* TOK_IDENTIFIER */ 231 YYSYMBOL_TOK_OP_OR = 5, /* TOK_OP_OR */ 232 YYSYMBOL_TOK_OP_AND = 6, /* TOK_OP_AND */ 233 YYSYMBOL_7_ = 7, /* '|' */ 234 YYSYMBOL_8_ = 8, /* '^' */ 235 YYSYMBOL_9_ = 9, /* '&' */ 236 YYSYMBOL_TOK_OP_EQ = 10, /* TOK_OP_EQ */ 237 YYSYMBOL_TOK_OP_NE = 11, /* TOK_OP_NE */ 238 YYSYMBOL_12_ = 12, /* '<' */ 239 YYSYMBOL_13_ = 13, /* '>' */ 240 YYSYMBOL_TOK_OP_LE = 14, /* TOK_OP_LE */ 241 YYSYMBOL_TOK_OP_GE = 15, /* TOK_OP_GE */ 242 YYSYMBOL_TOK_OP_LEFT = 16, /* TOK_OP_LEFT */ 243 YYSYMBOL_TOK_OP_RIGHT = 17, /* TOK_OP_RIGHT */ 244 YYSYMBOL_18_ = 18, /* '+' */ 245 YYSYMBOL_19_ = 19, /* '-' */ 246 YYSYMBOL_20_ = 20, /* '*' */ 247 YYSYMBOL_21_ = 21, /* '/' */ 248 YYSYMBOL_22_ = 22, /* '%' */ 249 YYSYMBOL_TOK_UNARY = 23, /* TOK_UNARY */ 250 YYSYMBOL_24_ = 24, /* '!' */ 251 YYSYMBOL_25_ = 25, /* '~' */ 252 YYSYMBOL_26_ = 26, /* '(' */ 253 YYSYMBOL_27_ = 27, /* ')' */ 254 YYSYMBOL_YYACCEPT = 28, /* $accept */ 255 YYSYMBOL_input = 29, /* input */ 256 YYSYMBOL_expression = 30, /* expression */ 257 YYSYMBOL_31_1 = 31, /* $@1 */ 258 YYSYMBOL_32_2 = 32 /* $@2 */ 259 }; 260 typedef enum yysymbol_kind_t yysymbol_kind_t; 261 262 #ifdef short 263 # undef short 264 #endif 265 266 /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure 267 <limits.h> and (if available) <stdint.h> are included 268 so that the code can choose integer types of a good width. */ 269 270 #ifndef __PTRDIFF_MAX__ 271 # include <limits.h> /* INFRINGES ON USER NAME SPACE */ 272 # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ 273 # include <stdint.h> /* INFRINGES ON USER NAME SPACE */ 274 # define YY_STDINT_H 275 # endif 276 #endif 277 278 /* Narrow types that promote to a signed type and that can represent a 279 signed or unsigned integer of at least N bits. In tables they can 280 save space and decrease cache pressure. Promoting to a signed type 281 helps avoid bugs in integer arithmetic. */ 282 283 #ifdef __INT_LEAST8_MAX__ 284 typedef __INT_LEAST8_TYPE__ yytype_int8; 285 #elif defined YY_STDINT_H 286 typedef int_least8_t yytype_int8; 287 #else 288 typedef signed char yytype_int8; 289 #endif 290 291 #ifdef __INT_LEAST16_MAX__ 292 typedef __INT_LEAST16_TYPE__ yytype_int16; 293 #elif defined YY_STDINT_H 294 typedef int_least16_t yytype_int16; 295 #else 296 typedef short yytype_int16; 297 #endif 298 299 /* Work around bug in HP-UX 11.23, which defines these macros 300 incorrectly for preprocessor constants. This workaround can likely 301 be removed in 2023, as HPE has promised support for HP-UX 11.23 302 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of 303 <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */ 304 #ifdef __hpux 305 # undef UINT_LEAST8_MAX 306 # undef UINT_LEAST16_MAX 307 # define UINT_LEAST8_MAX 255 308 # define UINT_LEAST16_MAX 65535 309 #endif 310 311 #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ 312 typedef __UINT_LEAST8_TYPE__ yytype_uint8; 313 #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H && UINT_LEAST8_MAX <= INT_MAX) 314 typedef uint_least8_t yytype_uint8; 315 #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX 316 typedef unsigned char yytype_uint8; 317 #else 318 typedef short yytype_uint8; 319 #endif 320 321 #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ 322 typedef __UINT_LEAST16_TYPE__ yytype_uint16; 323 #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H && UINT_LEAST16_MAX <= INT_MAX) 324 typedef uint_least16_t yytype_uint16; 325 #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX 326 typedef unsigned short yytype_uint16; 327 #else 328 typedef int yytype_uint16; 329 #endif 330 331 #ifndef YYPTRDIFF_T 332 # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ 333 # define YYPTRDIFF_T __PTRDIFF_TYPE__ 334 # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ 335 # elif defined PTRDIFF_MAX 336 # ifndef ptrdiff_t 337 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ 338 # endif 339 # define YYPTRDIFF_T ptrdiff_t 340 # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX 341 # else 342 # define YYPTRDIFF_T long 343 # define YYPTRDIFF_MAXIMUM LONG_MAX 344 # endif 345 #endif 346 347 #ifndef YYSIZE_T 348 # ifdef __SIZE_TYPE__ 349 # define YYSIZE_T __SIZE_TYPE__ 350 # elif defined size_t 351 # define YYSIZE_T size_t 352 # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ 353 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ 354 # define YYSIZE_T size_t 355 # else 356 # define YYSIZE_T unsigned 357 # endif 358 #endif 359 360 #define YYSIZE_MAXIMUM \ 361 YY_CAST(YYPTRDIFF_T, (YYPTRDIFF_MAXIMUM < YY_CAST(YYSIZE_T, -1) ? YYPTRDIFF_MAXIMUM \ 362 : YY_CAST(YYSIZE_T, -1))) 363 364 #define YYSIZEOF(X) YY_CAST(YYPTRDIFF_T, sizeof(X)) 365 366 /* Stored state numbers (used for stacks). */ 367 typedef yytype_int8 yy_state_t; 368 369 /* State numbers in computations. */ 370 typedef int yy_state_fast_t; 371 372 #ifndef YY_ 373 # if defined YYENABLE_NLS && YYENABLE_NLS 374 # if ENABLE_NLS 375 # include <libintl.h> /* INFRINGES ON USER NAME SPACE */ 376 # define YY_(Msgid) dgettext("bison-runtime", Msgid) 377 # endif 378 # endif 379 # ifndef YY_ 380 # define YY_(Msgid) Msgid 381 # endif 382 #endif 383 384 #ifndef YY_ATTRIBUTE_PURE 385 # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) 386 # define YY_ATTRIBUTE_PURE __attribute__((__pure__)) 387 # else 388 # define YY_ATTRIBUTE_PURE 389 # endif 390 #endif 391 392 #ifndef YY_ATTRIBUTE_UNUSED 393 # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) 394 # define YY_ATTRIBUTE_UNUSED __attribute__((__unused__)) 395 # else 396 # define YY_ATTRIBUTE_UNUSED 397 # endif 398 #endif 399 400 /* Suppress unused-variable warnings by "using" E. */ 401 #if !defined lint || defined __GNUC__ 402 # define YY_USE(E) ((void)(E)) 403 #else 404 # define YY_USE(E) /* empty */ 405 #endif 406 407 /* Suppress an incorrect diagnostic about yylval being uninitialized. */ 408 #if defined __GNUC__ && !defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ 409 # if __GNUC__ * 100 + __GNUC_MINOR__ < 407 410 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ 411 _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wuninitialized\"") 412 # else 413 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ 414 _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wuninitialized\"") \ 415 _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") 416 # endif 417 # define YY_IGNORE_MAYBE_UNINITIALIZED_END _Pragma("GCC diagnostic pop") 418 #else 419 # define YY_INITIAL_VALUE(Value) Value 420 #endif 421 #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 422 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 423 # define YY_IGNORE_MAYBE_UNINITIALIZED_END 424 #endif 425 #ifndef YY_INITIAL_VALUE 426 # define YY_INITIAL_VALUE(Value) /* Nothing. */ 427 #endif 428 429 #if defined __cplusplus && defined __GNUC__ && !defined __ICC && 6 <= __GNUC__ 430 # define YY_IGNORE_USELESS_CAST_BEGIN \ 431 _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wuseless-cast\"") 432 # define YY_IGNORE_USELESS_CAST_END _Pragma("GCC diagnostic pop") 433 #endif 434 #ifndef YY_IGNORE_USELESS_CAST_BEGIN 435 # define YY_IGNORE_USELESS_CAST_BEGIN 436 # define YY_IGNORE_USELESS_CAST_END 437 #endif 438 439 #define YY_ASSERT(E) ((void)(0 && (E))) 440 441 #if !defined yyoverflow 442 443 /* The parser invokes alloca or malloc; define the necessary symbols. */ 444 445 # ifdef YYSTACK_USE_ALLOCA 446 # if YYSTACK_USE_ALLOCA 447 # ifdef __GNUC__ 448 # define YYSTACK_ALLOC __builtin_alloca 449 # elif defined __BUILTIN_VA_ARG_INCR 450 # include <alloca.h> /* INFRINGES ON USER NAME SPACE */ 451 # elif defined _AIX 452 # define YYSTACK_ALLOC __alloca 453 # elif defined _MSC_VER 454 # include <malloc.h> /* INFRINGES ON USER NAME SPACE */ 455 # define alloca _alloca 456 # else 457 # define YYSTACK_ALLOC alloca 458 # if !defined _ALLOCA_H && !defined EXIT_SUCCESS 459 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 460 /* Use EXIT_SUCCESS as a witness for stdlib.h. */ 461 # ifndef EXIT_SUCCESS 462 # define EXIT_SUCCESS 0 463 # endif 464 # endif 465 # endif 466 # endif 467 # endif 468 469 # ifdef YYSTACK_ALLOC 470 /* Pacify GCC's 'empty if-body' warning. */ 471 # define YYSTACK_FREE(Ptr) \ 472 do \ 473 { /* empty */ \ 474 ; \ 475 } while (0) 476 # ifndef YYSTACK_ALLOC_MAXIMUM 477 /* The OS might guarantee only one guard page at the bottom of the stack, 478 and a page size can be as small as 4096 bytes. So we cannot safely 479 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number 480 to allow for a few compiler-allocated temporary stack slots. */ 481 # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ 482 # endif 483 # else 484 # define YYSTACK_ALLOC YYMALLOC 485 # define YYSTACK_FREE YYFREE 486 # ifndef YYSTACK_ALLOC_MAXIMUM 487 # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM 488 # endif 489 # if (defined __cplusplus && !defined EXIT_SUCCESS && \ 490 !((defined YYMALLOC || defined malloc) && (defined YYFREE || defined free))) 491 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ 492 # ifndef EXIT_SUCCESS 493 # define EXIT_SUCCESS 0 494 # endif 495 # endif 496 # ifndef YYMALLOC 497 # define YYMALLOC malloc 498 # if !defined malloc && !defined EXIT_SUCCESS 499 void *malloc(YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ 500 # endif 501 # endif 502 # ifndef YYFREE 503 # define YYFREE free 504 # if !defined free && !defined EXIT_SUCCESS 505 void free(void *); /* INFRINGES ON USER NAME SPACE */ 506 # endif 507 # endif 508 # endif 509 #endif /* !defined yyoverflow */ 510 511 #if (!defined yyoverflow && \ 512 (!defined __cplusplus || (defined PPSTYPE_IS_TRIVIAL && PPSTYPE_IS_TRIVIAL))) 513 514 /* A type that is properly aligned for any stack member. */ 515 union yyalloc 516 { 517 yy_state_t yyss_alloc; 518 YYSTYPE yyvs_alloc; 519 }; 520 521 /* The size of the maximum gap between one aligned stack and the next. */ 522 # define YYSTACK_GAP_MAXIMUM (YYSIZEOF(union yyalloc) - 1) 523 524 /* The size of an array large to enough to hold all stacks, each with 525 N elements. */ 526 # define YYSTACK_BYTES(N) \ 527 ((N) * (YYSIZEOF(yy_state_t) + YYSIZEOF(YYSTYPE)) + YYSTACK_GAP_MAXIMUM) 528 529 # define YYCOPY_NEEDED 1 530 531 /* Relocate STACK from its old location to the new one. The 532 local variables YYSIZE and YYSTACKSIZE give the old and new number of 533 elements in the stack, and YYPTR gives the new location of the 534 stack. Advance YYPTR to a properly aligned location for the next 535 stack. */ 536 # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ 537 do \ 538 { \ 539 YYPTRDIFF_T yynewbytes; \ 540 YYCOPY(&yyptr->Stack_alloc, Stack, yysize); \ 541 Stack = &yyptr->Stack_alloc; \ 542 yynewbytes = yystacksize * YYSIZEOF(*Stack) + YYSTACK_GAP_MAXIMUM; \ 543 yyptr += yynewbytes / YYSIZEOF(*yyptr); \ 544 } while (0) 545 546 #endif 547 548 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED 549 /* Copy COUNT objects from SRC to DST. The source and destination do 550 not overlap. */ 551 # ifndef YYCOPY 552 # if defined __GNUC__ && 1 < __GNUC__ 553 # define YYCOPY(Dst, Src, Count) \ 554 __builtin_memcpy(Dst, Src, YY_CAST(YYSIZE_T, (Count)) * sizeof(*(Src))) 555 # else 556 # define YYCOPY(Dst, Src, Count) \ 557 do \ 558 { \ 559 YYPTRDIFF_T yyi; \ 560 for (yyi = 0; yyi < (Count); yyi++) \ 561 (Dst)[yyi] = (Src)[yyi]; \ 562 } while (0) 563 # endif 564 # endif 565 #endif /* !YYCOPY_NEEDED */ 566 567 /* YYFINAL -- State number of the termination state. */ 568 #define YYFINAL 15 569 /* YYLAST -- Last index in YYTABLE. */ 570 #define YYLAST 176 571 572 /* YYNTOKENS -- Number of terminals. */ 573 #define YYNTOKENS 28 574 /* YYNNTS -- Number of nonterminals. */ 575 #define YYNNTS 5 576 /* YYNRULES -- Number of rules. */ 577 #define YYNRULES 29 578 /* YYNSTATES -- Number of states. */ 579 #define YYNSTATES 55 580 581 /* YYMAXUTOK -- Last valid token kind. */ 582 #define YYMAXUTOK 268 583 584 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM 585 as returned by yylex, with out-of-bounds checking. */ 586 #define YYTRANSLATE(YYX) \ 587 (0 <= (YYX) && (YYX) <= YYMAXUTOK ? YY_CAST(yysymbol_kind_t, yytranslate[YYX]) \ 588 : YYSYMBOL_YYUNDEF) 589 590 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM 591 as returned by yylex. */ 592 static const yytype_int8 yytranslate[] = { 593 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, 594 2, 2, 2, 2, 2, 2, 24, 2, 2, 2, 22, 9, 2, 26, 27, 20, 18, 2, 19, 2, 21, 2, 2, 2, 2, 2, 2, 595 2, 2, 2, 2, 2, 2, 12, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 596 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 597 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 598 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 599 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 600 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 601 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 602 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 10, 11, 14, 15, 16, 17, 23}; 603 604 #if PPDEBUG 605 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ 606 static const yytype_int16 yyrline[] = {0, 114, 114, 121, 122, 133, 133, 154, 154, 175, 607 178, 181, 184, 187, 190, 193, 196, 199, 202, 227, 608 249, 252, 255, 281, 308, 311, 314, 317, 329, 332}; 609 #endif 610 611 /** Accessing symbol of state STATE. */ 612 #define YY_ACCESSING_SYMBOL(State) YY_CAST(yysymbol_kind_t, yystos[State]) 613 614 #if PPDEBUG || 0 615 /* The user-facing name of the symbol whose (internal) number is 616 YYSYMBOL. No bounds checking. */ 617 static const char *yysymbol_name(yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; 618 619 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. 620 First, the terminals, then, starting at YYNTOKENS, nonterminals. */ 621 static const char *const yytname[] = {"\"end of file\"", 622 "error", 623 "\"invalid token\"", 624 "TOK_CONST_INT", 625 "TOK_IDENTIFIER", 626 "TOK_OP_OR", 627 "TOK_OP_AND", 628 "'|'", 629 "'^'", 630 "'&'", 631 "TOK_OP_EQ", 632 "TOK_OP_NE", 633 "'<'", 634 "'>'", 635 "TOK_OP_LE", 636 "TOK_OP_GE", 637 "TOK_OP_LEFT", 638 "TOK_OP_RIGHT", 639 "'+'", 640 "'-'", 641 "'*'", 642 "'/'", 643 "'%'", 644 "TOK_UNARY", 645 "'!'", 646 "'~'", 647 "'('", 648 "')'", 649 "$accept", 650 "input", 651 "expression", 652 "$@1", 653 "$@2", 654 YY_NULLPTR}; 655 656 static const char *yysymbol_name(yysymbol_kind_t yysymbol) 657 { 658 return yytname[yysymbol]; 659 } 660 #endif 661 662 #define YYPACT_NINF (-12) 663 664 #define yypact_value_is_default(Yyn) ((Yyn) == YYPACT_NINF) 665 666 #define YYTABLE_NINF (-1) 667 668 #define yytable_value_is_error(Yyn) 0 669 670 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 671 STATE-NUM. */ 672 static const yytype_int16 yypact[] = { 673 31, -12, -12, 31, 31, 31, 31, 31, 51, 76, -12, -12, -12, -12, 53, -12, -12, -12, 31, 674 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -12, 31, 31, 124, 675 138, 26, 149, 149, -11, -11, -11, -11, 154, 154, -8, -8, -12, -12, -12, 93, 109}; 676 677 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. 678 Performed when YYTABLE does not specify something else to do. Zero 679 means the default is an error. */ 680 static const yytype_int8 yydefact[] = {0, 3, 4, 0, 0, 0, 0, 0, 0, 2, 28, 27, 25, 26, 681 0, 1, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 682 0, 0, 0, 0, 0, 0, 29, 0, 0, 9, 10, 11, 13, 12, 683 17, 16, 15, 14, 19, 18, 21, 20, 24, 23, 22, 6, 8}; 684 685 /* YYPGOTO[NTERM-NUM]. */ 686 static const yytype_int8 yypgoto[] = {-12, -12, -3, -12, -12}; 687 688 /* YYDEFGOTO[NTERM-NUM]. */ 689 static const yytype_int8 yydefgoto[] = {0, 8, 9, 35, 36}; 690 691 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If 692 positive, shift that token. If negative, reduce the rule whose 693 number is the opposite. If YYTABLE_NINF, syntax error. */ 694 static const yytype_int8 yytable[] = { 695 10, 11, 12, 13, 14, 27, 28, 29, 30, 31, 32, 33, 31, 32, 33, 37, 38, 39, 40, 41, 42, 43, 44, 696 45, 46, 47, 48, 49, 50, 51, 52, 0, 53, 54, 1, 2, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 697 31, 32, 33, 3, 4, 15, 0, 0, 0, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 698 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 34, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 699 27, 28, 29, 30, 31, 32, 33, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 700 33, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 19, 20, 21, 22, 23, 24, 701 25, 26, 27, 28, 29, 30, 31, 32, 33, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 702 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 29, 30, 31, 32, 33}; 703 704 static const yytype_int8 yycheck[] = { 705 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 20, 21, 22, 18, 19, 20, 21, 22, 23, 24, 25, 706 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 707 20, 21, 22, 18, 19, 0, -1, -1, -1, 24, 25, 26, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 708 16, 17, 18, 19, 20, 21, 22, -1, -1, -1, -1, 27, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 709 16, 17, 18, 19, 20, 21, 22, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 710 22, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 8, 9, 10, 11, 12, 13, 711 14, 15, 16, 17, 18, 19, 20, 21, 22, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 712 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 18, 19, 20, 21, 22}; 713 714 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of 715 state STATE-NUM. */ 716 static const yytype_int8 yystos[] = {0, 3, 4, 18, 19, 24, 25, 26, 29, 30, 30, 30, 30, 30, 717 30, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 718 17, 18, 19, 20, 21, 22, 27, 31, 32, 30, 30, 30, 30, 30, 719 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; 720 721 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ 722 static const yytype_int8 yyr1[] = {0, 28, 29, 30, 30, 31, 30, 32, 30, 30, 30, 30, 30, 30, 30, 723 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; 724 725 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ 726 static const yytype_int8 yyr2[] = {0, 2, 1, 1, 1, 0, 4, 0, 4, 3, 3, 3, 3, 3, 3, 727 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3}; 728 729 enum 730 { 731 YYENOMEM = -2 732 }; 733 734 #define yyerrok (yyerrstatus = 0) 735 #define yyclearin (yychar = PPEMPTY) 736 737 #define YYACCEPT goto yyacceptlab 738 #define YYABORT goto yyabortlab 739 #define YYERROR goto yyerrorlab 740 #define YYNOMEM goto yyexhaustedlab 741 742 #define YYRECOVERING() (!!yyerrstatus) 743 744 #define YYBACKUP(Token, Value) \ 745 do \ 746 if (yychar == PPEMPTY) \ 747 { \ 748 yychar = (Token); \ 749 yylval = (Value); \ 750 YYPOPSTACK(yylen); \ 751 yystate = *yyssp; \ 752 goto yybackup; \ 753 } \ 754 else \ 755 { \ 756 yyerror(context, YY_("syntax error: cannot back up")); \ 757 YYERROR; \ 758 } \ 759 while (0) 760 761 /* Backward compatibility with an undocumented macro. 762 Use PPerror or PPUNDEF. */ 763 #define YYERRCODE PPUNDEF 764 765 /* Enable debugging if requested. */ 766 #if PPDEBUG 767 768 # ifndef YYFPRINTF 769 # include <stdio.h> /* INFRINGES ON USER NAME SPACE */ 770 # define YYFPRINTF fprintf 771 # endif 772 773 # define YYDPRINTF(Args) \ 774 do \ 775 { \ 776 if (yydebug) \ 777 YYFPRINTF Args; \ 778 } while (0) 779 780 # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ 781 do \ 782 { \ 783 if (yydebug) \ 784 { \ 785 YYFPRINTF(stderr, "%s ", Title); \ 786 yy_symbol_print(stderr, Kind, Value, context); \ 787 YYFPRINTF(stderr, "\n"); \ 788 } \ 789 } while (0) 790 791 /*-----------------------------------. 792 | Print this symbol's value on YYO. | 793 `-----------------------------------*/ 794 795 static void yy_symbol_value_print(FILE *yyo, 796 yysymbol_kind_t yykind, 797 YYSTYPE const *const yyvaluep, 798 Context *context) 799 { 800 FILE *yyoutput = yyo; 801 YY_USE(yyoutput); 802 YY_USE(context); 803 if (!yyvaluep) 804 return; 805 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 806 YY_USE(yykind); 807 YY_IGNORE_MAYBE_UNINITIALIZED_END 808 } 809 810 /*---------------------------. 811 | Print this symbol on YYO. | 812 `---------------------------*/ 813 814 static void yy_symbol_print(FILE *yyo, 815 yysymbol_kind_t yykind, 816 YYSTYPE const *const yyvaluep, 817 Context *context) 818 { 819 YYFPRINTF(yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name(yykind)); 820 821 yy_symbol_value_print(yyo, yykind, yyvaluep, context); 822 YYFPRINTF(yyo, ")"); 823 } 824 825 /*------------------------------------------------------------------. 826 | yy_stack_print -- Print the state stack from its BOTTOM up to its | 827 | TOP (included). | 828 `------------------------------------------------------------------*/ 829 830 static void yy_stack_print(yy_state_t *yybottom, yy_state_t *yytop) 831 { 832 YYFPRINTF(stderr, "Stack now"); 833 for (; yybottom <= yytop; yybottom++) 834 { 835 int yybot = *yybottom; 836 YYFPRINTF(stderr, " %d", yybot); 837 } 838 YYFPRINTF(stderr, "\n"); 839 } 840 841 # define YY_STACK_PRINT(Bottom, Top) \ 842 do \ 843 { \ 844 if (yydebug) \ 845 yy_stack_print((Bottom), (Top)); \ 846 } while (0) 847 848 /*------------------------------------------------. 849 | Report that the YYRULE is going to be reduced. | 850 `------------------------------------------------*/ 851 852 static void yy_reduce_print(yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, Context *context) 853 { 854 int yylno = yyrline[yyrule]; 855 int yynrhs = yyr2[yyrule]; 856 int yyi; 857 YYFPRINTF(stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); 858 /* The symbols being reduced. */ 859 for (yyi = 0; yyi < yynrhs; yyi++) 860 { 861 YYFPRINTF(stderr, " $%d = ", yyi + 1); 862 yy_symbol_print(stderr, YY_ACCESSING_SYMBOL(+yyssp[yyi + 1 - yynrhs]), 863 &yyvsp[(yyi + 1) - (yynrhs)], context); 864 YYFPRINTF(stderr, "\n"); 865 } 866 } 867 868 # define YY_REDUCE_PRINT(Rule) \ 869 do \ 870 { \ 871 if (yydebug) \ 872 yy_reduce_print(yyssp, yyvsp, Rule, context); \ 873 } while (0) 874 875 /* Nonzero means print parse trace. It is left uninitialized so that 876 multiple parsers can coexist. */ 877 int yydebug; 878 #else /* !PPDEBUG */ 879 # define YYDPRINTF(Args) ((void)0) 880 # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) 881 # define YY_STACK_PRINT(Bottom, Top) 882 # define YY_REDUCE_PRINT(Rule) 883 #endif /* !PPDEBUG */ 884 885 /* YYINITDEPTH -- initial size of the parser's stacks. */ 886 #ifndef YYINITDEPTH 887 # define YYINITDEPTH 200 888 #endif 889 890 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only 891 if the built-in stack extension method is used). 892 893 Do not make this value too large; the results are undefined if 894 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) 895 evaluated with infinite-precision integer arithmetic. */ 896 897 #ifndef YYMAXDEPTH 898 # define YYMAXDEPTH 10000 899 #endif 900 901 /*-----------------------------------------------. 902 | Release the memory associated to this symbol. | 903 `-----------------------------------------------*/ 904 905 static void yydestruct(const char *yymsg, 906 yysymbol_kind_t yykind, 907 YYSTYPE *yyvaluep, 908 Context *context) 909 { 910 YY_USE(yyvaluep); 911 YY_USE(context); 912 if (!yymsg) 913 yymsg = "Deleting"; 914 YY_SYMBOL_PRINT(yymsg, yykind, yyvaluep, yylocationp); 915 916 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 917 YY_USE(yykind); 918 YY_IGNORE_MAYBE_UNINITIALIZED_END 919 } 920 921 /*----------. 922 | yyparse. | 923 `----------*/ 924 925 int yyparse(Context *context) 926 { 927 /* Lookahead token kind. */ 928 int yychar; 929 930 /* The semantic value of the lookahead symbol. */ 931 /* Default value used for initialization, for pacifying older GCCs 932 or non-GCC compilers. */ 933 YY_INITIAL_VALUE(static YYSTYPE yyval_default;) 934 YYSTYPE yylval YY_INITIAL_VALUE(= yyval_default); 935 936 /* Number of syntax errors so far. */ 937 int yynerrs = 0; 938 939 yy_state_fast_t yystate = 0; 940 /* Number of tokens to shift before error messages enabled. */ 941 int yyerrstatus = 0; 942 943 /* Refer to the stacks through separate pointers, to allow yyoverflow 944 to reallocate them elsewhere. */ 945 946 /* Their size. */ 947 YYPTRDIFF_T yystacksize = YYINITDEPTH; 948 949 /* The state stack: array, bottom, top. */ 950 yy_state_t yyssa[YYINITDEPTH]; 951 yy_state_t *yyss = yyssa; 952 yy_state_t *yyssp = yyss; 953 954 /* The semantic value stack: array, bottom, top. */ 955 YYSTYPE yyvsa[YYINITDEPTH]; 956 YYSTYPE *yyvs = yyvsa; 957 YYSTYPE *yyvsp = yyvs; 958 959 int yyn; 960 /* The return value of yyparse. */ 961 int yyresult; 962 /* Lookahead symbol kind. */ 963 yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; 964 /* The variables used to return semantic value and location from the 965 action routines. */ 966 YYSTYPE yyval; 967 968 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) 969 970 /* The number of symbols on the RHS of the reduced rule. 971 Keep to zero when no symbol should be popped. */ 972 int yylen = 0; 973 974 YYDPRINTF((stderr, "Starting parse\n")); 975 976 yychar = PPEMPTY; /* Cause a token to be read. */ 977 978 goto yysetstate; 979 980 /*------------------------------------------------------------. 981 | yynewstate -- push a new state, which is found in yystate. | 982 `------------------------------------------------------------*/ 983 yynewstate: 984 /* In all cases, when you get here, the value and location stacks 985 have just been pushed. So pushing a state here evens the stacks. */ 986 yyssp++; 987 988 /*--------------------------------------------------------------------. 989 | yysetstate -- set current state (the top of the stack) to yystate. | 990 `--------------------------------------------------------------------*/ 991 yysetstate: 992 YYDPRINTF((stderr, "Entering state %d\n", yystate)); 993 YY_ASSERT(0 <= yystate && yystate < YYNSTATES); 994 YY_IGNORE_USELESS_CAST_BEGIN 995 *yyssp = YY_CAST(yy_state_t, yystate); 996 YY_IGNORE_USELESS_CAST_END 997 YY_STACK_PRINT(yyss, yyssp); 998 999 if (yyss + yystacksize - 1 <= yyssp) 1000 #if !defined yyoverflow && !defined YYSTACK_RELOCATE 1001 YYNOMEM; 1002 #else 1003 { 1004 /* Get the current used size of the three stacks, in elements. */ 1005 YYPTRDIFF_T yysize = yyssp - yyss + 1; 1006 1007 # if defined yyoverflow 1008 { 1009 /* Give user a chance to reallocate the stack. Use copies of 1010 these so that the &'s don't force the real ones into 1011 memory. */ 1012 yy_state_t *yyss1 = yyss; 1013 YYSTYPE *yyvs1 = yyvs; 1014 1015 /* Each stack pointer address is followed by the size of the 1016 data in use in that stack, in bytes. This used to be a 1017 conditional around just the two extra args, but that might 1018 be undefined if yyoverflow is a macro. */ 1019 yyoverflow(YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF(*yyssp), &yyvs1, 1020 yysize * YYSIZEOF(*yyvsp), &yystacksize); 1021 yyss = yyss1; 1022 yyvs = yyvs1; 1023 } 1024 # else /* defined YYSTACK_RELOCATE */ 1025 /* Extend the stack our own way. */ 1026 if (YYMAXDEPTH <= yystacksize) 1027 YYNOMEM; 1028 yystacksize *= 2; 1029 if (YYMAXDEPTH < yystacksize) 1030 yystacksize = YYMAXDEPTH; 1031 1032 { 1033 yy_state_t *yyss1 = yyss; 1034 union yyalloc *yyptr = YY_CAST( 1035 union yyalloc *, YYSTACK_ALLOC(YY_CAST(YYSIZE_T, YYSTACK_BYTES(yystacksize)))); 1036 if (!yyptr) 1037 YYNOMEM; 1038 YYSTACK_RELOCATE(yyss_alloc, yyss); 1039 YYSTACK_RELOCATE(yyvs_alloc, yyvs); 1040 # undef YYSTACK_RELOCATE 1041 if (yyss1 != yyssa) 1042 YYSTACK_FREE(yyss1); 1043 } 1044 # endif 1045 1046 yyssp = yyss + yysize - 1; 1047 yyvsp = yyvs + yysize - 1; 1048 1049 YY_IGNORE_USELESS_CAST_BEGIN 1050 YYDPRINTF((stderr, "Stack size increased to %ld\n", YY_CAST(long, yystacksize))); 1051 YY_IGNORE_USELESS_CAST_END 1052 1053 if (yyss + yystacksize - 1 <= yyssp) 1054 YYABORT; 1055 } 1056 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ 1057 1058 if (yystate == YYFINAL) 1059 YYACCEPT; 1060 1061 goto yybackup; 1062 1063 /*-----------. 1064 | yybackup. | 1065 `-----------*/ 1066 yybackup: 1067 /* Do appropriate processing given the current state. Read a 1068 lookahead token if we need one and don't already have one. */ 1069 1070 /* First try to decide what to do without reference to lookahead token. */ 1071 yyn = yypact[yystate]; 1072 if (yypact_value_is_default(yyn)) 1073 goto yydefault; 1074 1075 /* Not known => get a lookahead token if don't already have one. */ 1076 1077 /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ 1078 if (yychar == PPEMPTY) 1079 { 1080 YYDPRINTF((stderr, "Reading a token\n")); 1081 yychar = yylex(&yylval, context); 1082 } 1083 1084 if (yychar <= PPEOF) 1085 { 1086 yychar = PPEOF; 1087 yytoken = YYSYMBOL_YYEOF; 1088 YYDPRINTF((stderr, "Now at end of input.\n")); 1089 } 1090 else if (yychar == PPerror) 1091 { 1092 /* The scanner already issued an error message, process directly 1093 to error recovery. But do not keep the error token as 1094 lookahead, it is too special and may lead us to an endless 1095 loop in error recovery. */ 1096 yychar = PPUNDEF; 1097 yytoken = YYSYMBOL_YYerror; 1098 goto yyerrlab1; 1099 } 1100 else 1101 { 1102 yytoken = YYTRANSLATE(yychar); 1103 YY_SYMBOL_PRINT("Next token is", yytoken, &yylval, &yylloc); 1104 } 1105 1106 /* If the proper action on seeing token YYTOKEN is to reduce or to 1107 detect an error, take that action. */ 1108 yyn += yytoken; 1109 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) 1110 goto yydefault; 1111 yyn = yytable[yyn]; 1112 if (yyn <= 0) 1113 { 1114 if (yytable_value_is_error(yyn)) 1115 goto yyerrlab; 1116 yyn = -yyn; 1117 goto yyreduce; 1118 } 1119 1120 /* Count tokens shifted since error; after three, turn off error 1121 status. */ 1122 if (yyerrstatus) 1123 yyerrstatus--; 1124 1125 /* Shift the lookahead token. */ 1126 YY_SYMBOL_PRINT("Shifting", yytoken, &yylval, &yylloc); 1127 yystate = yyn; 1128 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 1129 *++yyvsp = yylval; 1130 YY_IGNORE_MAYBE_UNINITIALIZED_END 1131 1132 /* Discard the shifted token. */ 1133 yychar = PPEMPTY; 1134 goto yynewstate; 1135 1136 /*-----------------------------------------------------------. 1137 | yydefault -- do the default action for the current state. | 1138 `-----------------------------------------------------------*/ 1139 yydefault: 1140 yyn = yydefact[yystate]; 1141 if (yyn == 0) 1142 goto yyerrlab; 1143 goto yyreduce; 1144 1145 /*-----------------------------. 1146 | yyreduce -- do a reduction. | 1147 `-----------------------------*/ 1148 yyreduce: 1149 /* yyn is the number of a rule to reduce with. */ 1150 yylen = yyr2[yyn]; 1151 1152 /* If YYLEN is nonzero, implement the default value of the action: 1153 '$$ = $1'. 1154 1155 Otherwise, the following line sets YYVAL to garbage. 1156 This behavior is undocumented and Bison 1157 users should not rely upon it. Assigning to YYVAL 1158 unconditionally makes the parser a bit smaller, and it avoids a 1159 GCC warning that YYVAL may be used uninitialized. */ 1160 yyval = yyvsp[1 - yylen]; 1161 1162 YY_REDUCE_PRINT(yyn); 1163 switch (yyn) 1164 { 1165 case 2: /* input: expression */ 1166 { 1167 *(context->result) = static_cast<int>(yyvsp[0]); 1168 YYACCEPT; 1169 } 1170 break; 1171 1172 case 4: /* expression: TOK_IDENTIFIER */ 1173 { 1174 if (!context->isIgnoringErrors()) 1175 { 1176 // This rule should be applied right after the token is lexed, so we can 1177 // refer to context->token in the error message. 1178 context->diagnostics->report(context->errorSettings.unexpectedIdentifier, 1179 context->token->location, context->token->text); 1180 *(context->valid) = false; 1181 } 1182 yyval = yyvsp[0]; 1183 } 1184 break; 1185 1186 case 5: /* $@1: %empty */ 1187 { 1188 if (yyvsp[-1] != 0) 1189 { 1190 // Ignore errors in the short-circuited part of the expression. 1191 // ESSL3.00 section 3.4: 1192 // If an operand is not evaluated, the presence of undefined identifiers 1193 // in the operand will not cause an error. 1194 // Unevaluated division by zero should not cause an error either. 1195 context->startIgnoreErrors(); 1196 } 1197 } 1198 break; 1199 1200 case 6: /* expression: expression TOK_OP_OR $@1 expression */ 1201 { 1202 if (yyvsp[-3] != 0) 1203 { 1204 context->endIgnoreErrors(); 1205 yyval = static_cast<YYSTYPE>(1); 1206 } 1207 else 1208 { 1209 yyval = yyvsp[-3] || yyvsp[0]; 1210 } 1211 } 1212 break; 1213 1214 case 7: /* $@2: %empty */ 1215 { 1216 if (yyvsp[-1] == 0) 1217 { 1218 // Ignore errors in the short-circuited part of the expression. 1219 // ESSL3.00 section 3.4: 1220 // If an operand is not evaluated, the presence of undefined identifiers 1221 // in the operand will not cause an error. 1222 // Unevaluated division by zero should not cause an error either. 1223 context->startIgnoreErrors(); 1224 } 1225 } 1226 break; 1227 1228 case 8: /* expression: expression TOK_OP_AND $@2 expression */ 1229 { 1230 if (yyvsp[-3] == 0) 1231 { 1232 context->endIgnoreErrors(); 1233 yyval = static_cast<YYSTYPE>(0); 1234 } 1235 else 1236 { 1237 yyval = yyvsp[-3] && yyvsp[0]; 1238 } 1239 } 1240 break; 1241 1242 case 9: /* expression: expression '|' expression */ 1243 { 1244 yyval = yyvsp[-2] | yyvsp[0]; 1245 } 1246 break; 1247 1248 case 10: /* expression: expression '^' expression */ 1249 { 1250 yyval = yyvsp[-2] ^ yyvsp[0]; 1251 } 1252 break; 1253 1254 case 11: /* expression: expression '&' expression */ 1255 { 1256 yyval = yyvsp[-2] & yyvsp[0]; 1257 } 1258 break; 1259 1260 case 12: /* expression: expression TOK_OP_NE expression */ 1261 { 1262 yyval = yyvsp[-2] != yyvsp[0]; 1263 } 1264 break; 1265 1266 case 13: /* expression: expression TOK_OP_EQ expression */ 1267 { 1268 yyval = yyvsp[-2] == yyvsp[0]; 1269 } 1270 break; 1271 1272 case 14: /* expression: expression TOK_OP_GE expression */ 1273 { 1274 yyval = yyvsp[-2] >= yyvsp[0]; 1275 } 1276 break; 1277 1278 case 15: /* expression: expression TOK_OP_LE expression */ 1279 { 1280 yyval = yyvsp[-2] <= yyvsp[0]; 1281 } 1282 break; 1283 1284 case 16: /* expression: expression '>' expression */ 1285 { 1286 yyval = yyvsp[-2] > yyvsp[0]; 1287 } 1288 break; 1289 1290 case 17: /* expression: expression '<' expression */ 1291 { 1292 yyval = yyvsp[-2] < yyvsp[0]; 1293 } 1294 break; 1295 1296 case 18: /* expression: expression TOK_OP_RIGHT expression */ 1297 { 1298 if (yyvsp[0] < 0 || yyvsp[0] > 31) 1299 { 1300 if (!context->isIgnoringErrors()) 1301 { 1302 std::ostringstream stream; 1303 stream << yyvsp[-2] << " >> " << yyvsp[0]; 1304 std::string text = stream.str(); 1305 context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, 1306 context->token->location, text.c_str()); 1307 *(context->valid) = false; 1308 } 1309 yyval = static_cast<YYSTYPE>(0); 1310 } 1311 else if (yyvsp[-2] < 0) 1312 { 1313 // Logical shift right. 1314 yyval = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>(yyvsp[-2]) >> yyvsp[0]); 1315 } 1316 else 1317 { 1318 yyval = yyvsp[-2] >> yyvsp[0]; 1319 } 1320 } 1321 break; 1322 1323 case 19: /* expression: expression TOK_OP_LEFT expression */ 1324 { 1325 if (yyvsp[0] < 0 || yyvsp[0] > 31) 1326 { 1327 if (!context->isIgnoringErrors()) 1328 { 1329 std::ostringstream stream; 1330 stream << yyvsp[-2] << " << " << yyvsp[0]; 1331 std::string text = stream.str(); 1332 context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT, 1333 context->token->location, text.c_str()); 1334 *(context->valid) = false; 1335 } 1336 yyval = static_cast<YYSTYPE>(0); 1337 } 1338 else 1339 { 1340 // Logical shift left. Casting to unsigned is needed to ensure there's no signed 1341 // integer overflow, which some tools treat as an error. 1342 yyval = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>(yyvsp[-2]) << yyvsp[0]); 1343 } 1344 } 1345 break; 1346 1347 case 20: /* expression: expression '-' expression */ 1348 { 1349 yyval = gl::WrappingDiff<YYSTYPE>(yyvsp[-2], yyvsp[0]); 1350 } 1351 break; 1352 1353 case 21: /* expression: expression '+' expression */ 1354 { 1355 yyval = gl::WrappingSum<YYSTYPE>(yyvsp[-2], yyvsp[0]); 1356 } 1357 break; 1358 1359 case 22: /* expression: expression '%' expression */ 1360 { 1361 if (yyvsp[0] == 0) 1362 { 1363 if (!context->isIgnoringErrors()) 1364 { 1365 std::ostringstream stream; 1366 stream << yyvsp[-2] << " % " << yyvsp[0]; 1367 std::string text = stream.str(); 1368 context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, 1369 context->token->location, text.c_str()); 1370 *(context->valid) = false; 1371 } 1372 yyval = static_cast<YYSTYPE>(0); 1373 } 1374 else if ((yyvsp[-2] == std::numeric_limits<YYSTYPE>::min()) && (yyvsp[0] == -1)) 1375 { 1376 // Check for the special case where the minimum representable number is 1377 // divided by -1. If left alone this has undefined results. 1378 yyval = 0; 1379 } 1380 else 1381 { 1382 yyval = yyvsp[-2] % yyvsp[0]; 1383 } 1384 } 1385 break; 1386 1387 case 23: /* expression: expression '/' expression */ 1388 { 1389 if (yyvsp[0] == 0) 1390 { 1391 if (!context->isIgnoringErrors()) 1392 { 1393 std::ostringstream stream; 1394 stream << yyvsp[-2] << " / " << yyvsp[0]; 1395 std::string text = stream.str(); 1396 context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO, 1397 context->token->location, text.c_str()); 1398 *(context->valid) = false; 1399 } 1400 yyval = static_cast<YYSTYPE>(0); 1401 } 1402 else if ((yyvsp[-2] == std::numeric_limits<YYSTYPE>::min()) && (yyvsp[0] == -1)) 1403 { 1404 // Check for the special case where the minimum representable number is 1405 // divided by -1. If left alone this leads to integer overflow in C++, which 1406 // has undefined results. 1407 yyval = std::numeric_limits<YYSTYPE>::max(); 1408 } 1409 else 1410 { 1411 yyval = yyvsp[-2] / yyvsp[0]; 1412 } 1413 } 1414 break; 1415 1416 case 24: /* expression: expression '*' expression */ 1417 { 1418 yyval = gl::WrappingMul(yyvsp[-2], yyvsp[0]); 1419 } 1420 break; 1421 1422 case 25: /* expression: '!' expression */ 1423 { 1424 yyval = !yyvsp[0]; 1425 } 1426 break; 1427 1428 case 26: /* expression: '~' expression */ 1429 { 1430 yyval = ~yyvsp[0]; 1431 } 1432 break; 1433 1434 case 27: /* expression: '-' expression */ 1435 { 1436 // Check for negation of minimum representable integer to prevent undefined signed int 1437 // overflow. 1438 if (yyvsp[0] == std::numeric_limits<YYSTYPE>::min()) 1439 { 1440 yyval = std::numeric_limits<YYSTYPE>::min(); 1441 } 1442 else 1443 { 1444 yyval = -yyvsp[0]; 1445 } 1446 } 1447 break; 1448 1449 case 28: /* expression: '+' expression */ 1450 { 1451 yyval = +yyvsp[0]; 1452 } 1453 break; 1454 1455 case 29: /* expression: '(' expression ')' */ 1456 { 1457 yyval = yyvsp[-1]; 1458 } 1459 break; 1460 1461 default: 1462 break; 1463 } 1464 /* User semantic actions sometimes alter yychar, and that requires 1465 that yytoken be updated with the new translation. We take the 1466 approach of translating immediately before every use of yytoken. 1467 One alternative is translating here after every semantic action, 1468 but that translation would be missed if the semantic action invokes 1469 YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or 1470 if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an 1471 incorrect destructor might then be invoked immediately. In the 1472 case of YYERROR or YYBACKUP, subsequent parser actions might lead 1473 to an incorrect destructor call or verbose syntax error message 1474 before the lookahead is translated. */ 1475 YY_SYMBOL_PRINT("-> $$ =", YY_CAST(yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); 1476 1477 YYPOPSTACK(yylen); 1478 yylen = 0; 1479 1480 *++yyvsp = yyval; 1481 1482 /* Now 'shift' the result of the reduction. Determine what state 1483 that goes to, based on the state we popped back to and the rule 1484 number reduced by. */ 1485 { 1486 const int yylhs = yyr1[yyn] - YYNTOKENS; 1487 const int yyi = yypgoto[yylhs] + *yyssp; 1488 yystate = 1489 (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); 1490 } 1491 1492 goto yynewstate; 1493 1494 /*--------------------------------------. 1495 | yyerrlab -- here on detecting error. | 1496 `--------------------------------------*/ 1497 yyerrlab: 1498 /* Make sure we have latest lookahead translation. See comments at 1499 user semantic actions for why this is necessary. */ 1500 yytoken = yychar == PPEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE(yychar); 1501 /* If not already recovering from an error, report this error. */ 1502 if (!yyerrstatus) 1503 { 1504 ++yynerrs; 1505 yyerror(context, YY_("syntax error")); 1506 } 1507 1508 if (yyerrstatus == 3) 1509 { 1510 /* If just tried and failed to reuse lookahead token after an 1511 error, discard it. */ 1512 1513 if (yychar <= PPEOF) 1514 { 1515 /* Return failure if at end of input. */ 1516 if (yychar == PPEOF) 1517 YYABORT; 1518 } 1519 else 1520 { 1521 yydestruct("Error: discarding", yytoken, &yylval, context); 1522 yychar = PPEMPTY; 1523 } 1524 } 1525 1526 /* Else will try to reuse lookahead token after shifting the error 1527 token. */ 1528 goto yyerrlab1; 1529 1530 /*---------------------------------------------------. 1531 | yyerrorlab -- error raised explicitly by YYERROR. | 1532 `---------------------------------------------------*/ 1533 yyerrorlab: 1534 /* Pacify compilers when the user code never invokes YYERROR and the 1535 label yyerrorlab therefore never appears in user code. */ 1536 if (0) 1537 YYERROR; 1538 ++yynerrs; 1539 1540 /* Do not reclaim the symbols of the rule whose action triggered 1541 this YYERROR. */ 1542 YYPOPSTACK(yylen); 1543 yylen = 0; 1544 YY_STACK_PRINT(yyss, yyssp); 1545 yystate = *yyssp; 1546 goto yyerrlab1; 1547 1548 /*-------------------------------------------------------------. 1549 | yyerrlab1 -- common code for both syntax error and YYERROR. | 1550 `-------------------------------------------------------------*/ 1551 yyerrlab1: 1552 yyerrstatus = 3; /* Each real token shifted decrements this. */ 1553 1554 /* Pop stack until we find a state that shifts the error token. */ 1555 for (;;) 1556 { 1557 yyn = yypact[yystate]; 1558 if (!yypact_value_is_default(yyn)) 1559 { 1560 yyn += YYSYMBOL_YYerror; 1561 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) 1562 { 1563 yyn = yytable[yyn]; 1564 if (0 < yyn) 1565 break; 1566 } 1567 } 1568 1569 /* Pop the current state because it cannot handle the error token. */ 1570 if (yyssp == yyss) 1571 YYABORT; 1572 1573 yydestruct("Error: popping", YY_ACCESSING_SYMBOL(yystate), yyvsp, context); 1574 YYPOPSTACK(1); 1575 yystate = *yyssp; 1576 YY_STACK_PRINT(yyss, yyssp); 1577 } 1578 1579 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN 1580 *++yyvsp = yylval; 1581 YY_IGNORE_MAYBE_UNINITIALIZED_END 1582 1583 /* Shift the error token. */ 1584 YY_SYMBOL_PRINT("Shifting", YY_ACCESSING_SYMBOL(yyn), yyvsp, yylsp); 1585 1586 yystate = yyn; 1587 goto yynewstate; 1588 1589 /*-------------------------------------. 1590 | yyacceptlab -- YYACCEPT comes here. | 1591 `-------------------------------------*/ 1592 yyacceptlab: 1593 yyresult = 0; 1594 goto yyreturnlab; 1595 1596 /*-----------------------------------. 1597 | yyabortlab -- YYABORT comes here. | 1598 `-----------------------------------*/ 1599 yyabortlab: 1600 yyresult = 1; 1601 goto yyreturnlab; 1602 1603 /*-----------------------------------------------------------. 1604 | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | 1605 `-----------------------------------------------------------*/ 1606 yyexhaustedlab: 1607 yyerror(context, YY_("memory exhausted")); 1608 yyresult = 2; 1609 goto yyreturnlab; 1610 1611 /*----------------------------------------------------------. 1612 | yyreturnlab -- parsing is finished, clean up and return. | 1613 `----------------------------------------------------------*/ 1614 yyreturnlab: 1615 if (yychar != PPEMPTY) 1616 { 1617 /* Make sure we have latest lookahead translation. See comments at 1618 user semantic actions for why this is necessary. */ 1619 yytoken = YYTRANSLATE(yychar); 1620 yydestruct("Cleanup: discarding lookahead", yytoken, &yylval, context); 1621 } 1622 /* Do not reclaim the symbols of the rule whose action triggered 1623 this YYABORT or YYACCEPT. */ 1624 YYPOPSTACK(yylen); 1625 YY_STACK_PRINT(yyss, yyssp); 1626 while (yyssp != yyss) 1627 { 1628 yydestruct("Cleanup: popping", YY_ACCESSING_SYMBOL(+*yyssp), yyvsp, context); 1629 YYPOPSTACK(1); 1630 } 1631 #ifndef yyoverflow 1632 if (yyss != yyssa) 1633 YYSTACK_FREE(yyss); 1634 #endif 1635 1636 return yyresult; 1637 } 1638 1639 int yylex(YYSTYPE *lvalp, Context *context) 1640 { 1641 angle::pp::Token *token = context->token; 1642 if (!context->parsePresetToken) 1643 { 1644 context->lexer->lex(token); 1645 } 1646 context->parsePresetToken = false; 1647 1648 int type = 0; 1649 1650 switch (token->type) 1651 { 1652 case angle::pp::Token::CONST_INT: 1653 { 1654 unsigned int val = 0; 1655 int testVal = 0; 1656 if (!token->uValue(&val) || 1657 (!token->iValue(&testVal) && 1658 context->errorSettings.integerLiteralsMustFit32BitSignedRange)) 1659 { 1660 context->diagnostics->report(angle::pp::Diagnostics::PP_INTEGER_OVERFLOW, 1661 token->location, token->text); 1662 *(context->valid) = false; 1663 } 1664 *lvalp = static_cast<YYSTYPE>(val); 1665 type = TOK_CONST_INT; 1666 break; 1667 } 1668 case angle::pp::Token::IDENTIFIER: 1669 *lvalp = static_cast<YYSTYPE>(-1); 1670 type = TOK_IDENTIFIER; 1671 break; 1672 case angle::pp::Token::OP_OR: 1673 type = TOK_OP_OR; 1674 break; 1675 case angle::pp::Token::OP_AND: 1676 type = TOK_OP_AND; 1677 break; 1678 case angle::pp::Token::OP_NE: 1679 type = TOK_OP_NE; 1680 break; 1681 case angle::pp::Token::OP_EQ: 1682 type = TOK_OP_EQ; 1683 break; 1684 case angle::pp::Token::OP_GE: 1685 type = TOK_OP_GE; 1686 break; 1687 case angle::pp::Token::OP_LE: 1688 type = TOK_OP_LE; 1689 break; 1690 case angle::pp::Token::OP_RIGHT: 1691 type = TOK_OP_RIGHT; 1692 break; 1693 case angle::pp::Token::OP_LEFT: 1694 type = TOK_OP_LEFT; 1695 break; 1696 case '|': 1697 case '^': 1698 case '&': 1699 case '>': 1700 case '<': 1701 case '-': 1702 case '+': 1703 case '%': 1704 case '/': 1705 case '*': 1706 case '!': 1707 case '~': 1708 case '(': 1709 case ')': 1710 type = token->type; 1711 break; 1712 1713 default: 1714 break; 1715 } 1716 1717 return type; 1718 } 1719 1720 void yyerror(Context *context, const char *reason) 1721 { 1722 context->diagnostics->report(angle::pp::Diagnostics::PP_INVALID_EXPRESSION, 1723 context->token->location, reason); 1724 } 1725 1726 namespace angle 1727 { 1728 1729 namespace pp 1730 { 1731 1732 ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics) 1733 : mLexer(lexer), mDiagnostics(diagnostics) 1734 {} 1735 1736 bool ExpressionParser::parse(Token *token, 1737 int *result, 1738 bool parsePresetToken, 1739 const ErrorSettings &errorSettings, 1740 bool *valid) 1741 { 1742 Context context; 1743 context.diagnostics = mDiagnostics; 1744 context.lexer = mLexer; 1745 context.token = token; 1746 context.result = result; 1747 context.ignoreErrors = 0; 1748 context.parsePresetToken = parsePresetToken; 1749 context.errorSettings = errorSettings; 1750 context.valid = valid; 1751 int ret = yyparse(&context); 1752 switch (ret) 1753 { 1754 case 0: 1755 case 1: 1756 break; 1757 1758 case 2: 1759 mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token->location, ""); 1760 break; 1761 1762 default: 1763 assert(false); 1764 mDiagnostics->report(Diagnostics::PP_INTERNAL_ERROR, token->location, ""); 1765 break; 1766 } 1767 1768 return ret == 0; 1769 } 1770 1771 } // namespace pp 1772 1773 } // namespace angle