blob: f41263808764042f80c4d415bf59b9f8a32daf81 [file] [log] [blame]
Zhenyao Mof1d723c2013-09-23 14:57:07 -04001/* A Bison parser, made by GNU Bison 2.7.1. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +00002
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00003/* Bison implementation for Yacc-like parsers in C
alokp@chromium.org04d7d222012-05-16 19:24:07 +00004
Zhenyao Mof1d723c2013-09-23 14:57:07 -04005 Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
alokp@chromium.org04d7d222012-05-16 19:24:07 +00006
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. */
Zhenyao Mof1d723c2013-09-23 14:57:07 -040047#define YYBISON_VERSION "2.7.1"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000048
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
alokp@chromium.org04d7d222012-05-16 19:24:07 +000061
62/* Substitute the variable and function names. */
63#define yyparse ppparse
64#define yylex pplex
65#define yyerror pperror
66#define yylval pplval
67#define yychar ppchar
68#define yydebug ppdebug
69#define yynerrs ppnerrs
70
alokp@chromium.org04d7d222012-05-16 19:24:07 +000071/* Copy the first part of user declarations. */
72
73
74//
75// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
76// Use of this source code is governed by a BSD-style license that can be
77// found in the LICENSE file.
78//
79
80// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
81
82#if defined(__GNUC__)
maxvujovic@gmail.comc6b3b3c2012-06-27 22:49:39 +000083// Triggered by the auto-generated pplval variable.
shannon.woods@transgaming.comeb68fd02013-02-28 23:20:01 +000084#if !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
daniel@transgaming.comb3077d02013-01-11 04:12:09 +000085#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
shannon.woods@transgaming.comeb68fd02013-02-28 23:20:01 +000086#else
87#pragma GCC diagnostic ignored "-Wuninitialized"
shannon.woods@transgaming.come36fddf2013-01-25 21:57:50 +000088#endif
alokp@chromium.org04d7d222012-05-16 19:24:07 +000089#elif defined(_MSC_VER)
90#pragma warning(disable: 4065 4701)
91#endif
92
93#include "ExpressionParser.h"
94
Jamie Madilla738f082013-11-01 17:45:04 -040095#if defined(_MSC_VER)
Jamie Madilld7f21352013-10-30 17:53:15 -040096#include <malloc.h>
Jamie Madilla738f082013-11-01 17:45:04 -040097#else
98#include <stdlib.h>
99#endif
100
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000101#include <cassert>
102#include <sstream>
103
daniel@transgaming.comb3077d02013-01-11 04:12:09 +0000104#include "DiagnosticsBase.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000105#include "Lexer.h"
106#include "Token.h"
107
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +0000108#if defined(_MSC_VER)
109typedef __int64 YYSTYPE;
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +0000110#else
111#include <stdint.h>
112typedef intmax_t YYSTYPE;
113#endif // _MSC_VER
daniel@transgaming.comb3077d02013-01-11 04:12:09 +0000114#define YYENABLE_NLS 0
115#define YYLTYPE_IS_TRIVIAL 1
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +0000116#define YYSTYPE_IS_TRIVIAL 1
117#define YYSTYPE_IS_DECLARED 1
118
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000119namespace {
120struct Context
121{
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000122 pp::Diagnostics* diagnostics;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000123 pp::Lexer* lexer;
124 pp::Token* token;
125 int* result;
126};
127} // namespace
128
129
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +0000130static int yylex(YYSTYPE* lvalp, Context* context);
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000131static void yyerror(Context* context, const char* reason);
132
133
134
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000135# ifndef YY_NULL
136# if defined __cplusplus && 201103L <= __cplusplus
137# define YY_NULL nullptr
138# else
139# define YY_NULL 0
140# endif
141# endif
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000142
143/* Enabling verbose error messages. */
144#ifdef YYERROR_VERBOSE
145# undef YYERROR_VERBOSE
146# define YYERROR_VERBOSE 1
147#else
148# define YYERROR_VERBOSE 0
149#endif
150
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000151
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000152/* Enabling traces. */
153#ifndef YYDEBUG
154# define YYDEBUG 0
155#endif
156#if YYDEBUG
157extern int ppdebug;
158#endif
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000159
160/* Tokens. */
161#ifndef YYTOKENTYPE
162# define YYTOKENTYPE
163 /* Put the tokens into the symbol table, so that GDB and other debuggers
164 know about them. */
165 enum yytokentype {
maxvujovic@gmail.come640ef82012-07-13 18:42:40 +0000166 TOK_CONST_INT = 258,
167 TOK_OP_OR = 259,
168 TOK_OP_AND = 260,
169 TOK_OP_NE = 261,
170 TOK_OP_EQ = 262,
171 TOK_OP_GE = 263,
172 TOK_OP_LE = 264,
173 TOK_OP_RIGHT = 265,
174 TOK_OP_LEFT = 266,
175 TOK_UNARY = 267
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000176 };
177#endif
178
179
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000180#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
181typedef int YYSTYPE;
182# define YYSTYPE_IS_TRIVIAL 1
183# define yystype YYSTYPE /* obsolescent; will be withdrawn */
184# define YYSTYPE_IS_DECLARED 1
185#endif
186
187
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000188#ifdef YYPARSE_PARAM
189#if defined __STDC__ || defined __cplusplus
190int ppparse (void *YYPARSE_PARAM);
191#else
192int ppparse ();
193#endif
194#else /* ! YYPARSE_PARAM */
195#if defined __STDC__ || defined __cplusplus
196int ppparse (Context *context);
197#else
198int ppparse ();
199#endif
200#endif /* ! YYPARSE_PARAM */
201
202
203
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000204/* Copy the second part of user declarations. */
205
206
207
208#ifdef short
209# undef short
210#endif
211
212#ifdef YYTYPE_UINT8
213typedef YYTYPE_UINT8 yytype_uint8;
214#else
215typedef unsigned char yytype_uint8;
216#endif
217
218#ifdef YYTYPE_INT8
219typedef YYTYPE_INT8 yytype_int8;
220#elif (defined __STDC__ || defined __C99__FUNC__ \
221 || defined __cplusplus || defined _MSC_VER)
222typedef signed char yytype_int8;
223#else
224typedef short int yytype_int8;
225#endif
226
227#ifdef YYTYPE_UINT16
228typedef YYTYPE_UINT16 yytype_uint16;
229#else
230typedef unsigned short int yytype_uint16;
231#endif
232
233#ifdef YYTYPE_INT16
234typedef YYTYPE_INT16 yytype_int16;
235#else
236typedef short int yytype_int16;
237#endif
238
239#ifndef YYSIZE_T
240# ifdef __SIZE_TYPE__
241# define YYSIZE_T __SIZE_TYPE__
242# elif defined size_t
243# define YYSIZE_T size_t
244# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
245 || defined __cplusplus || defined _MSC_VER)
246# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
247# define YYSIZE_T size_t
248# else
249# define YYSIZE_T unsigned int
250# endif
251#endif
252
253#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
254
255#ifndef YY_
256# if defined YYENABLE_NLS && YYENABLE_NLS
257# if ENABLE_NLS
258# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000259# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000260# endif
261# endif
262# ifndef YY_
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000263# define YY_(Msgid) Msgid
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000264# endif
265#endif
266
Zhenyao Mof1d723c2013-09-23 14:57:07 -0400267#ifndef __attribute__
268/* This feature is available in gcc versions 2.5 and later. */
269# if (! defined __GNUC__ || __GNUC__ < 2 \
270 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
271# define __attribute__(Spec) /* empty */
272# endif
273#endif
274
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000275/* Suppress unused-variable warnings by "using" E. */
276#if ! defined lint || defined __GNUC__
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000277# define YYUSE(E) ((void) (E))
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000278#else
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000279# define YYUSE(E) /* empty */
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000280#endif
281
Zhenyao Mof1d723c2013-09-23 14:57:07 -0400282
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000283/* Identity function, used to suppress warnings about constant conditions. */
284#ifndef lint
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000285# define YYID(N) (N)
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000286#else
287#if (defined __STDC__ || defined __C99__FUNC__ \
288 || defined __cplusplus || defined _MSC_VER)
289static int
290YYID (int yyi)
291#else
292static int
293YYID (yyi)
294 int yyi;
295#endif
296{
297 return yyi;
298}
299#endif
300
301#if ! defined yyoverflow || YYERROR_VERBOSE
302
303/* The parser invokes alloca or malloc; define the necessary symbols. */
304
305# ifdef YYSTACK_USE_ALLOCA
306# if YYSTACK_USE_ALLOCA
307# ifdef __GNUC__
308# define YYSTACK_ALLOC __builtin_alloca
309# elif defined __BUILTIN_VA_ARG_INCR
310# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
311# elif defined _AIX
312# define YYSTACK_ALLOC __alloca
313# elif defined _MSC_VER
314# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
315# define alloca _alloca
316# else
317# define YYSTACK_ALLOC alloca
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000318# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000319 || defined __cplusplus || defined _MSC_VER)
320# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000321 /* Use EXIT_SUCCESS as a witness for stdlib.h. */
322# ifndef EXIT_SUCCESS
323# define EXIT_SUCCESS 0
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000324# endif
325# endif
326# endif
327# endif
328# endif
329
330# ifdef YYSTACK_ALLOC
331 /* Pacify GCC's `empty if-body' warning. */
332# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
333# ifndef YYSTACK_ALLOC_MAXIMUM
334 /* The OS might guarantee only one guard page at the bottom of the stack,
335 and a page size can be as small as 4096 bytes. So we cannot safely
336 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
337 to allow for a few compiler-allocated temporary stack slots. */
338# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
339# endif
340# else
341# define YYSTACK_ALLOC YYMALLOC
342# define YYSTACK_FREE YYFREE
343# ifndef YYSTACK_ALLOC_MAXIMUM
344# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
345# endif
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000346# if (defined __cplusplus && ! defined EXIT_SUCCESS \
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000347 && ! ((defined YYMALLOC || defined malloc) \
348 && (defined YYFREE || defined free)))
349# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000350# ifndef EXIT_SUCCESS
351# define EXIT_SUCCESS 0
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000352# endif
353# endif
354# ifndef YYMALLOC
355# define YYMALLOC malloc
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000356# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000357 || defined __cplusplus || defined _MSC_VER)
358void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
359# endif
360# endif
361# ifndef YYFREE
362# define YYFREE free
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000363# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000364 || defined __cplusplus || defined _MSC_VER)
365void free (void *); /* INFRINGES ON USER NAME SPACE */
366# endif
367# endif
368# endif
369#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
370
371
372#if (! defined yyoverflow \
373 && (! defined __cplusplus \
374 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
375
376/* A type that is properly aligned for any stack member. */
377union yyalloc
378{
379 yytype_int16 yyss_alloc;
380 YYSTYPE yyvs_alloc;
381};
382
383/* The size of the maximum gap between one aligned stack and the next. */
384# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
385
386/* The size of an array large to enough to hold all stacks, each with
387 N elements. */
388# define YYSTACK_BYTES(N) \
389 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
390 + YYSTACK_GAP_MAXIMUM)
391
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000392# define YYCOPY_NEEDED 1
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000393
394/* Relocate STACK from its old location to the new one. The
395 local variables YYSIZE and YYSTACKSIZE give the old and new number of
396 elements in the stack, and YYPTR gives the new location of the
397 stack. Advance YYPTR to a properly aligned location for the next
398 stack. */
399# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
400 do \
401 { \
402 YYSIZE_T yynewbytes; \
403 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
404 Stack = &yyptr->Stack_alloc; \
405 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
406 yyptr += yynewbytes / sizeof (*yyptr); \
407 } \
408 while (YYID (0))
409
410#endif
411
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000412#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
413/* Copy COUNT objects from SRC to DST. The source and destination do
414 not overlap. */
415# ifndef YYCOPY
416# if defined __GNUC__ && 1 < __GNUC__
417# define YYCOPY(Dst, Src, Count) \
418 __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
419# else
420# define YYCOPY(Dst, Src, Count) \
421 do \
422 { \
423 YYSIZE_T yyi; \
424 for (yyi = 0; yyi < (Count); yyi++) \
425 (Dst)[yyi] = (Src)[yyi]; \
426 } \
427 while (YYID (0))
428# endif
429# endif
430#endif /* !YYCOPY_NEEDED */
431
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000432/* YYFINAL -- State number of the termination state. */
433#define YYFINAL 14
434/* YYLAST -- Last index in YYTABLE. */
435#define YYLAST 175
436
437/* YYNTOKENS -- Number of terminals. */
438#define YYNTOKENS 27
439/* YYNNTS -- Number of nonterminals. */
440#define YYNNTS 3
441/* YYNRULES -- Number of rules. */
442#define YYNRULES 26
443/* YYNRULES -- Number of states. */
444#define YYNSTATES 52
445
446/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
447#define YYUNDEFTOK 2
448#define YYMAXUTOK 267
449
450#define YYTRANSLATE(YYX) \
451 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
452
453/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
454static const yytype_uint8 yytranslate[] =
455{
456 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
457 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
458 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
459 2, 2, 2, 23, 2, 2, 2, 21, 8, 2,
460 25, 26, 19, 17, 2, 18, 2, 20, 2, 2,
461 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
462 11, 2, 12, 2, 2, 2, 2, 2, 2, 2,
463 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
464 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
465 2, 2, 2, 2, 7, 2, 2, 2, 2, 2,
466 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
467 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
468 2, 2, 2, 2, 6, 2, 24, 2, 2, 2,
469 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
470 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
471 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
472 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
473 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
474 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
475 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
476 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
477 2, 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, 2, 2, 2, 2, 2, 2, 2,
481 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
482 5, 9, 10, 13, 14, 15, 16, 22
483};
484
485#if YYDEBUG
486/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
487 YYRHS. */
488static const yytype_uint8 yyprhs[] =
489{
490 0, 0, 3, 5, 7, 11, 15, 19, 23, 27,
491 31, 35, 39, 43, 47, 51, 55, 59, 63, 67,
492 71, 75, 79, 82, 85, 88, 91
493};
494
495/* YYRHS -- A `-1'-separated list of the rules' RHS. */
496static const yytype_int8 yyrhs[] =
497{
498 28, 0, -1, 29, -1, 3, -1, 29, 4, 29,
499 -1, 29, 5, 29, -1, 29, 6, 29, -1, 29,
500 7, 29, -1, 29, 8, 29, -1, 29, 9, 29,
501 -1, 29, 10, 29, -1, 29, 13, 29, -1, 29,
502 14, 29, -1, 29, 12, 29, -1, 29, 11, 29,
503 -1, 29, 15, 29, -1, 29, 16, 29, -1, 29,
504 18, 29, -1, 29, 17, 29, -1, 29, 21, 29,
505 -1, 29, 20, 29, -1, 29, 19, 29, -1, 23,
506 29, -1, 24, 29, -1, 18, 29, -1, 17, 29,
507 -1, 25, 29, 26, -1
508};
509
510/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
511static const yytype_uint8 yyrline[] =
512{
Jamie Madillc9f140d2014-02-18 15:27:21 -0500513 0, 97, 97, 104, 105, 108, 111, 114, 117, 120,
514 123, 126, 129, 132, 135, 138, 141, 144, 147, 150,
515 163, 176, 179, 182, 185, 188, 191
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000516};
517#endif
518
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000519#if YYDEBUG || YYERROR_VERBOSE || 0
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000520/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
521 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
522static const char *const yytname[] =
523{
maxvujovic@gmail.come640ef82012-07-13 18:42:40 +0000524 "$end", "error", "$undefined", "TOK_CONST_INT", "TOK_OP_OR",
525 "TOK_OP_AND", "'|'", "'^'", "'&'", "TOK_OP_NE", "TOK_OP_EQ", "'<'",
526 "'>'", "TOK_OP_GE", "TOK_OP_LE", "TOK_OP_RIGHT", "TOK_OP_LEFT", "'+'",
527 "'-'", "'*'", "'/'", "'%'", "TOK_UNARY", "'!'", "'~'", "'('", "')'",
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000528 "$accept", "input", "expression", YY_NULL
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000529};
530#endif
531
532# ifdef YYPRINT
533/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
534 token YYLEX-NUM. */
535static const yytype_uint16 yytoknum[] =
536{
537 0, 256, 257, 258, 259, 260, 124, 94, 38, 261,
538 262, 60, 62, 263, 264, 265, 266, 43, 45, 42,
539 47, 37, 267, 33, 126, 40, 41
540};
541# endif
542
543/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
544static const yytype_uint8 yyr1[] =
545{
546 0, 27, 28, 29, 29, 29, 29, 29, 29, 29,
547 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
548 29, 29, 29, 29, 29, 29, 29
549};
550
551/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
552static const yytype_uint8 yyr2[] =
553{
554 0, 2, 1, 1, 3, 3, 3, 3, 3, 3,
555 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
556 3, 3, 2, 2, 2, 2, 3
557};
558
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000559/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
560 Performed when YYTABLE doesn't specify something else to do. Zero
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000561 means the default is an error. */
562static const yytype_uint8 yydefact[] =
563{
564 0, 3, 0, 0, 0, 0, 0, 0, 2, 25,
565 24, 22, 23, 0, 1, 0, 0, 0, 0, 0,
566 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
567 0, 0, 0, 26, 4, 5, 6, 7, 8, 9,
568 10, 14, 13, 11, 12, 15, 16, 18, 17, 21,
569 20, 19
570};
571
572/* YYDEFGOTO[NTERM-NUM]. */
573static const yytype_int8 yydefgoto[] =
574{
575 -1, 7, 8
576};
577
578/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
579 STATE-NUM. */
580#define YYPACT_NINF -11
581static const yytype_int16 yypact[] =
582{
583 46, -11, 46, 46, 46, 46, 46, 12, 68, -11,
584 -11, -11, -11, 27, -11, 46, 46, 46, 46, 46,
585 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
586 46, 46, 46, -11, 85, 101, 116, 130, 143, 154,
587 154, -10, -10, -10, -10, 37, 37, 31, 31, -11,
588 -11, -11
589};
590
591/* YYPGOTO[NTERM-NUM]. */
592static const yytype_int8 yypgoto[] =
593{
594 -11, -11, -2
595};
596
597/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
598 positive, shift that token. If negative, reduce the rule which
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000599 number is the opposite. If YYTABLE_NINF, syntax error. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000600#define YYTABLE_NINF -1
601static const yytype_uint8 yytable[] =
602{
603 9, 10, 11, 12, 13, 26, 27, 28, 29, 30,
604 31, 32, 14, 34, 35, 36, 37, 38, 39, 40,
605 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
606 51, 15, 16, 17, 18, 19, 20, 21, 22, 23,
607 24, 25, 26, 27, 28, 29, 30, 31, 32, 1,
608 30, 31, 32, 33, 28, 29, 30, 31, 32, 0,
609 0, 0, 0, 2, 3, 0, 0, 0, 0, 4,
610 5, 6, 15, 16, 17, 18, 19, 20, 21, 22,
611 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
612 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
613 26, 27, 28, 29, 30, 31, 32, 17, 18, 19,
614 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
615 30, 31, 32, 18, 19, 20, 21, 22, 23, 24,
616 25, 26, 27, 28, 29, 30, 31, 32, 19, 20,
617 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
618 31, 32, 20, 21, 22, 23, 24, 25, 26, 27,
619 28, 29, 30, 31, 32, 22, 23, 24, 25, 26,
620 27, 28, 29, 30, 31, 32
621};
622
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000623#define yypact_value_is_default(Yystate) \
624 (!!((Yystate) == (-11)))
625
626#define yytable_value_is_error(Yytable_value) \
627 YYID (0)
628
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000629static const yytype_int8 yycheck[] =
630{
631 2, 3, 4, 5, 6, 15, 16, 17, 18, 19,
632 20, 21, 0, 15, 16, 17, 18, 19, 20, 21,
633 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
634 32, 4, 5, 6, 7, 8, 9, 10, 11, 12,
635 13, 14, 15, 16, 17, 18, 19, 20, 21, 3,
636 19, 20, 21, 26, 17, 18, 19, 20, 21, -1,
637 -1, -1, -1, 17, 18, -1, -1, -1, -1, 23,
638 24, 25, 4, 5, 6, 7, 8, 9, 10, 11,
639 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
640 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
641 15, 16, 17, 18, 19, 20, 21, 6, 7, 8,
642 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
643 19, 20, 21, 7, 8, 9, 10, 11, 12, 13,
644 14, 15, 16, 17, 18, 19, 20, 21, 8, 9,
645 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
646 20, 21, 9, 10, 11, 12, 13, 14, 15, 16,
647 17, 18, 19, 20, 21, 11, 12, 13, 14, 15,
648 16, 17, 18, 19, 20, 21
649};
650
651/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
652 symbol of state STATE-NUM. */
653static const yytype_uint8 yystos[] =
654{
655 0, 3, 17, 18, 23, 24, 25, 28, 29, 29,
656 29, 29, 29, 29, 0, 4, 5, 6, 7, 8,
657 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
658 19, 20, 21, 26, 29, 29, 29, 29, 29, 29,
659 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
660 29, 29
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/* Like YYERROR except do call yyerror. This remains here temporarily
674 to ease the transition to the new meaning of YYERROR, for GCC.
675 Once GCC version 2 has supplanted version 1, this can go. However,
676 YYFAIL appears to be in use. Nevertheless, it is formally deprecated
677 in Bison 2.4.2's NEWS entry, where a plan to phase it out is
678 discussed. */
679
680#define YYFAIL goto yyerrlab
681#if defined YYFAIL
682 /* This is here to suppress warnings from the GCC cpp's
683 -Wunused-macros. Normally we don't worry about that warning, but
684 some users do, and we want to make it easy for users to remove
685 YYFAIL uses, which will produce warnings from Bison 2.5. */
686#endif
687
688#define YYRECOVERING() (!!yyerrstatus)
689
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000690#define YYBACKUP(Token, Value) \
691do \
692 if (yychar == YYEMPTY) \
693 { \
694 yychar = (Token); \
695 yylval = (Value); \
696 YYPOPSTACK (yylen); \
697 yystate = *yyssp; \
698 goto yybackup; \
699 } \
700 else \
701 { \
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000702 yyerror (context, YY_("syntax error: cannot back up")); \
703 YYERROR; \
704 } \
705while (YYID (0))
706
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000707/* Error token number */
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000708#define YYTERROR 1
709#define YYERRCODE 256
710
711
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000712/* This macro is provided for backward compatibility. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000713#ifndef YY_LOCATION_PRINT
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000714# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000715#endif
716
717
718/* YYLEX -- calling `yylex' with the right arguments. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000719#ifdef YYLEX_PARAM
720# define YYLEX yylex (&yylval, YYLEX_PARAM)
721#else
722# define YYLEX yylex (&yylval, context)
723#endif
724
725/* Enable debugging if requested. */
726#if YYDEBUG
727
728# ifndef YYFPRINTF
729# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
730# define YYFPRINTF fprintf
731# endif
732
733# define YYDPRINTF(Args) \
734do { \
735 if (yydebug) \
736 YYFPRINTF Args; \
737} while (YYID (0))
738
739# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
740do { \
741 if (yydebug) \
742 { \
743 YYFPRINTF (stderr, "%s ", Title); \
744 yy_symbol_print (stderr, \
745 Type, Value, context); \
746 YYFPRINTF (stderr, "\n"); \
747 } \
748} while (YYID (0))
749
750
751/*--------------------------------.
752| Print this symbol on YYOUTPUT. |
753`--------------------------------*/
754
755/*ARGSUSED*/
756#if (defined __STDC__ || defined __C99__FUNC__ \
757 || defined __cplusplus || defined _MSC_VER)
758static void
759yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context)
760#else
761static void
762yy_symbol_value_print (yyoutput, yytype, yyvaluep, context)
763 FILE *yyoutput;
764 int yytype;
765 YYSTYPE const * const yyvaluep;
766 Context *context;
767#endif
768{
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +0000769 FILE *yyo = yyoutput;
770 YYUSE (yyo);
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000771 if (!yyvaluep)
772 return;
773 YYUSE (context);
774# ifdef YYPRINT
775 if (yytype < YYNTOKENS)
776 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
777# else
778 YYUSE (yyoutput);
779# endif
Zhenyao Mof1d723c2013-09-23 14:57:07 -0400780 YYUSE (yytype);
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000781}
782
783
784/*--------------------------------.
785| Print this symbol on YYOUTPUT. |
786`--------------------------------*/
787
788#if (defined __STDC__ || defined __C99__FUNC__ \
789 || defined __cplusplus || defined _MSC_VER)
790static void
791yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Context *context)
792#else
793static void
794yy_symbol_print (yyoutput, yytype, yyvaluep, context)
795 FILE *yyoutput;
796 int yytype;
797 YYSTYPE const * const yyvaluep;
798 Context *context;
799#endif
800{
801 if (yytype < YYNTOKENS)
802 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
803 else
804 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
805
806 yy_symbol_value_print (yyoutput, yytype, yyvaluep, context);
807 YYFPRINTF (yyoutput, ")");
808}
809
810/*------------------------------------------------------------------.
811| yy_stack_print -- Print the state stack from its BOTTOM up to its |
812| TOP (included). |
813`------------------------------------------------------------------*/
814
815#if (defined __STDC__ || defined __C99__FUNC__ \
816 || defined __cplusplus || defined _MSC_VER)
817static void
818yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
819#else
820static void
821yy_stack_print (yybottom, yytop)
822 yytype_int16 *yybottom;
823 yytype_int16 *yytop;
824#endif
825{
826 YYFPRINTF (stderr, "Stack now");
827 for (; yybottom <= yytop; yybottom++)
828 {
829 int yybot = *yybottom;
830 YYFPRINTF (stderr, " %d", yybot);
831 }
832 YYFPRINTF (stderr, "\n");
833}
834
835# define YY_STACK_PRINT(Bottom, Top) \
836do { \
837 if (yydebug) \
838 yy_stack_print ((Bottom), (Top)); \
839} while (YYID (0))
840
841
842/*------------------------------------------------.
843| Report that the YYRULE is going to be reduced. |
844`------------------------------------------------*/
845
846#if (defined __STDC__ || defined __C99__FUNC__ \
847 || defined __cplusplus || defined _MSC_VER)
848static void
849yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Context *context)
850#else
851static void
852yy_reduce_print (yyvsp, yyrule, context)
853 YYSTYPE *yyvsp;
854 int yyrule;
855 Context *context;
856#endif
857{
858 int yynrhs = yyr2[yyrule];
859 int yyi;
860 unsigned long int yylno = yyrline[yyrule];
861 YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
862 yyrule - 1, yylno);
863 /* The symbols being reduced. */
864 for (yyi = 0; yyi < yynrhs; yyi++)
865 {
866 YYFPRINTF (stderr, " $%d = ", yyi + 1);
867 yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
868 &(yyvsp[(yyi + 1) - (yynrhs)])
869 , context);
870 YYFPRINTF (stderr, "\n");
871 }
872}
873
874# define YY_REDUCE_PRINT(Rule) \
875do { \
876 if (yydebug) \
877 yy_reduce_print (yyvsp, Rule, context); \
878} while (YYID (0))
879
880/* Nonzero means print parse trace. It is left uninitialized so that
881 multiple parsers can coexist. */
882int yydebug;
883#else /* !YYDEBUG */
884# define YYDPRINTF(Args)
885# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
886# define YY_STACK_PRINT(Bottom, Top)
887# define YY_REDUCE_PRINT(Rule)
888#endif /* !YYDEBUG */
889
890
891/* YYINITDEPTH -- initial size of the parser's stacks. */
892#ifndef YYINITDEPTH
893# define YYINITDEPTH 200
894#endif
895
896/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
897 if the built-in stack extension method is used).
898
899 Do not make this value too large; the results are undefined if
900 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
901 evaluated with infinite-precision integer arithmetic. */
902
903#ifndef YYMAXDEPTH
904# define YYMAXDEPTH 10000
905#endif
906
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000907
908#if YYERROR_VERBOSE
909
910# ifndef yystrlen
911# if defined __GLIBC__ && defined _STRING_H
912# define yystrlen strlen
913# else
914/* Return the length of YYSTR. */
915#if (defined __STDC__ || defined __C99__FUNC__ \
916 || defined __cplusplus || defined _MSC_VER)
917static YYSIZE_T
918yystrlen (const char *yystr)
919#else
920static YYSIZE_T
921yystrlen (yystr)
922 const char *yystr;
923#endif
924{
925 YYSIZE_T yylen;
926 for (yylen = 0; yystr[yylen]; yylen++)
927 continue;
928 return yylen;
929}
930# endif
931# endif
932
933# ifndef yystpcpy
934# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
935# define yystpcpy stpcpy
936# else
937/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
938 YYDEST. */
939#if (defined __STDC__ || defined __C99__FUNC__ \
940 || defined __cplusplus || defined _MSC_VER)
941static char *
942yystpcpy (char *yydest, const char *yysrc)
943#else
944static char *
945yystpcpy (yydest, yysrc)
946 char *yydest;
947 const char *yysrc;
948#endif
949{
950 char *yyd = yydest;
951 const char *yys = yysrc;
952
953 while ((*yyd++ = *yys++) != '\0')
954 continue;
955
956 return yyd - 1;
957}
958# endif
959# endif
960
961# ifndef yytnamerr
962/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
963 quotes and backslashes, so that it's suitable for yyerror. The
964 heuristic is that double-quoting is unnecessary unless the string
965 contains an apostrophe, a comma, or backslash (other than
966 backslash-backslash). YYSTR is taken from yytname. If YYRES is
967 null, do not copy; instead, return the length of what the result
968 would have been. */
969static YYSIZE_T
970yytnamerr (char *yyres, const char *yystr)
971{
972 if (*yystr == '"')
973 {
974 YYSIZE_T yyn = 0;
975 char const *yyp = yystr;
976
977 for (;;)
978 switch (*++yyp)
979 {
980 case '\'':
981 case ',':
982 goto do_not_strip_quotes;
983
984 case '\\':
985 if (*++yyp != '\\')
986 goto do_not_strip_quotes;
987 /* Fall through. */
988 default:
989 if (yyres)
990 yyres[yyn] = *yyp;
991 yyn++;
992 break;
993
994 case '"':
995 if (yyres)
996 yyres[yyn] = '\0';
997 return yyn;
998 }
999 do_not_strip_quotes: ;
1000 }
1001
1002 if (! yyres)
1003 return yystrlen (yystr);
1004
1005 return yystpcpy (yyres, yystr) - yyres;
1006}
1007# endif
1008
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001009/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
1010 about the unexpected token YYTOKEN for the state stack whose top is
1011 YYSSP.
1012
1013 Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
1014 not large enough to hold the message. In that case, also set
1015 *YYMSG_ALLOC to the required number of bytes. Return 2 if the
1016 required number of bytes is too large to store. */
1017static int
1018yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
1019 yytype_int16 *yyssp, int yytoken)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001020{
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001021 YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
1022 YYSIZE_T yysize = yysize0;
1023 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1024 /* Internationalized format string. */
1025 const char *yyformat = YY_NULL;
1026 /* Arguments of yyformat. */
1027 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1028 /* Number of reported tokens (one for the "unexpected", one per
1029 "expected"). */
1030 int yycount = 0;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001031
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001032 /* There are many possibilities here to consider:
1033 - Assume YYFAIL is not used. It's too flawed to consider. See
1034 <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
1035 for details. YYERROR is fine as it does not invoke this
1036 function.
1037 - If this state is a consistent state with a default action, then
1038 the only way this function was invoked is if the default action
1039 is an error action. In that case, don't check for expected
1040 tokens because there are none.
1041 - The only way there can be no lookahead present (in yychar) is if
1042 this state is a consistent state with a default action. Thus,
1043 detecting the absence of a lookahead is sufficient to determine
1044 that there is no unexpected or expected token to report. In that
1045 case, just report a simple "syntax error".
1046 - Don't assume there isn't a lookahead just because this state is a
1047 consistent state with a default action. There might have been a
1048 previous inconsistent state, consistent state with a non-default
1049 action, or user semantic action that manipulated yychar.
1050 - Of course, the expected token list depends on states to have
1051 correct lookahead information, and it depends on the parser not
1052 to perform extra reductions after fetching a lookahead from the
1053 scanner and before detecting a syntax error. Thus, state merging
1054 (from LALR or IELR) and default reductions corrupt the expected
1055 token list. However, the list is correct for canonical LR with
1056 one exception: it will still contain any token that will not be
1057 accepted due to an error action in a later state.
1058 */
1059 if (yytoken != YYEMPTY)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001060 {
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001061 int yyn = yypact[*yyssp];
1062 yyarg[yycount++] = yytname[yytoken];
1063 if (!yypact_value_is_default (yyn))
1064 {
1065 /* Start YYX at -YYN if negative to avoid negative indexes in
1066 YYCHECK. In other words, skip the first -YYN actions for
1067 this state because they are default actions. */
1068 int yyxbegin = yyn < 0 ? -yyn : 0;
1069 /* Stay within bounds of both yycheck and yytname. */
1070 int yychecklim = YYLAST - yyn + 1;
1071 int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1072 int yyx;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001073
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001074 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1075 if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
1076 && !yytable_value_is_error (yytable[yyx + yyn]))
1077 {
1078 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1079 {
1080 yycount = 1;
1081 yysize = yysize0;
1082 break;
1083 }
1084 yyarg[yycount++] = yytname[yyx];
1085 {
1086 YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
1087 if (! (yysize <= yysize1
1088 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1089 return 2;
1090 yysize = yysize1;
1091 }
1092 }
1093 }
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001094 }
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001095
1096 switch (yycount)
1097 {
1098# define YYCASE_(N, S) \
1099 case N: \
1100 yyformat = S; \
1101 break
1102 YYCASE_(0, YY_("syntax error"));
1103 YYCASE_(1, YY_("syntax error, unexpected %s"));
1104 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1105 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1106 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1107 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1108# undef YYCASE_
1109 }
1110
1111 {
1112 YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
1113 if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1114 return 2;
1115 yysize = yysize1;
1116 }
1117
1118 if (*yymsg_alloc < yysize)
1119 {
1120 *yymsg_alloc = 2 * yysize;
1121 if (! (yysize <= *yymsg_alloc
1122 && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
1123 *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
1124 return 1;
1125 }
1126
1127 /* Avoid sprintf, as that infringes on the user's name space.
1128 Don't have undefined behavior even if the translation
1129 produced a string with the wrong number of "%s"s. */
1130 {
1131 char *yyp = *yymsg;
1132 int yyi = 0;
1133 while ((*yyp = *yyformat) != '\0')
1134 if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
1135 {
1136 yyp += yytnamerr (yyp, yyarg[yyi++]);
1137 yyformat += 2;
1138 }
1139 else
1140 {
1141 yyp++;
1142 yyformat++;
1143 }
1144 }
1145 return 0;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001146}
1147#endif /* YYERROR_VERBOSE */
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001148
1149/*-----------------------------------------------.
1150| Release the memory associated to this symbol. |
1151`-----------------------------------------------*/
1152
1153/*ARGSUSED*/
1154#if (defined __STDC__ || defined __C99__FUNC__ \
1155 || defined __cplusplus || defined _MSC_VER)
1156static void
1157yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Context *context)
1158#else
1159static void
1160yydestruct (yymsg, yytype, yyvaluep, context)
1161 const char *yymsg;
1162 int yytype;
1163 YYSTYPE *yyvaluep;
1164 Context *context;
1165#endif
1166{
1167 YYUSE (yyvaluep);
1168 YYUSE (context);
1169
1170 if (!yymsg)
1171 yymsg = "Deleting";
1172 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1173
Zhenyao Mof1d723c2013-09-23 14:57:07 -04001174 YYUSE (yytype);
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001175}
1176
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001177
1178
1179
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001180/*----------.
1181| yyparse. |
1182`----------*/
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001183
1184#ifdef YYPARSE_PARAM
1185#if (defined __STDC__ || defined __C99__FUNC__ \
1186 || defined __cplusplus || defined _MSC_VER)
1187int
1188yyparse (void *YYPARSE_PARAM)
1189#else
1190int
1191yyparse (YYPARSE_PARAM)
1192 void *YYPARSE_PARAM;
1193#endif
1194#else /* ! YYPARSE_PARAM */
1195#if (defined __STDC__ || defined __C99__FUNC__ \
1196 || defined __cplusplus || defined _MSC_VER)
1197int
1198yyparse (Context *context)
1199#else
1200int
1201yyparse (context)
1202 Context *context;
1203#endif
1204#endif
1205{
1206/* The lookahead symbol. */
1207int yychar;
1208
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001209
1210#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
1211/* Suppress an incorrect diagnostic about yylval being uninitialized. */
1212# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
1213 _Pragma ("GCC diagnostic push") \
1214 _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
1215 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
1216# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
1217 _Pragma ("GCC diagnostic pop")
1218#else
1219/* Default value used for initialization, for pacifying older GCCs
1220 or non-GCC compilers. */
1221static YYSTYPE yyval_default;
1222# define YY_INITIAL_VALUE(Value) = Value
1223#endif
1224#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1225# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1226# define YY_IGNORE_MAYBE_UNINITIALIZED_END
1227#endif
1228#ifndef YY_INITIAL_VALUE
1229# define YY_INITIAL_VALUE(Value) /* Nothing. */
1230#endif
1231
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001232/* The semantic value of the lookahead symbol. */
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001233YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001234
1235 /* Number of syntax errors so far. */
1236 int yynerrs;
1237
1238 int yystate;
1239 /* Number of tokens to shift before error messages enabled. */
1240 int yyerrstatus;
1241
1242 /* The stacks and their tools:
1243 `yyss': related to states.
1244 `yyvs': related to semantic values.
1245
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001246 Refer to the stacks through separate pointers, to allow yyoverflow
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001247 to reallocate them elsewhere. */
1248
1249 /* The state stack. */
1250 yytype_int16 yyssa[YYINITDEPTH];
1251 yytype_int16 *yyss;
1252 yytype_int16 *yyssp;
1253
1254 /* The semantic value stack. */
1255 YYSTYPE yyvsa[YYINITDEPTH];
1256 YYSTYPE *yyvs;
1257 YYSTYPE *yyvsp;
1258
1259 YYSIZE_T yystacksize;
1260
1261 int yyn;
1262 int yyresult;
1263 /* Lookahead token as an internal (translated) token number. */
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001264 int yytoken = 0;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001265 /* The variables used to return semantic value and location from the
1266 action routines. */
1267 YYSTYPE yyval;
1268
1269#if YYERROR_VERBOSE
1270 /* Buffer for error messages, and its allocated size. */
1271 char yymsgbuf[128];
1272 char *yymsg = yymsgbuf;
1273 YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1274#endif
1275
1276#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1277
1278 /* The number of symbols on the RHS of the reduced rule.
1279 Keep to zero when no symbol should be popped. */
1280 int yylen = 0;
1281
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001282 yyssp = yyss = yyssa;
1283 yyvsp = yyvs = yyvsa;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001284 yystacksize = YYINITDEPTH;
1285
1286 YYDPRINTF ((stderr, "Starting parse\n"));
1287
1288 yystate = 0;
1289 yyerrstatus = 0;
1290 yynerrs = 0;
1291 yychar = YYEMPTY; /* Cause a token to be read. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001292 goto yysetstate;
1293
1294/*------------------------------------------------------------.
1295| yynewstate -- Push a new state, which is found in yystate. |
1296`------------------------------------------------------------*/
1297 yynewstate:
1298 /* In all cases, when you get here, the value and location stacks
1299 have just been pushed. So pushing a state here evens the stacks. */
1300 yyssp++;
1301
1302 yysetstate:
1303 *yyssp = yystate;
1304
1305 if (yyss + yystacksize - 1 <= yyssp)
1306 {
1307 /* Get the current used size of the three stacks, in elements. */
1308 YYSIZE_T yysize = yyssp - yyss + 1;
1309
1310#ifdef yyoverflow
1311 {
1312 /* Give user a chance to reallocate the stack. Use copies of
1313 these so that the &'s don't force the real ones into
1314 memory. */
1315 YYSTYPE *yyvs1 = yyvs;
1316 yytype_int16 *yyss1 = yyss;
1317
1318 /* Each stack pointer address is followed by the size of the
1319 data in use in that stack, in bytes. This used to be a
1320 conditional around just the two extra args, but that might
1321 be undefined if yyoverflow is a macro. */
1322 yyoverflow (YY_("memory exhausted"),
1323 &yyss1, yysize * sizeof (*yyssp),
1324 &yyvs1, yysize * sizeof (*yyvsp),
1325 &yystacksize);
1326
1327 yyss = yyss1;
1328 yyvs = yyvs1;
1329 }
1330#else /* no yyoverflow */
1331# ifndef YYSTACK_RELOCATE
1332 goto yyexhaustedlab;
1333# else
1334 /* Extend the stack our own way. */
1335 if (YYMAXDEPTH <= yystacksize)
1336 goto yyexhaustedlab;
1337 yystacksize *= 2;
1338 if (YYMAXDEPTH < yystacksize)
1339 yystacksize = YYMAXDEPTH;
1340
1341 {
1342 yytype_int16 *yyss1 = yyss;
1343 union yyalloc *yyptr =
1344 (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1345 if (! yyptr)
1346 goto yyexhaustedlab;
1347 YYSTACK_RELOCATE (yyss_alloc, yyss);
1348 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
1349# undef YYSTACK_RELOCATE
1350 if (yyss1 != yyssa)
1351 YYSTACK_FREE (yyss1);
1352 }
1353# endif
1354#endif /* no yyoverflow */
1355
1356 yyssp = yyss + yysize - 1;
1357 yyvsp = yyvs + yysize - 1;
1358
1359 YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1360 (unsigned long int) yystacksize));
1361
1362 if (yyss + yystacksize - 1 <= yyssp)
1363 YYABORT;
1364 }
1365
1366 YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1367
1368 if (yystate == YYFINAL)
1369 YYACCEPT;
1370
1371 goto yybackup;
1372
1373/*-----------.
1374| yybackup. |
1375`-----------*/
1376yybackup:
1377
1378 /* Do appropriate processing given the current state. Read a
1379 lookahead token if we need one and don't already have one. */
1380
1381 /* First try to decide what to do without reference to lookahead token. */
1382 yyn = yypact[yystate];
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001383 if (yypact_value_is_default (yyn))
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001384 goto yydefault;
1385
1386 /* Not known => get a lookahead token if don't already have one. */
1387
1388 /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
1389 if (yychar == YYEMPTY)
1390 {
1391 YYDPRINTF ((stderr, "Reading a token: "));
1392 yychar = YYLEX;
1393 }
1394
1395 if (yychar <= YYEOF)
1396 {
1397 yychar = yytoken = YYEOF;
1398 YYDPRINTF ((stderr, "Now at end of input.\n"));
1399 }
1400 else
1401 {
1402 yytoken = YYTRANSLATE (yychar);
1403 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1404 }
1405
1406 /* If the proper action on seeing token YYTOKEN is to reduce or to
1407 detect an error, take that action. */
1408 yyn += yytoken;
1409 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1410 goto yydefault;
1411 yyn = yytable[yyn];
1412 if (yyn <= 0)
1413 {
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001414 if (yytable_value_is_error (yyn))
1415 goto yyerrlab;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001416 yyn = -yyn;
1417 goto yyreduce;
1418 }
1419
1420 /* Count tokens shifted since error; after three, turn off error
1421 status. */
1422 if (yyerrstatus)
1423 yyerrstatus--;
1424
1425 /* Shift the lookahead token. */
1426 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1427
1428 /* Discard the shifted token. */
1429 yychar = YYEMPTY;
1430
1431 yystate = yyn;
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001432 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001433 *++yyvsp = yylval;
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001434 YY_IGNORE_MAYBE_UNINITIALIZED_END
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001435
1436 goto yynewstate;
1437
1438
1439/*-----------------------------------------------------------.
1440| yydefault -- do the default action for the current state. |
1441`-----------------------------------------------------------*/
1442yydefault:
1443 yyn = yydefact[yystate];
1444 if (yyn == 0)
1445 goto yyerrlab;
1446 goto yyreduce;
1447
1448
1449/*-----------------------------.
1450| yyreduce -- Do a reduction. |
1451`-----------------------------*/
1452yyreduce:
1453 /* yyn is the number of a rule to reduce with. */
1454 yylen = yyr2[yyn];
1455
1456 /* If YYLEN is nonzero, implement the default value of the action:
1457 `$$ = $1'.
1458
1459 Otherwise, the following line sets YYVAL to garbage.
1460 This behavior is undocumented and Bison
1461 users should not rely upon it. Assigning to YYVAL
1462 unconditionally makes the parser a bit smaller, and it avoids a
1463 GCC warning that YYVAL may be used uninitialized. */
1464 yyval = yyvsp[1-yylen];
1465
1466
1467 YY_REDUCE_PRINT (yyn);
1468 switch (yyn)
1469 {
1470 case 2:
1471
1472 {
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +00001473 *(context->result) = static_cast<int>((yyvsp[(1) - (1)]));
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001474 YYACCEPT;
1475 }
1476 break;
1477
1478 case 4:
1479
1480 {
1481 (yyval) = (yyvsp[(1) - (3)]) || (yyvsp[(3) - (3)]);
1482 }
1483 break;
1484
1485 case 5:
1486
1487 {
1488 (yyval) = (yyvsp[(1) - (3)]) && (yyvsp[(3) - (3)]);
1489 }
1490 break;
1491
1492 case 6:
1493
1494 {
1495 (yyval) = (yyvsp[(1) - (3)]) | (yyvsp[(3) - (3)]);
1496 }
1497 break;
1498
1499 case 7:
1500
1501 {
1502 (yyval) = (yyvsp[(1) - (3)]) ^ (yyvsp[(3) - (3)]);
1503 }
1504 break;
1505
1506 case 8:
1507
1508 {
1509 (yyval) = (yyvsp[(1) - (3)]) & (yyvsp[(3) - (3)]);
1510 }
1511 break;
1512
1513 case 9:
1514
1515 {
1516 (yyval) = (yyvsp[(1) - (3)]) != (yyvsp[(3) - (3)]);
1517 }
1518 break;
1519
1520 case 10:
1521
1522 {
1523 (yyval) = (yyvsp[(1) - (3)]) == (yyvsp[(3) - (3)]);
1524 }
1525 break;
1526
1527 case 11:
1528
1529 {
1530 (yyval) = (yyvsp[(1) - (3)]) >= (yyvsp[(3) - (3)]);
1531 }
1532 break;
1533
1534 case 12:
1535
1536 {
1537 (yyval) = (yyvsp[(1) - (3)]) <= (yyvsp[(3) - (3)]);
1538 }
1539 break;
1540
1541 case 13:
1542
1543 {
1544 (yyval) = (yyvsp[(1) - (3)]) > (yyvsp[(3) - (3)]);
1545 }
1546 break;
1547
1548 case 14:
1549
1550 {
1551 (yyval) = (yyvsp[(1) - (3)]) < (yyvsp[(3) - (3)]);
1552 }
1553 break;
1554
1555 case 15:
1556
1557 {
1558 (yyval) = (yyvsp[(1) - (3)]) >> (yyvsp[(3) - (3)]);
1559 }
1560 break;
1561
1562 case 16:
1563
1564 {
1565 (yyval) = (yyvsp[(1) - (3)]) << (yyvsp[(3) - (3)]);
1566 }
1567 break;
1568
1569 case 17:
1570
1571 {
1572 (yyval) = (yyvsp[(1) - (3)]) - (yyvsp[(3) - (3)]);
1573 }
1574 break;
1575
1576 case 18:
1577
1578 {
1579 (yyval) = (yyvsp[(1) - (3)]) + (yyvsp[(3) - (3)]);
1580 }
1581 break;
1582
1583 case 19:
1584
1585 {
1586 if ((yyvsp[(3) - (3)]) == 0) {
alokp@chromium.org2e818912012-06-29 21:26:03 +00001587 std::ostringstream stream;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001588 stream << (yyvsp[(1) - (3)]) << " % " << (yyvsp[(3) - (3)]);
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001589 std::string text = stream.str();
Shannon Woods7f2d7942013-11-19 15:07:58 -05001590 context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001591 context->token->location,
1592 text.c_str());
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001593 YYABORT;
1594 } else {
1595 (yyval) = (yyvsp[(1) - (3)]) % (yyvsp[(3) - (3)]);
1596 }
1597 }
1598 break;
1599
1600 case 20:
1601
1602 {
1603 if ((yyvsp[(3) - (3)]) == 0) {
alokp@chromium.org2e818912012-06-29 21:26:03 +00001604 std::ostringstream stream;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001605 stream << (yyvsp[(1) - (3)]) << " / " << (yyvsp[(3) - (3)]);
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001606 std::string text = stream.str();
Shannon Woods7f2d7942013-11-19 15:07:58 -05001607 context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001608 context->token->location,
1609 text.c_str());
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001610 YYABORT;
1611 } else {
1612 (yyval) = (yyvsp[(1) - (3)]) / (yyvsp[(3) - (3)]);
1613 }
1614 }
1615 break;
1616
1617 case 21:
1618
1619 {
1620 (yyval) = (yyvsp[(1) - (3)]) * (yyvsp[(3) - (3)]);
1621 }
1622 break;
1623
1624 case 22:
1625
1626 {
1627 (yyval) = ! (yyvsp[(2) - (2)]);
1628 }
1629 break;
1630
1631 case 23:
1632
1633 {
1634 (yyval) = ~ (yyvsp[(2) - (2)]);
1635 }
1636 break;
1637
1638 case 24:
1639
1640 {
1641 (yyval) = - (yyvsp[(2) - (2)]);
1642 }
1643 break;
1644
1645 case 25:
1646
1647 {
1648 (yyval) = + (yyvsp[(2) - (2)]);
1649 }
1650 break;
1651
1652 case 26:
1653
1654 {
1655 (yyval) = (yyvsp[(2) - (3)]);
1656 }
1657 break;
1658
1659
1660
1661 default: break;
1662 }
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001663 /* User semantic actions sometimes alter yychar, and that requires
1664 that yytoken be updated with the new translation. We take the
1665 approach of translating immediately before every use of yytoken.
1666 One alternative is translating here after every semantic action,
1667 but that translation would be missed if the semantic action invokes
1668 YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
1669 if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
1670 incorrect destructor might then be invoked immediately. In the
1671 case of YYERROR or YYBACKUP, subsequent parser actions might lead
1672 to an incorrect destructor call or verbose syntax error message
1673 before the lookahead is translated. */
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001674 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
1675
1676 YYPOPSTACK (yylen);
1677 yylen = 0;
1678 YY_STACK_PRINT (yyss, yyssp);
1679
1680 *++yyvsp = yyval;
1681
1682 /* Now `shift' the result of the reduction. Determine what state
1683 that goes to, based on the state we popped back to and the rule
1684 number reduced by. */
1685
1686 yyn = yyr1[yyn];
1687
1688 yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
1689 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1690 yystate = yytable[yystate];
1691 else
1692 yystate = yydefgoto[yyn - YYNTOKENS];
1693
1694 goto yynewstate;
1695
1696
1697/*------------------------------------.
1698| yyerrlab -- here on detecting error |
1699`------------------------------------*/
1700yyerrlab:
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001701 /* Make sure we have latest lookahead translation. See comments at
1702 user semantic actions for why this is necessary. */
1703 yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
1704
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001705 /* If not already recovering from an error, report this error. */
1706 if (!yyerrstatus)
1707 {
1708 ++yynerrs;
1709#if ! YYERROR_VERBOSE
1710 yyerror (context, YY_("syntax error"));
1711#else
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001712# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
1713 yyssp, yytoken)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001714 {
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001715 char const *yymsgp = YY_("syntax error");
1716 int yysyntax_error_status;
1717 yysyntax_error_status = YYSYNTAX_ERROR;
1718 if (yysyntax_error_status == 0)
1719 yymsgp = yymsg;
1720 else if (yysyntax_error_status == 1)
1721 {
1722 if (yymsg != yymsgbuf)
1723 YYSTACK_FREE (yymsg);
1724 yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
1725 if (!yymsg)
1726 {
1727 yymsg = yymsgbuf;
1728 yymsg_alloc = sizeof yymsgbuf;
1729 yysyntax_error_status = 2;
1730 }
1731 else
1732 {
1733 yysyntax_error_status = YYSYNTAX_ERROR;
1734 yymsgp = yymsg;
1735 }
1736 }
1737 yyerror (context, yymsgp);
1738 if (yysyntax_error_status == 2)
1739 goto yyexhaustedlab;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001740 }
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001741# undef YYSYNTAX_ERROR
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001742#endif
1743 }
1744
1745
1746
1747 if (yyerrstatus == 3)
1748 {
1749 /* If just tried and failed to reuse lookahead token after an
1750 error, discard it. */
1751
1752 if (yychar <= YYEOF)
1753 {
1754 /* Return failure if at end of input. */
1755 if (yychar == YYEOF)
1756 YYABORT;
1757 }
1758 else
1759 {
1760 yydestruct ("Error: discarding",
1761 yytoken, &yylval, context);
1762 yychar = YYEMPTY;
1763 }
1764 }
1765
1766 /* Else will try to reuse lookahead token after shifting the error
1767 token. */
1768 goto yyerrlab1;
1769
1770
1771/*---------------------------------------------------.
1772| yyerrorlab -- error raised explicitly by YYERROR. |
1773`---------------------------------------------------*/
1774yyerrorlab:
1775
1776 /* Pacify compilers like GCC when the user code never invokes
1777 YYERROR and the label yyerrorlab therefore never appears in user
1778 code. */
1779 if (/*CONSTCOND*/ 0)
1780 goto yyerrorlab;
1781
1782 /* Do not reclaim the symbols of the rule which action triggered
1783 this YYERROR. */
1784 YYPOPSTACK (yylen);
1785 yylen = 0;
1786 YY_STACK_PRINT (yyss, yyssp);
1787 yystate = *yyssp;
1788 goto yyerrlab1;
1789
1790
1791/*-------------------------------------------------------------.
1792| yyerrlab1 -- common code for both syntax error and YYERROR. |
1793`-------------------------------------------------------------*/
1794yyerrlab1:
1795 yyerrstatus = 3; /* Each real token shifted decrements this. */
1796
1797 for (;;)
1798 {
1799 yyn = yypact[yystate];
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001800 if (!yypact_value_is_default (yyn))
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001801 {
1802 yyn += YYTERROR;
1803 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
1804 {
1805 yyn = yytable[yyn];
1806 if (0 < yyn)
1807 break;
1808 }
1809 }
1810
1811 /* Pop the current state because it cannot handle the error token. */
1812 if (yyssp == yyss)
1813 YYABORT;
1814
1815
1816 yydestruct ("Error: popping",
1817 yystos[yystate], yyvsp, context);
1818 YYPOPSTACK (1);
1819 yystate = *yyssp;
1820 YY_STACK_PRINT (yyss, yyssp);
1821 }
1822
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001823 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001824 *++yyvsp = yylval;
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001825 YY_IGNORE_MAYBE_UNINITIALIZED_END
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001826
1827
1828 /* Shift the error token. */
1829 YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
1830
1831 yystate = yyn;
1832 goto yynewstate;
1833
1834
1835/*-------------------------------------.
1836| yyacceptlab -- YYACCEPT comes here. |
1837`-------------------------------------*/
1838yyacceptlab:
1839 yyresult = 0;
1840 goto yyreturn;
1841
1842/*-----------------------------------.
1843| yyabortlab -- YYABORT comes here. |
1844`-----------------------------------*/
1845yyabortlab:
1846 yyresult = 1;
1847 goto yyreturn;
1848
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001849#if !defined yyoverflow || YYERROR_VERBOSE
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001850/*-------------------------------------------------.
1851| yyexhaustedlab -- memory exhaustion comes here. |
1852`-------------------------------------------------*/
1853yyexhaustedlab:
1854 yyerror (context, YY_("memory exhausted"));
1855 yyresult = 2;
1856 /* Fall through. */
1857#endif
1858
1859yyreturn:
1860 if (yychar != YYEMPTY)
shannonwoods@chromium.org4b8a3112013-05-30 00:13:01 +00001861 {
1862 /* Make sure we have latest lookahead translation. See comments at
1863 user semantic actions for why this is necessary. */
1864 yytoken = YYTRANSLATE (yychar);
1865 yydestruct ("Cleanup: discarding lookahead",
1866 yytoken, &yylval, context);
1867 }
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001868 /* Do not reclaim the symbols of the rule which action triggered
1869 this YYABORT or YYACCEPT. */
1870 YYPOPSTACK (yylen);
1871 YY_STACK_PRINT (yyss, yyssp);
1872 while (yyssp != yyss)
1873 {
1874 yydestruct ("Cleanup: popping",
1875 yystos[*yyssp], yyvsp, context);
1876 YYPOPSTACK (1);
1877 }
1878#ifndef yyoverflow
1879 if (yyss != yyssa)
1880 YYSTACK_FREE (yyss);
1881#endif
1882#if YYERROR_VERBOSE
1883 if (yymsg != yymsgbuf)
1884 YYSTACK_FREE (yymsg);
1885#endif
1886 /* Make sure YYID is used. */
1887 return YYID (yyresult);
1888}
1889
1890
1891
1892
1893
Zhenyao Mod526f982014-05-13 14:51:19 -07001894int yylex(YYSTYPE *lvalp, Context *context)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001895{
1896 int type = 0;
1897
Zhenyao Mod526f982014-05-13 14:51:19 -07001898 pp::Token *token = context->token;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001899 switch (token->type)
1900 {
Zhenyao Mod526f982014-05-13 14:51:19 -07001901 case pp::Token::CONST_INT: {
alokp@chromium.org2e818912012-06-29 21:26:03 +00001902 unsigned int val = 0;
1903 if (!token->uValue(&val))
1904 {
Shannon Woods7f2d7942013-11-19 15:07:58 -05001905 context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
alokp@chromium.org2e818912012-06-29 21:26:03 +00001906 token->location, token->text);
1907 }
1908 *lvalp = static_cast<YYSTYPE>(val);
maxvujovic@gmail.come640ef82012-07-13 18:42:40 +00001909 type = TOK_CONST_INT;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001910 break;
alokp@chromium.org2e818912012-06-29 21:26:03 +00001911 }
Zhenyao Mod526f982014-05-13 14:51:19 -07001912 case pp::Token::OP_OR:
1913 type = TOK_OP_OR;
1914 break;
1915 case pp::Token::OP_AND:
1916 type = TOK_OP_AND;
1917 break;
1918 case pp::Token::OP_NE:
1919 type = TOK_OP_NE;
1920 break;
1921 case pp::Token::OP_EQ:
1922 type = TOK_OP_EQ;
1923 break;
1924 case pp::Token::OP_GE:
1925 type = TOK_OP_GE;
1926 break;
1927 case pp::Token::OP_LE:
1928 type = TOK_OP_LE;
1929 break;
1930 case pp::Token::OP_RIGHT:
1931 type = TOK_OP_RIGHT;
1932 break;
1933 case pp::Token::OP_LEFT:
1934 type = TOK_OP_LEFT;
1935 break;
1936 case '|':
1937 case '^':
1938 case '&':
1939 case '>':
1940 case '<':
1941 case '-':
1942 case '+':
1943 case '%':
1944 case '/':
1945 case '*':
1946 case '!':
1947 case '~':
1948 case '(':
1949 case ')':
1950 type = token->type;
1951 break;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001952
Zhenyao Mod526f982014-05-13 14:51:19 -07001953 default:
1954 break;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001955 }
1956
1957 // Advance to the next token if the current one is valid.
Zhenyao Mod526f982014-05-13 14:51:19 -07001958 if (type != 0)
1959 context->lexer->lex(token);
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001960
1961 return type;
1962}
1963
Zhenyao Mod526f982014-05-13 14:51:19 -07001964void yyerror(Context *context, const char *reason)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001965{
Shannon Woods7f2d7942013-11-19 15:07:58 -05001966 context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION,
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001967 context->token->location,
1968 reason);
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001969}
1970
1971namespace pp {
1972
Zhenyao Mod526f982014-05-13 14:51:19 -07001973ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics)
1974 : mLexer(lexer),
1975 mDiagnostics(diagnostics)
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001976{
1977}
1978
Zhenyao Mod526f982014-05-13 14:51:19 -07001979bool ExpressionParser::parse(Token *token, int *result)
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001980{
1981 Context context;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00001982 context.diagnostics = mDiagnostics;
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001983 context.lexer = mLexer;
1984 context.token = token;
1985 context.result = result;
1986 int ret = yyparse(&context);
1987 switch (ret)
1988 {
1989 case 0:
1990 case 1:
1991 break;
1992
1993 case 2:
Shannon Woods7f2d7942013-11-19 15:07:58 -05001994 mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token->location, "");
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001995 break;
1996
1997 default:
1998 assert(false);
Shannon Woods7f2d7942013-11-19 15:07:58 -05001999 mDiagnostics->report(Diagnostics::PP_INTERNAL_ERROR, token->location, "");
alokp@chromium.org04d7d222012-05-16 19:24:07 +00002000 break;
2001 }
alokp@chromium.org2c958ee2012-05-17 20:35:42 +00002002
alokp@chromium.org04d7d222012-05-16 19:24:07 +00002003 return ret == 0;
2004}
2005
2006} // namespace pp