1/* A Bison parser, made by GNU Bison 3.0.4. */
2
3/* Bison implementation for Yacc-like parsers in C
4
5 Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
6
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20/* As a special exception, you may create a larger work that contains
21 part or all of the Bison parser skeleton and distribute that work
22 under terms of your choice, so long as that work isn't itself a
23 parser generator using the skeleton or a modified version thereof
24 as a parser skeleton. Alternatively, if you modify or redistribute
25 the parser skeleton itself, you may (at your option) remove this
26 special exception, which will cause the skeleton and the resulting
27 Bison output files to be licensed under the GNU General Public
28 License without this special exception.
29
30 This special exception was added by the Free Software Foundation in
31 version 2.2 of Bison. */
32
33/* C LALR(1) parser skeleton written by Richard Stallman, by
34 simplifying the original so-called "semantic" parser. */
35
36/* All symbols defined below should begin with yy or YY, to avoid
37 infringing on user name space. This should be done even for local
38 variables, as they might otherwise be expanded by user macros.
39 There are some unavoidable exceptions within include files to
40 define necessary library symbols; they are noted "INFRINGES ON
41 USER NAME SPACE" below. */
42
43/* Identify Bison output. */
44#define YYBISON 1
45
46/* Bison version. */
47#define YYBISON_VERSION "3.0.4"
48
49/* Skeleton name. */
50#define YYSKELETON_NAME "yacc.c"
51
52/* Pure parsers. */
53#define YYPURE 1
54
55/* Push parsers. */
56#define YYPUSH 0
57
58/* Pull parsers. */
59#define YYPULL 1
60
61
62/* Substitute the variable and function names. */
63#define yyparse ppparse
64#define yylex pplex
65#define yyerror pperror
66#define yydebug ppdebug
67#define yynerrs ppnerrs
68
69
70/* Copy the first part of user declarations. */
71
72
73// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
74//
75// Licensed under the Apache License, Version 2.0 (the "License");
76// you may not use this file except in compliance with the License.
77// You may obtain a copy of the License at
78//
79// http://www.apache.org/licenses/LICENSE-2.0
80//
81// Unless required by applicable law or agreed to in writing, software
82// distributed under the License is distributed on an "AS IS" BASIS,
83// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
84// See the License for the specific language governing permissions and
85// limitations under the License.
86
87// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
88
89#if defined(__GNUC__)
90// Triggered by the auto-generated pplval variable.
91#if !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
92#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
93#else
94#pragma GCC diagnostic ignored "-Wuninitialized"
95#endif
96#elif defined(_MSC_VER)
97#pragma warning(disable: 4065 4244 4701 4702)
98#endif
99
100#include "ExpressionParser.h"
101
102#if defined(_MSC_VER)
103#include <malloc.h>
104#else
105#include <stdlib.h>
106#endif
107
108#include <limits>
109#include <cassert>
110#include <sstream>
111#include <stdint.h>
112
113#include "DiagnosticsBase.h"
114#include "Lexer.h"
115#include "Token.h"
116#include "../../common/debug.h"
117
118typedef int32_t YYSTYPE;
119typedef uint32_t UNSIGNED_TYPE;
120
121#define YYENABLE_NLS 0
122#define YYLTYPE_IS_TRIVIAL 1
123#define YYSTYPE_IS_TRIVIAL 1
124#define YYSTYPE_IS_DECLARED 1
125
126namespace {
127struct Context
128{
129 pp::Diagnostics* diagnostics;
130 pp::Lexer* lexer;
131 pp::Token* token;
132 int* result;
133 bool parsePresetToken;
134
135 pp::ExpressionParser::ErrorSettings errorSettings;
136 bool *valid;
137
138 void startIgnoreErrors() { ++ignoreErrors; }
139 void endIgnoreErrors() { --ignoreErrors; }
140
141 bool isIgnoringErrors() { return ignoreErrors > 0; }
142
143 int ignoreErrors;
144};
145} // namespace
146
147
148static int yylex(YYSTYPE* lvalp, Context* context);
149static void yyerror(Context* context, const char* reason);
150
151
152
153# ifndef YY_NULLPTR
154# if defined __cplusplus && 201103L <= __cplusplus
155# define YY_NULLPTR nullptr
156# else
157# define YY_NULLPTR 0
158# endif
159# endif
160
161/* Enabling verbose error messages. */
162#ifdef YYERROR_VERBOSE
163# undef YYERROR_VERBOSE
164# define YYERROR_VERBOSE 1
165#else
166# define YYERROR_VERBOSE 0
167#endif
168
169
170/* Debug traces. */
171#ifndef YYDEBUG
172# define YYDEBUG 0
173#endif
174#if YYDEBUG
175extern int ppdebug;
176#endif
177
178/* Token type. */
179#ifndef YYTOKENTYPE
180# define YYTOKENTYPE
181 enum yytokentype
182 {
183 TOK_CONST_INT = 258,
184 TOK_IDENTIFIER = 259,
185 TOK_OP_OR = 260,
186 TOK_OP_AND = 261,
187 TOK_OP_EQ = 262,
188 TOK_OP_NE = 263,
189 TOK_OP_LE = 264,
190 TOK_OP_GE = 265,
191 TOK_OP_LEFT = 266,
192 TOK_OP_RIGHT = 267,
193 TOK_UNARY = 268
194 };
195#endif
196
197/* Value type. */
198#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
199typedef int YYSTYPE;
200# define YYSTYPE_IS_TRIVIAL 1
201# define YYSTYPE_IS_DECLARED 1
202#endif
203
204
205
206int ppparse (Context *context);
207
208
209
210/* Copy the second part of user declarations. */
211
212
213
214#ifdef short
215# undef short
216#endif
217
218#ifdef YYTYPE_UINT8
219typedef YYTYPE_UINT8 yytype_uint8;
220#else
221typedef unsigned char yytype_uint8;
222#endif
223
224#ifdef YYTYPE_INT8
225typedef YYTYPE_INT8 yytype_int8;
226#else
227typedef signed char yytype_int8;
228#endif
229
230#ifdef YYTYPE_UINT16
231typedef YYTYPE_UINT16 yytype_uint16;
232#else
233typedef unsigned short int yytype_uint16;
234#endif
235
236#ifdef YYTYPE_INT16
237typedef YYTYPE_INT16 yytype_int16;
238#else
239typedef short int yytype_int16;
240#endif
241
242#ifndef YYSIZE_T
243# ifdef __SIZE_TYPE__
244# define YYSIZE_T __SIZE_TYPE__
245# elif defined size_t
246# define YYSIZE_T size_t
247# elif ! defined YYSIZE_T
248# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
249# define YYSIZE_T size_t
250# else
251# define YYSIZE_T unsigned int
252# endif
253#endif
254
255#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
256
257#ifndef YY_
258# if defined YYENABLE_NLS && YYENABLE_NLS
259# if ENABLE_NLS
260# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
261# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
262# endif
263# endif
264# ifndef YY_
265# define YY_(Msgid) Msgid
266# endif
267#endif
268
269#ifndef YY_ATTRIBUTE
270# if (defined __GNUC__ \
271 && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
272 || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
273# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
274# else
275# define YY_ATTRIBUTE(Spec) /* empty */
276# endif
277#endif
278
279#ifndef YY_ATTRIBUTE_PURE
280# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
281#endif
282
283#ifndef YY_ATTRIBUTE_UNUSED
284# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
285#endif
286
287#if !defined _Noreturn \
288 && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
289# if defined _MSC_VER && 1200 <= _MSC_VER
290# define _Noreturn __declspec (noreturn)
291# else
292# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
293# endif
294#endif
295
296/* Suppress unused-variable warnings by "using" E. */
297#if ! defined lint || defined __GNUC__
298# define YYUSE(E) ((void) (E))
299#else
300# define YYUSE(E) /* empty */
301#endif
302
303#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
304/* Suppress an incorrect diagnostic about yylval being uninitialized. */
305# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
306 _Pragma ("GCC diagnostic push") \
307 _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
308 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
309# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
310 _Pragma ("GCC diagnostic pop")
311#else
312# define YY_INITIAL_VALUE(Value) Value
313#endif
314#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
315# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
316# define YY_IGNORE_MAYBE_UNINITIALIZED_END
317#endif
318#ifndef YY_INITIAL_VALUE
319# define YY_INITIAL_VALUE(Value) /* Nothing. */
320#endif
321
322
323#if ! defined yyoverflow || YYERROR_VERBOSE
324
325/* The parser invokes alloca or malloc; define the necessary symbols. */
326
327# ifdef YYSTACK_USE_ALLOCA
328# if YYSTACK_USE_ALLOCA
329# ifdef __GNUC__
330# define YYSTACK_ALLOC __builtin_alloca
331# elif defined __BUILTIN_VA_ARG_INCR
332# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
333# elif defined _AIX
334# define YYSTACK_ALLOC __alloca
335# elif defined _MSC_VER
336# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
337# define alloca _alloca
338# else
339# define YYSTACK_ALLOC alloca
340# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
341# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
342 /* Use EXIT_SUCCESS as a witness for stdlib.h. */
343# ifndef EXIT_SUCCESS
344# define EXIT_SUCCESS 0
345# endif
346# endif
347# endif
348# endif
349# endif
350
351# ifdef YYSTACK_ALLOC
352 /* Pacify GCC's 'empty if-body' warning. */
353# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
354# ifndef YYSTACK_ALLOC_MAXIMUM
355 /* The OS might guarantee only one guard page at the bottom of the stack,
356 and a page size can be as small as 4096 bytes. So we cannot safely
357 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
358 to allow for a few compiler-allocated temporary stack slots. */
359# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
360# endif
361# else
362# define YYSTACK_ALLOC YYMALLOC
363# define YYSTACK_FREE YYFREE
364# ifndef YYSTACK_ALLOC_MAXIMUM
365# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
366# endif
367# if (defined __cplusplus && ! defined EXIT_SUCCESS \
368 && ! ((defined YYMALLOC || defined malloc) \
369 && (defined YYFREE || defined free)))
370# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
371# ifndef EXIT_SUCCESS
372# define EXIT_SUCCESS 0
373# endif
374# endif
375# ifndef YYMALLOC
376# define YYMALLOC malloc
377# if ! defined malloc && ! defined EXIT_SUCCESS
378void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
379# endif
380# endif
381# ifndef YYFREE
382# define YYFREE free
383# if ! defined free && ! defined EXIT_SUCCESS
384void free (void *); /* INFRINGES ON USER NAME SPACE */
385# endif
386# endif
387# endif
388#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
389
390
391#if (! defined yyoverflow \
392 && (! defined __cplusplus \
393 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
394
395/* A type that is properly aligned for any stack member. */
396union yyalloc
397{
398 yytype_int16 yyss_alloc;
399 YYSTYPE yyvs_alloc;
400};
401
402/* The size of the maximum gap between one aligned stack and the next. */
403# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
404
405/* The size of an array large to enough to hold all stacks, each with
406 N elements. */
407# define YYSTACK_BYTES(N) \
408 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
409 + YYSTACK_GAP_MAXIMUM)
410
411# define YYCOPY_NEEDED 1
412
413/* Relocate STACK from its old location to the new one. The
414 local variables YYSIZE and YYSTACKSIZE give the old and new number of
415 elements in the stack, and YYPTR gives the new location of the
416 stack. Advance YYPTR to a properly aligned location for the next
417 stack. */
418# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
419 do \
420 { \
421 YYSIZE_T yynewbytes; \
422 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
423 Stack = &yyptr->Stack_alloc; \
424 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
425 yyptr += yynewbytes / sizeof (*yyptr); \
426 } \
427 while (0)
428
429#endif
430
431#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
432/* Copy COUNT objects from SRC to DST. The source and destination do
433 not overlap. */
434# ifndef YYCOPY
435# if defined __GNUC__ && 1 < __GNUC__
436# define YYCOPY(Dst, Src, Count) \
437 __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
438# else
439# define YYCOPY(Dst, Src, Count) \
440 do \
441 { \
442 YYSIZE_T yyi; \
443 for (yyi = 0; yyi < (Count); yyi++) \
444 (Dst)[yyi] = (Src)[yyi]; \
445 } \
446 while (0)
447# endif
448# endif
449#endif /* !YYCOPY_NEEDED */
450
451/* YYFINAL -- State number of the termination state. */
452#define YYFINAL 15
453/* YYLAST -- Last index in YYTABLE. */
454#define YYLAST 176
455
456/* YYNTOKENS -- Number of terminals. */
457#define YYNTOKENS 28
458/* YYNNTS -- Number of nonterminals. */
459#define YYNNTS 5
460/* YYNRULES -- Number of rules. */
461#define YYNRULES 29
462/* YYNSTATES -- Number of states. */
463#define YYNSTATES 55
464
465/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
466 by yylex, with out-of-bounds checking. */
467#define YYUNDEFTOK 2
468#define YYMAXUTOK 268
469
470#define YYTRANSLATE(YYX) \
471 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
472
473/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
474 as returned by yylex, without out-of-bounds checking. */
475static const yytype_uint8 yytranslate[] =
476{
477 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
478 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
479 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
480 2, 2, 2, 24, 2, 2, 2, 22, 9, 2,
481 26, 27, 20, 18, 2, 19, 2, 21, 2, 2,
482 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
483 12, 2, 13, 2, 2, 2, 2, 2, 2, 2,
484 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
485 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
486 2, 2, 2, 2, 8, 2, 2, 2, 2, 2,
487 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
488 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
489 2, 2, 2, 2, 7, 2, 25, 2, 2, 2,
490 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
491 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
492 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
493 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
494 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
495 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
496 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
497 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
498 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
499 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
500 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
501 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
502 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
503 5, 6, 10, 11, 14, 15, 16, 17, 23
504};
505
506#if YYDEBUG
507 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
508static const yytype_uint16 yyrline[] =
509{
510 0, 125, 125, 132, 133, 144, 144, 165, 165, 186,
511 189, 192, 195, 198, 201, 204, 207, 210, 213, 238,
512 260, 263, 266, 292, 319, 322, 325, 328, 340, 343
513};
514#endif
515
516#if YYDEBUG || YYERROR_VERBOSE || 0
517/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
518 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
519static const char *const yytname[] =
520{
521 "$end", "error", "$undefined", "TOK_CONST_INT", "TOK_IDENTIFIER",
522 "TOK_OP_OR", "TOK_OP_AND", "'|'", "'^'", "'&'", "TOK_OP_EQ", "TOK_OP_NE",
523 "'<'", "'>'", "TOK_OP_LE", "TOK_OP_GE", "TOK_OP_LEFT", "TOK_OP_RIGHT",
524 "'+'", "'-'", "'*'", "'/'", "'%'", "TOK_UNARY", "'!'", "'~'", "'('",
525 "')'", "$accept", "input", "expression", "$@1", "$@2", YY_NULLPTR
526};
527#endif
528
529# ifdef YYPRINT
530/* YYTOKNUM[NUM] -- (External) token number corresponding to the
531 (internal) symbol number NUM (which must be that of a token). */
532static const yytype_uint16 yytoknum[] =
533{
534 0, 256, 257, 258, 259, 260, 261, 124, 94, 38,
535 262, 263, 60, 62, 264, 265, 266, 267, 43, 45,
536 42, 47, 37, 268, 33, 126, 40, 41
537};
538# endif
539
540#define YYPACT_NINF -12
541
542#define yypact_value_is_default(Yystate) \
543 (!!((Yystate) == (-12)))
544
545#define YYTABLE_NINF -1
546
547#define yytable_value_is_error(Yytable_value) \
548 0
549
550 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
551 STATE-NUM. */
552static const yytype_int16 yypact[] =
553{
554 31, -12, -12, 31, 31, 31, 31, 31, 51, 76,
555 -12, -12, -12, -12, 53, -12, -12, -12, 31, 31,
556 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
557 31, 31, 31, 31, -12, 31, 31, 124, 138, 26,
558 149, 149, -11, -11, -11, -11, 154, 154, -8, -8,
559 -12, -12, -12, 93, 109
560};
561
562 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
563 Performed when YYTABLE does not specify something else to do. Zero
564 means the default is an error. */
565static const yytype_uint8 yydefact[] =
566{
567 0, 3, 4, 0, 0, 0, 0, 0, 0, 2,
568 28, 27, 25, 26, 0, 1, 5, 7, 0, 0,
569 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
570 0, 0, 0, 0, 29, 0, 0, 9, 10, 11,
571 13, 12, 17, 16, 15, 14, 19, 18, 21, 20,
572 24, 23, 22, 6, 8
573};
574
575 /* YYPGOTO[NTERM-NUM]. */
576static const yytype_int8 yypgoto[] =
577{
578 -12, -12, -3, -12, -12
579};
580
581 /* YYDEFGOTO[NTERM-NUM]. */
582static const yytype_int8 yydefgoto[] =
583{
584 -1, 8, 9, 35, 36
585};
586
587 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
588 positive, shift that token. If negative, reduce the rule whose
589 number is the opposite. If YYTABLE_NINF, syntax error. */
590static const yytype_uint8 yytable[] =
591{
592 10, 11, 12, 13, 14, 27, 28, 29, 30, 31,
593 32, 33, 31, 32, 33, 37, 38, 39, 40, 41,
594 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
595 52, 0, 53, 54, 1, 2, 21, 22, 23, 24,
596 25, 26, 27, 28, 29, 30, 31, 32, 33, 3,
597 4, 15, 0, 0, 0, 5, 6, 7, 16, 17,
598 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
599 28, 29, 30, 31, 32, 33, 0, 0, 0, 0,
600 34, 16, 17, 18, 19, 20, 21, 22, 23, 24,
601 25, 26, 27, 28, 29, 30, 31, 32, 33, 17,
602 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
603 28, 29, 30, 31, 32, 33, 18, 19, 20, 21,
604 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
605 32, 33, 19, 20, 21, 22, 23, 24, 25, 26,
606 27, 28, 29, 30, 31, 32, 33, 20, 21, 22,
607 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
608 33, 23, 24, 25, 26, 27, 28, 29, 30, 31,
609 32, 33, 29, 30, 31, 32, 33
610};
611
612static const yytype_int8 yycheck[] =
613{
614 3, 4, 5, 6, 7, 16, 17, 18, 19, 20,
615 21, 22, 20, 21, 22, 18, 19, 20, 21, 22,
616 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
617 33, -1, 35, 36, 3, 4, 10, 11, 12, 13,
618 14, 15, 16, 17, 18, 19, 20, 21, 22, 18,
619 19, 0, -1, -1, -1, 24, 25, 26, 5, 6,
620 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
621 17, 18, 19, 20, 21, 22, -1, -1, -1, -1,
622 27, 5, 6, 7, 8, 9, 10, 11, 12, 13,
623 14, 15, 16, 17, 18, 19, 20, 21, 22, 6,
624 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
625 17, 18, 19, 20, 21, 22, 7, 8, 9, 10,
626 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
627 21, 22, 8, 9, 10, 11, 12, 13, 14, 15,
628 16, 17, 18, 19, 20, 21, 22, 9, 10, 11,
629 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
630 22, 12, 13, 14, 15, 16, 17, 18, 19, 20,
631 21, 22, 18, 19, 20, 21, 22
632};
633
634 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
635 symbol of state STATE-NUM. */
636static const yytype_uint8 yystos[] =
637{
638 0, 3, 4, 18, 19, 24, 25, 26, 29, 30,
639 30, 30, 30, 30, 30, 0, 5, 6, 7, 8,
640 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
641 19, 20, 21, 22, 27, 31, 32, 30, 30, 30,
642 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
643 30, 30, 30, 30, 30
644};
645
646 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
647static const yytype_uint8 yyr1[] =
648{
649 0, 28, 29, 30, 30, 31, 30, 32, 30, 30,
650 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
651 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
652};
653
654 /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
655static const yytype_uint8 yyr2[] =
656{
657 0, 2, 1, 1, 1, 0, 4, 0, 4, 3,
658 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
659 3, 3, 3, 3, 3, 2, 2, 2, 2, 3
660};
661
662
663#define yyerrok (yyerrstatus = 0)
664#define yyclearin (yychar = YYEMPTY)
665#define YYEMPTY (-2)
666#define YYEOF 0
667
668#define YYACCEPT goto yyacceptlab
669#define YYABORT goto yyabortlab
670#define YYERROR goto yyerrorlab
671
672
673#define YYRECOVERING() (!!yyerrstatus)
674
675#define YYBACKUP(Token, Value) \
676do \
677 if (yychar == YYEMPTY) \
678 { \
679 yychar = (Token); \
680 yylval = (Value); \
681 YYPOPSTACK (yylen); \
682 yystate = *yyssp; \
683 goto yybackup; \
684 } \
685 else \
686 { \
687 yyerror (context, YY_("syntax error: cannot back up")); \
688 YYERROR; \
689 } \
690while (0)
691
692/* Error token number */
693#define YYTERROR 1
694#define YYERRCODE 256
695
696
697
698/* Enable debugging if requested. */
699#if YYDEBUG
700
701# ifndef YYFPRINTF
702# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
703# define YYFPRINTF fprintf
704# endif
705
706# define YYDPRINTF(Args) \
707do { \
708 if (yydebug) \
709 YYFPRINTF Args; \
710} while (0)
711
712/* This macro is provided for backward compatibility. */
713#ifndef YY_LOCATION_PRINT
714# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
715#endif
716
717
718# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
719do { \
720 if (yydebug) \
721 { \
722 YYFPRINTF (stderr, "%s ", Title); \
723 yy_symbol_print (stderr, \
724 Type, Value, context); \
725 YYFPRINTF (stderr, "\n"); \
726 } \
727} while (0)
728
729
730/*----------------------------------------.
731| Print this symbol's value on YYOUTPUT. |
732`----------------------------------------*/
733
734static void
735yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context)
736{
737 FILE *yyo = yyoutput;
738 YYUSE (yyo);
739 YYUSE (context);
740 if (!yyvaluep)
741 return;
742# ifdef YYPRINT
743 if (yytype < YYNTOKENS)
744 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
745# endif
746 YYUSE (yytype);
747}
748
749
750/*--------------------------------.
751| Print this symbol on YYOUTPUT. |
752`--------------------------------*/
753
754static void
755yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context)
756{
757 YYFPRINTF (yyoutput, "%s %s (",
758 yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
759
760 yy_symbol_value_print (yyoutput, yytype, yyvaluep, context);
761 YYFPRINTF (yyoutput, ")");
762}
763
764/*------------------------------------------------------------------.
765| yy_stack_print -- Print the state stack from its BOTTOM up to its |
766| TOP (included). |
767`------------------------------------------------------------------*/
768
769static void
770yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
771{
772 YYFPRINTF (stderr, "Stack now");
773 for (; yybottom <= yytop; yybottom++)
774 {
775 int yybot = *yybottom;
776 YYFPRINTF (stderr, " %d", yybot);
777 }
778 YYFPRINTF (stderr, "\n");
779}
780
781# define YY_STACK_PRINT(Bottom, Top) \
782do { \
783 if (yydebug) \
784 yy_stack_print ((Bottom), (Top)); \
785} while (0)
786
787
788/*------------------------------------------------.
789| Report that the YYRULE is going to be reduced. |
790`------------------------------------------------*/
791
792static void
793yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, Context *context)
794{
795 unsigned long int yylno = yyrline[yyrule];
796 int yynrhs = yyr2[yyrule];
797 int yyi;
798 YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
799 yyrule - 1, yylno);
800 /* The symbols being reduced. */
801 for (yyi = 0; yyi < yynrhs; yyi++)
802 {
803 YYFPRINTF (stderr, " $%d = ", yyi + 1);
804 yy_symbol_print (stderr,
805 yystos[yyssp[yyi + 1 - yynrhs]],
806 &(yyvsp[(yyi + 1) - (yynrhs)])
807 , context);
808 YYFPRINTF (stderr, "\n");
809 }
810}
811
812# define YY_REDUCE_PRINT(Rule) \
813do { \
814 if (yydebug) \
815 yy_reduce_print (yyssp, yyvsp, Rule, context); \
816} while (0)
817
818/* Nonzero means print parse trace. It is left uninitialized so that
819 multiple parsers can coexist. */
820int yydebug;
821#else /* !YYDEBUG */
822# define YYDPRINTF(Args)
823# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
824# define YY_STACK_PRINT(Bottom, Top)
825# define YY_REDUCE_PRINT(Rule)
826#endif /* !YYDEBUG */
827
828
829/* YYINITDEPTH -- initial size of the parser's stacks. */
830#ifndef YYINITDEPTH
831# define YYINITDEPTH 200
832#endif
833
834/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
835 if the built-in stack extension method is used).
836
837 Do not make this value too large; the results are undefined if
838 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
839 evaluated with infinite-precision integer arithmetic. */
840
841#ifndef YYMAXDEPTH
842# define YYMAXDEPTH 10000
843#endif
844
845
846#if YYERROR_VERBOSE
847
848# ifndef yystrlen
849# if defined __GLIBC__ && defined _STRING_H
850# define yystrlen strlen
851# else
852/* Return the length of YYSTR. */
853static YYSIZE_T
854yystrlen (const char *yystr)
855{
856 YYSIZE_T yylen;
857 for (yylen = 0; yystr[yylen]; yylen++)
858 continue;
859 return yylen;
860}
861# endif
862# endif
863
864# ifndef yystpcpy
865# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
866# define yystpcpy stpcpy
867# else
868/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
869 YYDEST. */
870static char *
871yystpcpy (char *yydest, const char *yysrc)
872{
873 char *yyd = yydest;
874 const char *yys = yysrc;
875
876 while ((*yyd++ = *yys++) != '\0')
877 continue;
878
879 return yyd - 1;
880}
881# endif
882# endif
883
884# ifndef yytnamerr
885/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
886 quotes and backslashes, so that it's suitable for yyerror. The
887 heuristic is that double-quoting is unnecessary unless the string
888 contains an apostrophe, a comma, or backslash (other than
889 backslash-backslash). YYSTR is taken from yytname. If YYRES is
890 null, do not copy; instead, return the length of what the result
891 would have been. */
892static YYSIZE_T
893yytnamerr (char *yyres, const char *yystr)
894{
895 if (*yystr == '"')
896 {
897 YYSIZE_T yyn = 0;
898 char const *yyp = yystr;
899
900 for (;;)
901 switch (*++yyp)
902 {
903 case '\'':
904 case ',':
905 goto do_not_strip_quotes;
906
907 case '\\':
908 if (*++yyp != '\\')
909 goto do_not_strip_quotes;
910 /* Fall through. */
911 default:
912 if (yyres)
913 yyres[yyn] = *yyp;
914 yyn++;
915 break;
916
917 case '"':
918 if (yyres)
919 yyres[yyn] = '\0';
920 return yyn;
921 }
922 do_not_strip_quotes: ;
923 }
924
925 if (! yyres)
926 return yystrlen (yystr);
927
928 return yystpcpy (yyres, yystr) - yyres;
929}
930# endif
931
932/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
933 about the unexpected token YYTOKEN for the state stack whose top is
934 YYSSP.
935
936 Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
937 not large enough to hold the message. In that case, also set
938 *YYMSG_ALLOC to the required number of bytes. Return 2 if the
939 required number of bytes is too large to store. */
940static int
941yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
942 yytype_int16 *yyssp, int yytoken)
943{
944 YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
945 YYSIZE_T yysize = yysize0;
946 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
947 /* Internationalized format string. */
948 const char *yyformat = YY_NULLPTR;
949 /* Arguments of yyformat. */
950 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
951 /* Number of reported tokens (one for the "unexpected", one per
952 "expected"). */
953 int yycount = 0;
954
955 /* There are many possibilities here to consider:
956 - If this state is a consistent state with a default action, then
957 the only way this function was invoked is if the default action
958 is an error action. In that case, don't check for expected
959 tokens because there are none.
960 - The only way there can be no lookahead present (in yychar) is if
961 this state is a consistent state with a default action. Thus,
962 detecting the absence of a lookahead is sufficient to determine
963 that there is no unexpected or expected token to report. In that
964 case, just report a simple "syntax error".
965 - Don't assume there isn't a lookahead just because this state is a
966 consistent state with a default action. There might have been a
967 previous inconsistent state, consistent state with a non-default
968 action, or user semantic action that manipulated yychar.
969 - Of course, the expected token list depends on states to have
970 correct lookahead information, and it depends on the parser not
971 to perform extra reductions after fetching a lookahead from the
972 scanner and before detecting a syntax error. Thus, state merging
973 (from LALR or IELR) and default reductions corrupt the expected
974 token list. However, the list is correct for canonical LR with
975 one exception: it will still contain any token that will not be
976 accepted due to an error action in a later state.
977 */
978 if (yytoken != YYEMPTY)
979 {
980 int yyn = yypact[*yyssp];
981 yyarg[yycount++] = yytname[yytoken];
982 if (!yypact_value_is_default (yyn))
983 {
984 /* Start YYX at -YYN if negative to avoid negative indexes in
985 YYCHECK. In other words, skip the first -YYN actions for
986 this state because they are default actions. */
987 int yyxbegin = yyn < 0 ? -yyn : 0;
988 /* Stay within bounds of both yycheck and yytname. */
989 int yychecklim = YYLAST - yyn + 1;
990 int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
991 int yyx;
992
993 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
994 if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
995 && !yytable_value_is_error (yytable[yyx + yyn]))
996 {
997 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
998 {
999 yycount = 1;
1000 yysize = yysize0;
1001 break;
1002 }
1003 yyarg[yycount++] = yytname[yyx];
1004 {
1005 YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
1006 if (! (yysize <= yysize1
1007 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1008 return 2;
1009 yysize = yysize1;
1010 }
1011 }
1012 }
1013 }
1014
1015 switch (yycount)
1016 {
1017# define YYCASE_(N, S) \
1018 case N: \
1019 yyformat = S; \
1020 break
1021 YYCASE_(0, YY_("syntax error"));
1022 YYCASE_(1, YY_("syntax error, unexpected %s"));
1023 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1024 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1025 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1026 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1027# undef YYCASE_
1028 }
1029
1030 {
1031 YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
1032 if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1033 return 2;
1034 yysize = yysize1;
1035 }
1036
1037 if (*yymsg_alloc < yysize)
1038 {
1039 *yymsg_alloc = 2 * yysize;
1040 if (! (yysize <= *yymsg_alloc
1041 && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
1042 *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
1043 return 1;
1044 }
1045
1046 /* Avoid sprintf, as that infringes on the user's name space.
1047 Don't have undefined behavior even if the translation
1048 produced a string with the wrong number of "%s"s. */
1049 {
1050 char *yyp = *yymsg;
1051 int yyi = 0;
1052 while ((*yyp = *yyformat) != '\0')
1053 if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
1054 {
1055 yyp += yytnamerr (yyp, yyarg[yyi++]);
1056 yyformat += 2;
1057 }
1058 else
1059 {
1060 yyp++;
1061 yyformat++;
1062 }
1063 }
1064 return 0;
1065}
1066#endif /* YYERROR_VERBOSE */
1067
1068/*-----------------------------------------------.
1069| Release the memory associated to this symbol. |
1070`-----------------------------------------------*/
1071
1072static void
1073yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Context *context)
1074{
1075 YYUSE (yyvaluep);
1076 YYUSE (context);
1077 if (!yymsg)
1078 yymsg = "Deleting";
1079 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1080
1081 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1082 YYUSE (yytype);
1083 YY_IGNORE_MAYBE_UNINITIALIZED_END
1084}
1085
1086
1087
1088
1089/*----------.
1090| yyparse. |
1091`----------*/
1092
1093int
1094yyparse (Context *context)
1095{
1096/* The lookahead symbol. */
1097int yychar;
1098
1099
1100/* The semantic value of the lookahead symbol. */
1101/* Default value used for initialization, for pacifying older GCCs
1102 or non-GCC compilers. */
1103YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
1104YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
1105
1106 /* Number of syntax errors so far. */
1107 int yynerrs;
1108
1109 int yystate;
1110 /* Number of tokens to shift before error messages enabled. */
1111 int yyerrstatus;
1112
1113 /* The stacks and their tools:
1114 'yyss': related to states.
1115 'yyvs': related to semantic values.
1116
1117 Refer to the stacks through separate pointers, to allow yyoverflow
1118 to reallocate them elsewhere. */
1119
1120 /* The state stack. */
1121 yytype_int16 yyssa[YYINITDEPTH];
1122 yytype_int16 *yyss;
1123 yytype_int16 *yyssp;
1124
1125 /* The semantic value stack. */
1126 YYSTYPE yyvsa[YYINITDEPTH];
1127 YYSTYPE *yyvs;
1128 YYSTYPE *yyvsp;
1129
1130 YYSIZE_T yystacksize;
1131
1132 int yyn;
1133 int yyresult;
1134 /* Lookahead token as an internal (translated) token number. */
1135 int yytoken = 0;
1136 /* The variables used to return semantic value and location from the
1137 action routines. */
1138 YYSTYPE yyval;
1139
1140#if YYERROR_VERBOSE
1141 /* Buffer for error messages, and its allocated size. */
1142 char yymsgbuf[128];
1143 char *yymsg = yymsgbuf;
1144 YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1145#endif
1146
1147#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1148
1149 /* The number of symbols on the RHS of the reduced rule.
1150 Keep to zero when no symbol should be popped. */
1151 int yylen = 0;
1152
1153 yyssp = yyss = yyssa;
1154 yyvsp = yyvs = yyvsa;
1155 yystacksize = YYINITDEPTH;
1156
1157 YYDPRINTF ((stderr, "Starting parse\n"));
1158
1159 yystate = 0;
1160 yyerrstatus = 0;
1161 yynerrs = 0;
1162 yychar = YYEMPTY; /* Cause a token to be read. */
1163 goto yysetstate;
1164
1165/*------------------------------------------------------------.
1166| yynewstate -- Push a new state, which is found in yystate. |
1167`------------------------------------------------------------*/
1168 yynewstate:
1169 /* In all cases, when you get here, the value and location stacks
1170 have just been pushed. So pushing a state here evens the stacks. */
1171 yyssp++;
1172
1173 yysetstate:
1174 *yyssp = yystate;
1175
1176 if (yyss + yystacksize - 1 <= yyssp)
1177 {
1178 /* Get the current used size of the three stacks, in elements. */
1179 YYSIZE_T yysize = yyssp - yyss + 1;
1180
1181#ifdef yyoverflow
1182 {
1183 /* Give user a chance to reallocate the stack. Use copies of
1184 these so that the &'s don't force the real ones into
1185 memory. */
1186 YYSTYPE *yyvs1 = yyvs;
1187 yytype_int16 *yyss1 = yyss;
1188
1189 /* Each stack pointer address is followed by the size of the
1190 data in use in that stack, in bytes. This used to be a
1191 conditional around just the two extra args, but that might
1192 be undefined if yyoverflow is a macro. */
1193 yyoverflow (YY_("memory exhausted"),
1194 &yyss1, yysize * sizeof (*yyssp),
1195 &yyvs1, yysize * sizeof (*yyvsp),
1196 &yystacksize);
1197
1198 yyss = yyss1;
1199 yyvs = yyvs1;
1200 }
1201#else /* no yyoverflow */
1202# ifndef YYSTACK_RELOCATE
1203 goto yyexhaustedlab;
1204# else
1205 /* Extend the stack our own way. */
1206 if (YYMAXDEPTH <= yystacksize)
1207 goto yyexhaustedlab;
1208 yystacksize *= 2;
1209 if (YYMAXDEPTH < yystacksize)
1210 yystacksize = YYMAXDEPTH;
1211
1212 {
1213 yytype_int16 *yyss1 = yyss;
1214 union yyalloc *yyptr =
1215 (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1216 if (! yyptr)
1217 goto yyexhaustedlab;
1218 YYSTACK_RELOCATE (yyss_alloc, yyss);
1219 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
1220# undef YYSTACK_RELOCATE
1221 if (yyss1 != yyssa)
1222 YYSTACK_FREE (yyss1);
1223 }
1224# endif
1225#endif /* no yyoverflow */
1226
1227 yyssp = yyss + yysize - 1;
1228 yyvsp = yyvs + yysize - 1;
1229
1230 YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1231 (unsigned long int) yystacksize));
1232
1233 if (yyss + yystacksize - 1 <= yyssp)
1234 YYABORT;
1235 }
1236
1237 YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1238
1239 if (yystate == YYFINAL)
1240 YYACCEPT;
1241
1242 goto yybackup;
1243
1244/*-----------.
1245| yybackup. |
1246`-----------*/
1247yybackup:
1248
1249 /* Do appropriate processing given the current state. Read a
1250 lookahead token if we need one and don't already have one. */
1251
1252 /* First try to decide what to do without reference to lookahead token. */
1253 yyn = yypact[yystate];
1254 if (yypact_value_is_default (yyn))
1255 goto yydefault;
1256
1257 /* Not known => get a lookahead token if don't already have one. */
1258
1259 /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
1260 if (yychar == YYEMPTY)
1261 {
1262 YYDPRINTF ((stderr, "Reading a token: "));
1263 yychar = yylex (&yylval, context);
1264 }
1265
1266 if (yychar <= YYEOF)
1267 {
1268 yychar = yytoken = YYEOF;
1269 YYDPRINTF ((stderr, "Now at end of input.\n"));
1270 }
1271 else
1272 {
1273 yytoken = YYTRANSLATE (yychar);
1274 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1275 }
1276
1277 /* If the proper action on seeing token YYTOKEN is to reduce or to
1278 detect an error, take that action. */
1279 yyn += yytoken;
1280 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1281 goto yydefault;
1282 yyn = yytable[yyn];
1283 if (yyn <= 0)
1284 {
1285 if (yytable_value_is_error (yyn))
1286 goto yyerrlab;
1287 yyn = -yyn;
1288 goto yyreduce;
1289 }
1290
1291 /* Count tokens shifted since error; after three, turn off error
1292 status. */
1293 if (yyerrstatus)
1294 yyerrstatus--;
1295
1296 /* Shift the lookahead token. */
1297 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1298
1299 /* Discard the shifted token. */
1300 yychar = YYEMPTY;
1301
1302 yystate = yyn;
1303 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1304 *++yyvsp = yylval;
1305 YY_IGNORE_MAYBE_UNINITIALIZED_END
1306
1307 goto yynewstate;
1308
1309
1310/*-----------------------------------------------------------.
1311| yydefault -- do the default action for the current state. |
1312`-----------------------------------------------------------*/
1313yydefault:
1314 yyn = yydefact[yystate];
1315 if (yyn == 0)
1316 goto yyerrlab;
1317 goto yyreduce;
1318
1319
1320/*-----------------------------.
1321| yyreduce -- Do a reduction. |
1322`-----------------------------*/
1323yyreduce:
1324 /* yyn is the number of a rule to reduce with. */
1325 yylen = yyr2[yyn];
1326
1327 /* If YYLEN is nonzero, implement the default value of the action:
1328 '$$ = $1'.
1329
1330 Otherwise, the following line sets YYVAL to garbage.
1331 This behavior is undocumented and Bison
1332 users should not rely upon it. Assigning to YYVAL
1333 unconditionally makes the parser a bit smaller, and it avoids a
1334 GCC warning that YYVAL may be used uninitialized. */
1335 yyval = yyvsp[1-yylen];
1336
1337
1338 YY_REDUCE_PRINT (yyn);
1339 switch (yyn)
1340 {
1341 case 2:
1342
1343 {
1344 *(context->result) = static_cast<int>((yyvsp[0]));
1345 YYACCEPT;
1346 }
1347
1348 break;
1349
1350 case 4:
1351
1352 {
1353 if (!context->isIgnoringErrors())
1354 {
1355 // This rule should be applied right after the token is lexed, so we can
1356 // refer to context->token in the error message.
1357 context->diagnostics->report(context->errorSettings.unexpectedIdentifier,
1358 context->token->location, context->token->text);
1359 *(context->valid) = false;
1360 }
1361 (yyval) = (yyvsp[0]);
1362 }
1363
1364 break;
1365
1366 case 5:
1367
1368 {
1369 if ((yyvsp[-1]) != 0)
1370 {
1371 // Ignore errors in the short-circuited part of the expression.
1372 // ESSL3.00 section 3.4:
1373 // If an operand is not evaluated, the presence of undefined identifiers
1374 // in the operand will not cause an error.
1375 // Unevaluated division by zero should not cause an error either.
1376 context->startIgnoreErrors();
1377 }
1378 }
1379
1380 break;
1381
1382 case 6:
1383
1384 {
1385 if ((yyvsp[-3]) != 0)
1386 {
1387 context->endIgnoreErrors();
1388 (yyval) = static_cast<YYSTYPE>(1);
1389 }
1390 else
1391 {
1392 (yyval) = (yyvsp[-3]) || (yyvsp[0]);
1393 }
1394 }
1395
1396 break;
1397
1398 case 7:
1399
1400 {
1401 if ((yyvsp[-1]) == 0)
1402 {
1403 // Ignore errors in the short-circuited part of the expression.
1404 // ESSL3.00 section 3.4:
1405 // If an operand is not evaluated, the presence of undefined identifiers
1406 // in the operand will not cause an error.
1407 // Unevaluated division by zero should not cause an error either.
1408 context->startIgnoreErrors();
1409 }
1410 }
1411
1412 break;
1413
1414 case 8:
1415
1416 {
1417 if ((yyvsp[-3]) == 0)
1418 {
1419 context->endIgnoreErrors();
1420 (yyval) = static_cast<YYSTYPE>(0);
1421 }
1422 else
1423 {
1424 (yyval) = (yyvsp[-3]) && (yyvsp[0]);
1425 }
1426 }
1427
1428 break;
1429
1430 case 9:
1431
1432 {
1433 (yyval) = (yyvsp[-2]) | (yyvsp[0]);
1434 }
1435
1436 break;
1437
1438 case 10:
1439
1440 {
1441 (yyval) = (yyvsp[-2]) ^ (yyvsp[0]);
1442 }
1443
1444 break;
1445
1446 case 11:
1447
1448 {
1449 (yyval) = (yyvsp[-2]) & (yyvsp[0]);
1450 }
1451
1452 break;
1453
1454 case 12:
1455
1456 {
1457 (yyval) = (yyvsp[-2]) != (yyvsp[0]);
1458 }
1459
1460 break;
1461
1462 case 13:
1463
1464 {
1465 (yyval) = (yyvsp[-2]) == (yyvsp[0]);
1466 }
1467
1468 break;
1469
1470 case 14:
1471
1472 {
1473 (yyval) = (yyvsp[-2]) >= (yyvsp[0]);
1474 }
1475
1476 break;
1477
1478 case 15:
1479
1480 {
1481 (yyval) = (yyvsp[-2]) <= (yyvsp[0]);
1482 }
1483
1484 break;
1485
1486 case 16:
1487
1488 {
1489 (yyval) = (yyvsp[-2]) > (yyvsp[0]);
1490 }
1491
1492 break;
1493
1494 case 17:
1495
1496 {
1497 (yyval) = (yyvsp[-2]) < (yyvsp[0]);
1498 }
1499
1500 break;
1501
1502 case 18:
1503
1504 {
1505 if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31)
1506 {
1507 if (!context->isIgnoringErrors())
1508 {
1509 std::ostringstream stream;
1510 stream << (yyvsp[-2]) << " >> " << (yyvsp[0]);
1511 std::string text = stream.str();
1512 context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
1513 context->token->location,
1514 text.c_str());
1515 *(context->valid) = false;
1516 }
1517 (yyval) = static_cast<YYSTYPE>(0);
1518 }
1519 else if ((yyvsp[-2]) < 0)
1520 {
1521 // Logical shift right.
1522 (yyval) = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) >> (yyvsp[0]));
1523 }
1524 else
1525 {
1526 (yyval) = (yyvsp[-2]) >> (yyvsp[0]);
1527 }
1528 }
1529
1530 break;
1531
1532 case 19:
1533
1534 {
1535 if ((yyvsp[0]) < 0 || (yyvsp[0]) > 31)
1536 {
1537 if (!context->isIgnoringErrors())
1538 {
1539 std::ostringstream stream;
1540 stream << (yyvsp[-2]) << " << " << (yyvsp[0]);
1541 std::string text = stream.str();
1542 context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
1543 context->token->location,
1544 text.c_str());
1545 *(context->valid) = false;
1546 }
1547 (yyval) = static_cast<YYSTYPE>(0);
1548 }
1549 else
1550 {
1551 // Logical shift left. Casting to unsigned is needed to ensure there's no signed integer
1552 // overflow, which some tools treat as an error.
1553 (yyval) = static_cast<YYSTYPE>(static_cast<UNSIGNED_TYPE>((yyvsp[-2])) << (yyvsp[0]));
1554 }
1555 }
1556
1557 break;
1558
1559 case 20:
1560
1561 {
1562 (yyval) = (yyvsp[-2]) - (yyvsp[0]);
1563 }
1564
1565 break;
1566
1567 case 21:
1568
1569 {
1570 (yyval) = (yyvsp[-2]) + (yyvsp[0]);
1571 }
1572
1573 break;
1574
1575 case 22:
1576
1577 {
1578 if ((yyvsp[0]) == 0)
1579 {
1580 if (!context->isIgnoringErrors())
1581 {
1582 std::ostringstream stream;
1583 stream << (yyvsp[-2]) << " % " << (yyvsp[0]);
1584 std::string text = stream.str();
1585 context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
1586 context->token->location,
1587 text.c_str());
1588 *(context->valid) = false;
1589 }
1590 (yyval) = static_cast<YYSTYPE>(0);
1591 }
1592 else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1))
1593 {
1594 // Check for the special case where the minimum representable number is
1595 // divided by -1. If left alone this has undefined results.
1596 (yyval) = 0;
1597 }
1598 else
1599 {
1600 (yyval) = (yyvsp[-2]) % (yyvsp[0]);
1601 }
1602 }
1603
1604 break;
1605
1606 case 23:
1607
1608 {
1609 if ((yyvsp[0]) == 0)
1610 {
1611 if (!context->isIgnoringErrors())
1612 {
1613 std::ostringstream stream;
1614 stream << (yyvsp[-2]) << " / " << (yyvsp[0]);
1615 std::string text = stream.str();
1616 context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
1617 context->token->location,
1618 text.c_str());
1619 *(context->valid) = false;
1620 }
1621 (yyval) = static_cast<YYSTYPE>(0);
1622 }
1623 else if (((yyvsp[-2]) == std::numeric_limits<YYSTYPE>::min()) && ((yyvsp[0]) == -1))
1624 {
1625 // Check for the special case where the minimum representable number is
1626 // divided by -1. If left alone this leads to integer overflow in C++, which
1627 // has undefined results.
1628 (yyval) = std::numeric_limits<YYSTYPE>::max();
1629 }
1630 else
1631 {
1632 (yyval) = (yyvsp[-2]) / (yyvsp[0]);
1633 }
1634 }
1635
1636 break;
1637
1638 case 24:
1639
1640 {
1641 (yyval) = (yyvsp[-2]) * (yyvsp[0]);
1642 }
1643
1644 break;
1645
1646 case 25:
1647
1648 {
1649 (yyval) = ! (yyvsp[0]);
1650 }
1651
1652 break;
1653
1654 case 26:
1655
1656 {
1657 (yyval) = ~ (yyvsp[0]);
1658 }
1659
1660 break;
1661
1662 case 27:
1663
1664 {
1665 // Check for negation of minimum representable integer to prevent undefined signed int
1666 // overflow.
1667 if ((yyvsp[0]) == std::numeric_limits<YYSTYPE>::min())
1668 {
1669 (yyval) = std::numeric_limits<YYSTYPE>::min();
1670 }
1671 else
1672 {
1673 (yyval) = -(yyvsp[0]);
1674 }
1675 }
1676
1677 break;
1678
1679 case 28:
1680
1681 {
1682 (yyval) = + (yyvsp[0]);
1683 }
1684
1685 break;
1686
1687 case 29:
1688
1689 {
1690 (yyval) = (yyvsp[-1]);
1691 }
1692
1693 break;
1694
1695
1696
1697 default: break;
1698 }
1699 /* User semantic actions sometimes alter yychar, and that requires
1700 that yytoken be updated with the new translation. We take the
1701 approach of translating immediately before every use of yytoken.
1702 One alternative is translating here after every semantic action,
1703 but that translation would be missed if the semantic action invokes
1704 YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
1705 if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
1706 incorrect destructor might then be invoked immediately. In the
1707 case of YYERROR or YYBACKUP, subsequent parser actions might lead
1708 to an incorrect destructor call or verbose syntax error message
1709 before the lookahead is translated. */
1710 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
1711
1712 YYPOPSTACK (yylen);
1713 yylen = 0;
1714 YY_STACK_PRINT (yyss, yyssp);
1715
1716 *++yyvsp = yyval;
1717
1718 /* Now 'shift' the result of the reduction. Determine what state
1719 that goes to, based on the state we popped back to and the rule
1720 number reduced by. */
1721
1722 yyn = yyr1[yyn];
1723
1724 yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
1725 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1726 yystate = yytable[yystate];
1727 else
1728 yystate = yydefgoto[yyn - YYNTOKENS];
1729
1730 goto yynewstate;
1731
1732
1733/*--------------------------------------.
1734| yyerrlab -- here on detecting error. |
1735`--------------------------------------*/
1736yyerrlab:
1737 /* Make sure we have latest lookahead translation. See comments at
1738 user semantic actions for why this is necessary. */
1739 yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
1740
1741 /* If not already recovering from an error, report this error. */
1742 if (!yyerrstatus)
1743 {
1744 ++yynerrs;
1745#if ! YYERROR_VERBOSE
1746 yyerror (context, YY_("syntax error"));
1747#else
1748# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
1749 yyssp, yytoken)
1750 {
1751 char const *yymsgp = YY_("syntax error");
1752 int yysyntax_error_status;
1753 yysyntax_error_status = YYSYNTAX_ERROR;
1754 if (yysyntax_error_status == 0)
1755 yymsgp = yymsg;
1756 else if (yysyntax_error_status == 1)
1757 {
1758 if (yymsg != yymsgbuf)
1759 YYSTACK_FREE (yymsg);
1760 yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
1761 if (!yymsg)
1762 {
1763 yymsg = yymsgbuf;
1764 yymsg_alloc = sizeof yymsgbuf;
1765 yysyntax_error_status = 2;
1766 }
1767 else
1768 {
1769 yysyntax_error_status = YYSYNTAX_ERROR;
1770 yymsgp = yymsg;
1771 }
1772 }
1773 yyerror (context, yymsgp);
1774 if (yysyntax_error_status == 2)
1775 goto yyexhaustedlab;
1776 }
1777# undef YYSYNTAX_ERROR
1778#endif
1779 }
1780
1781
1782
1783 if (yyerrstatus == 3)
1784 {
1785 /* If just tried and failed to reuse lookahead token after an
1786 error, discard it. */
1787
1788 if (yychar <= YYEOF)
1789 {
1790 /* Return failure if at end of input. */
1791 if (yychar == YYEOF)
1792 YYABORT;
1793 }
1794 else
1795 {
1796 yydestruct ("Error: discarding",
1797 yytoken, &yylval, context);
1798 yychar = YYEMPTY;
1799 }
1800 }
1801
1802 /* Else will try to reuse lookahead token after shifting the error
1803 token. */
1804 goto yyerrlab1;
1805
1806
1807/*---------------------------------------------------.
1808| yyerrorlab -- error raised explicitly by YYERROR. |
1809`---------------------------------------------------*/
1810yyerrorlab:
1811
1812 /* Pacify compilers like GCC when the user code never invokes
1813 YYERROR and the label yyerrorlab therefore never appears in user
1814 code. */
1815 if (/*CONSTCOND*/ 0)
1816 goto yyerrorlab;
1817
1818 /* Do not reclaim the symbols of the rule whose action triggered
1819 this YYERROR. */
1820 YYPOPSTACK (yylen);
1821 yylen = 0;
1822 YY_STACK_PRINT (yyss, yyssp);
1823 yystate = *yyssp;
1824 goto yyerrlab1;
1825
1826
1827/*-------------------------------------------------------------.
1828| yyerrlab1 -- common code for both syntax error and YYERROR. |
1829`-------------------------------------------------------------*/
1830yyerrlab1:
1831 yyerrstatus = 3; /* Each real token shifted decrements this. */
1832
1833 for (;;)
1834 {
1835 yyn = yypact[yystate];
1836 if (!yypact_value_is_default (yyn))
1837 {
1838 yyn += YYTERROR;
1839 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
1840 {
1841 yyn = yytable[yyn];
1842 if (0 < yyn)
1843 break;
1844 }
1845 }
1846
1847 /* Pop the current state because it cannot handle the error token. */
1848 if (yyssp == yyss)
1849 YYABORT;
1850
1851
1852 yydestruct ("Error: popping",
1853 yystos[yystate], yyvsp, context);
1854 YYPOPSTACK (1);
1855 yystate = *yyssp;
1856 YY_STACK_PRINT (yyss, yyssp);
1857 }
1858
1859 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1860 *++yyvsp = yylval;
1861 YY_IGNORE_MAYBE_UNINITIALIZED_END
1862
1863
1864 /* Shift the error token. */
1865 YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
1866
1867 yystate = yyn;
1868 goto yynewstate;
1869
1870
1871/*-------------------------------------.
1872| yyacceptlab -- YYACCEPT comes here. |
1873`-------------------------------------*/
1874yyacceptlab:
1875 yyresult = 0;
1876 goto yyreturn;
1877
1878/*-----------------------------------.
1879| yyabortlab -- YYABORT comes here. |
1880`-----------------------------------*/
1881yyabortlab:
1882 yyresult = 1;
1883 goto yyreturn;
1884
1885#if !defined yyoverflow || YYERROR_VERBOSE
1886/*-------------------------------------------------.
1887| yyexhaustedlab -- memory exhaustion comes here. |
1888`-------------------------------------------------*/
1889yyexhaustedlab:
1890 yyerror (context, YY_("memory exhausted"));
1891 yyresult = 2;
1892 /* Fall through. */
1893#endif
1894
1895yyreturn:
1896 if (yychar != YYEMPTY)
1897 {
1898 /* Make sure we have latest lookahead translation. See comments at
1899 user semantic actions for why this is necessary. */
1900 yytoken = YYTRANSLATE (yychar);
1901 yydestruct ("Cleanup: discarding lookahead",
1902 yytoken, &yylval, context);
1903 }
1904 /* Do not reclaim the symbols of the rule whose action triggered
1905 this YYABORT or YYACCEPT. */
1906 YYPOPSTACK (yylen);
1907 YY_STACK_PRINT (yyss, yyssp);
1908 while (yyssp != yyss)
1909 {
1910 yydestruct ("Cleanup: popping",
1911 yystos[*yyssp], yyvsp, context);
1912 YYPOPSTACK (1);
1913 }
1914#ifndef yyoverflow
1915 if (yyss != yyssa)
1916 YYSTACK_FREE (yyss);
1917#endif
1918#if YYERROR_VERBOSE
1919 if (yymsg != yymsgbuf)
1920 YYSTACK_FREE (yymsg);
1921#endif
1922 return yyresult;
1923}
1924
1925
1926
1927int yylex(YYSTYPE *lvalp, Context *context)
1928{
1929 pp::Token *token = context->token;
1930 if (!context->parsePresetToken)
1931 {
1932 context->lexer->lex(token);
1933 }
1934 context->parsePresetToken = false;
1935
1936 int type = 0;
1937
1938 switch (token->type)
1939 {
1940 case pp::Token::CONST_INT: {
1941 unsigned int val = 0;
1942 int testVal = 0;
1943 if (!token->uValue(&val) || (!token->iValue(&testVal) &&
1944 context->errorSettings.integerLiteralsMustFit32BitSignedRange))
1945 {
1946 context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
1947 token->location, token->text);
1948 *(context->valid) = false;
1949 }
1950 *lvalp = static_cast<YYSTYPE>(val);
1951 type = TOK_CONST_INT;
1952 break;
1953 }
1954 case pp::Token::IDENTIFIER:
1955 *lvalp = static_cast<YYSTYPE>(-1);
1956 type = TOK_IDENTIFIER;
1957 break;
1958 case pp::Token::OP_OR:
1959 type = TOK_OP_OR;
1960 break;
1961 case pp::Token::OP_AND:
1962 type = TOK_OP_AND;
1963 break;
1964 case pp::Token::OP_NE:
1965 type = TOK_OP_NE;
1966 break;
1967 case pp::Token::OP_EQ:
1968 type = TOK_OP_EQ;
1969 break;
1970 case pp::Token::OP_GE:
1971 type = TOK_OP_GE;
1972 break;
1973 case pp::Token::OP_LE:
1974 type = TOK_OP_LE;
1975 break;
1976 case pp::Token::OP_RIGHT:
1977 type = TOK_OP_RIGHT;
1978 break;
1979 case pp::Token::OP_LEFT:
1980 type = TOK_OP_LEFT;
1981 break;
1982 case '|':
1983 case '^':
1984 case '&':
1985 case '>':
1986 case '<':
1987 case '-':
1988 case '+':
1989 case '%':
1990 case '/':
1991 case '*':
1992 case '!':
1993 case '~':
1994 case '(':
1995 case ')':
1996 type = token->type;
1997 break;
1998
1999 default:
2000 break;
2001 }
2002
2003 return type;
2004}
2005
2006void yyerror(Context *context, const char *reason)
2007{
2008 context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION,
2009 context->token->location,
2010 reason);
2011}
2012
2013namespace pp {
2014
2015ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics)
2016 : mLexer(lexer),
2017 mDiagnostics(diagnostics)
2018{
2019}
2020
2021bool ExpressionParser::parse(Token *token,
2022 int *result,
2023 bool parsePresetToken,
2024 const ErrorSettings &errorSettings,
2025 bool *valid)
2026{
2027 Context context;
2028 context.diagnostics = mDiagnostics;
2029 context.lexer = mLexer;
2030 context.token = token;
2031 context.result = result;
2032 context.ignoreErrors = 0;
2033 context.parsePresetToken = parsePresetToken;
2034 context.errorSettings = errorSettings;
2035 context.valid = valid;
2036 int ret = yyparse(&context);
2037 switch (ret)
2038 {
2039 case 0:
2040 case 1:
2041 break;
2042
2043 case 2:
2044 mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token->location, "");
2045 break;
2046
2047 default:
2048 assert(false);
2049 mDiagnostics->report(Diagnostics::PP_INTERNAL_ERROR, token->location, "");
2050 break;
2051 }
2052
2053 return ret == 0;
2054}
2055
2056} // namespace pp
2057