annotate src/sdl/expr.cpp @ 52:ee70875e0d3e

working on the API
author Robert McIntyre <rlm@mit.edu>
date Wed, 07 Mar 2012 02:12:59 -0600
parents f9f4f1b99eed
children
rev   line source
rlm@1 1
rlm@1 2 /* A Bison parser, made from expr.y
rlm@1 3 by GNU Bison version 1.28 */
rlm@1 4
rlm@1 5 #define YYBISON 1 /* Identify Bison output. */
rlm@1 6
rlm@1 7 #define TOKEN_IDENTIFIER 257
rlm@1 8 #define TOKEN_DOT 258
rlm@1 9 #define TOKEN_STAR 259
rlm@1 10 #define TOKEN_ARROW 260
rlm@1 11 #define TOKEN_ADDR 261
rlm@1 12 #define TOKEN_SIZEOF 262
rlm@1 13 #define TOKEN_NUMBER 263
rlm@1 14
rlm@1 15 #line 1 "expr.y"
rlm@1 16
rlm@1 17 namespace std {
rlm@1 18 #include <stdio.h>
rlm@1 19 #include <memory.h>
rlm@1 20 #include <stdlib.h>
rlm@1 21 #include <string.h>
rlm@1 22 }
rlm@1 23
rlm@1 24 using namespace std;
rlm@1 25
rlm@1 26 #include "../common/System.h"
rlm@1 27 #include "../gba/elf.h"
rlm@1 28 #include "exprNode.h"
rlm@1 29
rlm@1 30 extern int yyerror(char *);
rlm@1 31 extern int yylex();
rlm@1 32 extern char *yytext;
rlm@1 33
rlm@1 34
rlm@1 35 //#define YYERROR_VERBOSE 1
rlm@1 36 //#define YYDEBUG 1
rlm@1 37
rlm@1 38 Node *result = NULL;
rlm@1 39 #ifndef YYSTYPE
rlm@1 40 #define YYSTYPE int
rlm@1 41 #endif
rlm@1 42 #include <stdio.h>
rlm@1 43
rlm@1 44 #ifndef __cplusplus
rlm@1 45 #ifndef __STDC__
rlm@1 46 #define const
rlm@1 47 #endif
rlm@1 48 #endif
rlm@1 49
rlm@1 50
rlm@1 51
rlm@1 52 #define YYFINAL 26
rlm@1 53 #define YYFLAG -32768
rlm@1 54 #define YYNTBASE 14
rlm@1 55
rlm@1 56 #define YYTRANSLATE(x) ((unsigned)(x) <= 263 ? yytranslate[x] : 19)
rlm@1 57
rlm@1 58 static const char yytranslate[] = { 0,
rlm@1 59 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 62 2, 2, 2, 2, 2, 2, 2, 2, 2, 11,
rlm@1 63 12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 64 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 68 10, 2, 13, 2, 2, 2, 2, 2, 2, 2,
rlm@1 69 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 70 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 71 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 72 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 73 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 75 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 80 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 83 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
rlm@1 84 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
rlm@1 85 7, 8, 9
rlm@1 86 };
rlm@1 87
rlm@1 88 #if YYDEBUG != 0
rlm@1 89 static const short yyprhs[] = { 0,
rlm@1 90 0, 2, 4, 8, 12, 16, 21, 23, 26, 29,
rlm@1 91 34, 36
rlm@1 92 };
rlm@1 93
rlm@1 94 static const short yyrhs[] = { 15,
rlm@1 95 0, 16, 0, 11, 15, 12, 0, 15, 4, 18,
rlm@1 96 0, 15, 6, 18, 0, 15, 10, 17, 13, 0,
rlm@1 97 18, 0, 5, 15, 0, 7, 15, 0, 8, 11,
rlm@1 98 15, 12, 0, 9, 0, 3, 0
rlm@1 99 };
rlm@1 100
rlm@1 101 #endif
rlm@1 102
rlm@1 103 #if YYDEBUG != 0
rlm@1 104 static const short yyrline[] = { 0,
rlm@1 105 32, 35, 36, 37, 38, 39, 42, 43, 44, 45,
rlm@1 106 49, 53
rlm@1 107 };
rlm@1 108 #endif
rlm@1 109
rlm@1 110
rlm@1 111 #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
rlm@1 112
rlm@1 113 static const char * const yytname[] = { "$","error","$undefined.","TOKEN_IDENTIFIER",
rlm@1 114 "TOKEN_DOT","TOKEN_STAR","TOKEN_ARROW","TOKEN_ADDR","TOKEN_SIZEOF","TOKEN_NUMBER",
rlm@1 115 "'['","'('","')'","']'","final","expression","simple_expression","number","ident", NULL
rlm@1 116 };
rlm@1 117 #endif
rlm@1 118
rlm@1 119 static const short yyr1[] = { 0,
rlm@1 120 14, 15, 15, 15, 15, 15, 16, 16, 16, 16,
rlm@1 121 17, 18
rlm@1 122 };
rlm@1 123
rlm@1 124 static const short yyr2[] = { 0,
rlm@1 125 1, 1, 3, 3, 3, 4, 1, 2, 2, 4,
rlm@1 126 1, 1
rlm@1 127 };
rlm@1 128
rlm@1 129 static const short yydefact[] = { 0,
rlm@1 130 12, 0, 0, 0, 0, 1, 2, 7, 8, 9,
rlm@1 131 0, 0, 0, 0, 0, 0, 3, 4, 5, 11,
rlm@1 132 0, 10, 6, 0, 0, 0
rlm@1 133 };
rlm@1 134
rlm@1 135 static const short yydefgoto[] = { 24,
rlm@1 136 6, 7, 21, 8
rlm@1 137 };
rlm@1 138
rlm@1 139 static const short yypact[] = { -1,
rlm@1 140 -32768, -1, -1, -6, -1, 17,-32768,-32768, 17, 17,
rlm@1 141 -1, 7, 5, 5, 13, 8,-32768,-32768,-32768,-32768,
rlm@1 142 11,-32768,-32768, 25, 26,-32768
rlm@1 143 };
rlm@1 144
rlm@1 145 static const short yypgoto[] = {-32768,
rlm@1 146 -2,-32768,-32768, 2
rlm@1 147 };
rlm@1 148
rlm@1 149
rlm@1 150 #define YYLAST 27
rlm@1 151
rlm@1 152
rlm@1 153 static const short yytable[] = { 9,
rlm@1 154 10, 1, 12, 2, 11, 3, 4, 1, 16, 5,
rlm@1 155 13, 13, 14, 14, 18, 19, 15, 15, 17, 22,
rlm@1 156 13, 20, 14, 23, 25, 26, 15
rlm@1 157 };
rlm@1 158
rlm@1 159 static const short yycheck[] = { 2,
rlm@1 160 3, 3, 5, 5, 11, 7, 8, 3, 11, 11,
rlm@1 161 4, 4, 6, 6, 13, 14, 10, 10, 12, 12,
rlm@1 162 4, 9, 6, 13, 0, 0, 10
rlm@1 163 };
rlm@1 164 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
rlm@1 165 #line 3 "/usr/lib/bison.simple"
rlm@1 166 /* This file comes from bison-1.28. */
rlm@1 167
rlm@1 168 /* Skeleton output parser for bison,
rlm@1 169 Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
rlm@1 170
rlm@1 171 This program is free software; you can redistribute it and/or modify
rlm@1 172 it under the terms of the GNU General Public License as published by
rlm@1 173 the Free Software Foundation; either version 2, or (at your option)
rlm@1 174 any later version.
rlm@1 175
rlm@1 176 This program is distributed in the hope that it will be useful,
rlm@1 177 but WITHOUT ANY WARRANTY; without even the implied warranty of
rlm@1 178 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
rlm@1 179 GNU General Public License for more details.
rlm@1 180
rlm@1 181 You should have received a copy of the GNU General Public License
rlm@1 182 along with this program; if not, write to the Free Software
rlm@1 183 Foundation, Inc., 59 Temple Place - Suite 330,
rlm@1 184 Boston, MA 02111-1307, USA. */
rlm@1 185
rlm@1 186 /* As a special exception, when this file is copied by Bison into a
rlm@1 187 Bison output file, you may use that output file without restriction.
rlm@1 188 This special exception was added by the Free Software Foundation
rlm@1 189 in version 1.24 of Bison. */
rlm@1 190
rlm@1 191 /* This is the parser code that is written into each bison parser
rlm@1 192 when the %semantic_parser declaration is not specified in the grammar.
rlm@1 193 It was written by Richard Stallman by simplifying the hairy parser
rlm@1 194 used when %semantic_parser is specified. */
rlm@1 195
rlm@1 196 #ifndef YYSTACK_USE_ALLOCA
rlm@1 197 #ifdef alloca
rlm@1 198 #define YYSTACK_USE_ALLOCA
rlm@1 199 #else /* alloca not defined */
rlm@1 200 #ifdef __GNUC__
rlm@1 201 #define YYSTACK_USE_ALLOCA
rlm@1 202 #define alloca __builtin_alloca
rlm@1 203 #else /* not GNU C. */
rlm@1 204 #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
rlm@1 205 #define YYSTACK_USE_ALLOCA
rlm@1 206 #include <alloca.h>
rlm@1 207 #else /* not sparc */
rlm@1 208 /* We think this test detects Watcom and Microsoft C. */
rlm@1 209 /* This used to test MSDOS, but that is a bad idea
rlm@1 210 since that symbol is in the user namespace. */
rlm@1 211 #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
rlm@1 212 #if 0 /* No need for malloc.h, which pollutes the namespace;
rlm@1 213 instead, just don't use alloca. */
rlm@1 214 #include <malloc.h>
rlm@1 215 #endif
rlm@1 216 #else /* not MSDOS, or __TURBOC__ */
rlm@1 217 #if defined(_AIX)
rlm@1 218 /* I don't know what this was needed for, but it pollutes the namespace.
rlm@1 219 So I turned it off. rms, 2 May 1997. */
rlm@1 220 /* #include <malloc.h> */
rlm@1 221 #pragma alloca
rlm@1 222 #define YYSTACK_USE_ALLOCA
rlm@1 223 #else /* not MSDOS, or __TURBOC__, or _AIX */
rlm@1 224 #if 0
rlm@1 225 #ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
rlm@1 226 and on HPUX 10. Eventually we can turn this on. */
rlm@1 227 #define YYSTACK_USE_ALLOCA
rlm@1 228 #define alloca __builtin_alloca
rlm@1 229 #endif /* __hpux */
rlm@1 230 #endif
rlm@1 231 #endif /* not _AIX */
rlm@1 232 #endif /* not MSDOS, or __TURBOC__ */
rlm@1 233 #endif /* not sparc */
rlm@1 234 #endif /* not GNU C */
rlm@1 235 #endif /* alloca not defined */
rlm@1 236 #endif /* YYSTACK_USE_ALLOCA not defined */
rlm@1 237
rlm@1 238 #ifdef YYSTACK_USE_ALLOCA
rlm@1 239 #define YYSTACK_ALLOC alloca
rlm@1 240 #else
rlm@1 241 #define YYSTACK_ALLOC malloc
rlm@1 242 #endif
rlm@1 243
rlm@1 244 /* Note: there must be only one dollar sign in this file.
rlm@1 245 It is replaced by the list of actions, each action
rlm@1 246 as one case of the switch. */
rlm@1 247
rlm@1 248 #define yyerrok (yyerrstatus = 0)
rlm@1 249 #define yyclearin (yychar = YYEMPTY)
rlm@1 250 #define YYEMPTY -2
rlm@1 251 #define YYEOF 0
rlm@1 252 #define YYACCEPT goto yyacceptlab
rlm@1 253 #define YYABORT goto yyabortlab
rlm@1 254 #define YYERROR goto yyerrlab1
rlm@1 255 /* Like YYERROR except do call yyerror.
rlm@1 256 This remains here temporarily to ease the
rlm@1 257 transition to the new meaning of YYERROR, for GCC.
rlm@1 258 Once GCC version 2 has supplanted version 1, this can go. */
rlm@1 259 #define YYFAIL goto yyerrlab
rlm@1 260 #define YYRECOVERING() (!!yyerrstatus)
rlm@1 261 #define YYBACKUP(token, value) \
rlm@1 262 do \
rlm@1 263 if (yychar == YYEMPTY && yylen == 1) \
rlm@1 264 { yychar = (token), yylval = (value); \
rlm@1 265 yychar1 = YYTRANSLATE (yychar); \
rlm@1 266 YYPOPSTACK; \
rlm@1 267 goto yybackup; \
rlm@1 268 } \
rlm@1 269 else \
rlm@1 270 { yyerror ("syntax error: cannot back up"); YYERROR; } \
rlm@1 271 while (0)
rlm@1 272
rlm@1 273 #define YYTERROR 1
rlm@1 274 #define YYERRCODE 256
rlm@1 275
rlm@1 276 #ifndef YYPURE
rlm@1 277 #define YYLEX yylex()
rlm@1 278 #endif
rlm@1 279
rlm@1 280 #ifdef YYPURE
rlm@1 281 #ifdef YYLSP_NEEDED
rlm@1 282 #ifdef YYLEX_PARAM
rlm@1 283 #define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
rlm@1 284 #else
rlm@1 285 #define YYLEX yylex(&yylval, &yylloc)
rlm@1 286 #endif
rlm@1 287 #else /* not YYLSP_NEEDED */
rlm@1 288 #ifdef YYLEX_PARAM
rlm@1 289 #define YYLEX yylex(&yylval, YYLEX_PARAM)
rlm@1 290 #else
rlm@1 291 #define YYLEX yylex(&yylval)
rlm@1 292 #endif
rlm@1 293 #endif /* not YYLSP_NEEDED */
rlm@1 294 #endif
rlm@1 295
rlm@1 296 /* If nonreentrant, generate the variables here */
rlm@1 297
rlm@1 298 #ifndef YYPURE
rlm@1 299
rlm@1 300 int yychar; /* the lookahead symbol */
rlm@1 301 YYSTYPE yylval; /* the semantic value of the */
rlm@1 302 /* lookahead symbol */
rlm@1 303
rlm@1 304 #ifdef YYLSP_NEEDED
rlm@1 305 YYLTYPE yylloc; /* location data for the lookahead */
rlm@1 306 /* symbol */
rlm@1 307 #endif
rlm@1 308
rlm@1 309 int yynerrs; /* number of parse errors so far */
rlm@1 310 #endif /* not YYPURE */
rlm@1 311
rlm@1 312 #if YYDEBUG != 0
rlm@1 313 int yydebug; /* nonzero means print parse trace */
rlm@1 314 /* Since this is uninitialized, it does not stop multiple parsers
rlm@1 315 from coexisting. */
rlm@1 316 #endif
rlm@1 317
rlm@1 318 /* YYINITDEPTH indicates the initial size of the parser's stacks */
rlm@1 319
rlm@1 320 #ifndef YYINITDEPTH
rlm@1 321 #define YYINITDEPTH 200
rlm@1 322 #endif
rlm@1 323
rlm@1 324 /* YYMAXDEPTH is the maximum size the stacks can grow to
rlm@1 325 (effective only if the built-in stack extension method is used). */
rlm@1 326
rlm@1 327 #if YYMAXDEPTH == 0
rlm@1 328 #undef YYMAXDEPTH
rlm@1 329 #endif
rlm@1 330
rlm@1 331 #ifndef YYMAXDEPTH
rlm@1 332 #define YYMAXDEPTH 10000
rlm@1 333 #endif
rlm@1 334
rlm@1 335 /* Define __yy_memcpy. Note that the size argument
rlm@1 336 should be passed with type unsigned int, because that is what the non-GCC
rlm@1 337 definitions require. With GCC, __builtin_memcpy takes an arg
rlm@1 338 of type size_t, but it can handle unsigned int. */
rlm@1 339
rlm@1 340 #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
rlm@1 341 #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
rlm@1 342 #else /* not GNU C or C++ */
rlm@1 343 #ifndef __cplusplus
rlm@1 344
rlm@1 345 /* This is the most reliable way to avoid incompatibilities
rlm@1 346 in available built-in functions on various systems. */
rlm@1 347 static void
rlm@1 348 __yy_memcpy (to, from, count)
rlm@1 349 char *to;
rlm@1 350 char *from;
rlm@1 351 unsigned int count;
rlm@1 352 {
rlm@1 353 register char *f = from;
rlm@1 354 register char *t = to;
rlm@1 355 register int i = count;
rlm@1 356
rlm@1 357 while (i-- > 0)
rlm@1 358 *t++ = *f++;
rlm@1 359 }
rlm@1 360
rlm@1 361 #else /* __cplusplus */
rlm@1 362
rlm@1 363 /* This is the most reliable way to avoid incompatibilities
rlm@1 364 in available built-in functions on various systems. */
rlm@1 365 static void
rlm@1 366 __yy_memcpy (char *to, char *from, unsigned int count)
rlm@1 367 {
rlm@1 368 register char *t = to;
rlm@1 369 register char *f = from;
rlm@1 370 register int i = count;
rlm@1 371
rlm@1 372 while (i-- > 0)
rlm@1 373 *t++ = *f++;
rlm@1 374 }
rlm@1 375
rlm@1 376 #endif
rlm@1 377 #endif
rlm@1 378
rlm@1 379 #line 217 "/usr/lib/bison.simple"
rlm@1 380
rlm@1 381 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
rlm@1 382 into yyparse. The argument should have type void *.
rlm@1 383 It should actually point to an object.
rlm@1 384 Grammar actions can access the variable by casting it
rlm@1 385 to the proper pointer type. */
rlm@1 386
rlm@1 387 #ifdef YYPARSE_PARAM
rlm@1 388 #ifdef __cplusplus
rlm@1 389 #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
rlm@1 390 #define YYPARSE_PARAM_DECL
rlm@1 391 #else /* not __cplusplus */
rlm@1 392 #define YYPARSE_PARAM_ARG YYPARSE_PARAM
rlm@1 393 #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
rlm@1 394 #endif /* not __cplusplus */
rlm@1 395 #else /* not YYPARSE_PARAM */
rlm@1 396 #define YYPARSE_PARAM_ARG
rlm@1 397 #define YYPARSE_PARAM_DECL
rlm@1 398 #endif /* not YYPARSE_PARAM */
rlm@1 399
rlm@1 400 /* Prevent warning if -Wstrict-prototypes. */
rlm@1 401 #ifdef __GNUC__
rlm@1 402 #ifdef YYPARSE_PARAM
rlm@1 403 int yyparse (void *);
rlm@1 404 #else
rlm@1 405 int yyparse (void);
rlm@1 406 #endif
rlm@1 407 #endif
rlm@1 408
rlm@1 409 int
rlm@1 410 yyparse(YYPARSE_PARAM_ARG)
rlm@1 411 YYPARSE_PARAM_DECL
rlm@1 412 {
rlm@1 413 register int yystate;
rlm@1 414 register int yyn;
rlm@1 415 register short *yyssp;
rlm@1 416 register YYSTYPE *yyvsp;
rlm@1 417 int yyerrstatus; /* number of tokens to shift before error messages enabled */
rlm@1 418 int yychar1 = 0; /* lookahead token as an internal (translated) token number */
rlm@1 419
rlm@1 420 short yyssa[YYINITDEPTH]; /* the state stack */
rlm@1 421 YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
rlm@1 422
rlm@1 423 short *yyss = yyssa; /* refer to the stacks thru separate pointers */
rlm@1 424 YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
rlm@1 425
rlm@1 426 #ifdef YYLSP_NEEDED
rlm@1 427 YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
rlm@1 428 YYLTYPE *yyls = yylsa;
rlm@1 429 YYLTYPE *yylsp;
rlm@1 430
rlm@1 431 #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
rlm@1 432 #else
rlm@1 433 #define YYPOPSTACK (yyvsp--, yyssp--)
rlm@1 434 #endif
rlm@1 435
rlm@1 436 int yystacksize = YYINITDEPTH;
rlm@1 437 int yyfree_stacks = 0;
rlm@1 438
rlm@1 439 #ifdef YYPURE
rlm@1 440 int yychar;
rlm@1 441 YYSTYPE yylval;
rlm@1 442 int yynerrs;
rlm@1 443 #ifdef YYLSP_NEEDED
rlm@1 444 YYLTYPE yylloc;
rlm@1 445 #endif
rlm@1 446 #endif
rlm@1 447
rlm@1 448 YYSTYPE yyval; /* the variable used to return */
rlm@1 449 /* semantic values from the action */
rlm@1 450 /* routines */
rlm@1 451
rlm@1 452 int yylen;
rlm@1 453
rlm@1 454 #if YYDEBUG != 0
rlm@1 455 if (yydebug)
rlm@1 456 fprintf(stderr, "Starting parse\n");
rlm@1 457 #endif
rlm@1 458
rlm@1 459 yystate = 0;
rlm@1 460 yyerrstatus = 0;
rlm@1 461 yynerrs = 0;
rlm@1 462 yychar = YYEMPTY; /* Cause a token to be read. */
rlm@1 463
rlm@1 464 /* Initialize stack pointers.
rlm@1 465 Waste one element of value and location stack
rlm@1 466 so that they stay on the same level as the state stack.
rlm@1 467 The wasted elements are never initialized. */
rlm@1 468
rlm@1 469 yyssp = yyss - 1;
rlm@1 470 yyvsp = yyvs;
rlm@1 471 #ifdef YYLSP_NEEDED
rlm@1 472 yylsp = yyls;
rlm@1 473 #endif
rlm@1 474
rlm@1 475 /* Push a new state, which is found in yystate . */
rlm@1 476 /* In all cases, when you get here, the value and location stacks
rlm@1 477 have just been pushed. so pushing a state here evens the stacks. */
rlm@1 478 yynewstate:
rlm@1 479
rlm@1 480 *++yyssp = yystate;
rlm@1 481
rlm@1 482 if (yyssp >= yyss + yystacksize - 1)
rlm@1 483 {
rlm@1 484 /* Give user a chance to reallocate the stack */
rlm@1 485 /* Use copies of these so that the &'s don't force the real ones into memory. */
rlm@1 486 YYSTYPE *yyvs1 = yyvs;
rlm@1 487 short *yyss1 = yyss;
rlm@1 488 #ifdef YYLSP_NEEDED
rlm@1 489 YYLTYPE *yyls1 = yyls;
rlm@1 490 #endif
rlm@1 491
rlm@1 492 /* Get the current used size of the three stacks, in elements. */
rlm@1 493 int size = yyssp - yyss + 1;
rlm@1 494
rlm@1 495 #ifdef yyoverflow
rlm@1 496 /* Each stack pointer address is followed by the size of
rlm@1 497 the data in use in that stack, in bytes. */
rlm@1 498 #ifdef YYLSP_NEEDED
rlm@1 499 /* This used to be a conditional around just the two extra args,
rlm@1 500 but that might be undefined if yyoverflow is a macro. */
rlm@1 501 yyoverflow("parser stack overflow",
rlm@1 502 &yyss1, size * sizeof (*yyssp),
rlm@1 503 &yyvs1, size * sizeof (*yyvsp),
rlm@1 504 &yyls1, size * sizeof (*yylsp),
rlm@1 505 &yystacksize);
rlm@1 506 #else
rlm@1 507 yyoverflow("parser stack overflow",
rlm@1 508 &yyss1, size * sizeof (*yyssp),
rlm@1 509 &yyvs1, size * sizeof (*yyvsp),
rlm@1 510 &yystacksize);
rlm@1 511 #endif
rlm@1 512
rlm@1 513 yyss = yyss1; yyvs = yyvs1;
rlm@1 514 #ifdef YYLSP_NEEDED
rlm@1 515 yyls = yyls1;
rlm@1 516 #endif
rlm@1 517 #else /* no yyoverflow */
rlm@1 518 /* Extend the stack our own way. */
rlm@1 519 if (yystacksize >= YYMAXDEPTH)
rlm@1 520 {
rlm@1 521 yyerror("parser stack overflow");
rlm@1 522 if (yyfree_stacks)
rlm@1 523 {
rlm@1 524 free (yyss);
rlm@1 525 free (yyvs);
rlm@1 526 #ifdef YYLSP_NEEDED
rlm@1 527 free (yyls);
rlm@1 528 #endif
rlm@1 529 }
rlm@1 530 return 2;
rlm@1 531 }
rlm@1 532 yystacksize *= 2;
rlm@1 533 if (yystacksize > YYMAXDEPTH)
rlm@1 534 yystacksize = YYMAXDEPTH;
rlm@1 535 #ifndef YYSTACK_USE_ALLOCA
rlm@1 536 yyfree_stacks = 1;
rlm@1 537 #endif
rlm@1 538 yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
rlm@1 539 __yy_memcpy ((char *)yyss, (char *)yyss1,
rlm@1 540 size * (unsigned int) sizeof (*yyssp));
rlm@1 541 yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
rlm@1 542 __yy_memcpy ((char *)yyvs, (char *)yyvs1,
rlm@1 543 size * (unsigned int) sizeof (*yyvsp));
rlm@1 544 #ifdef YYLSP_NEEDED
rlm@1 545 yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
rlm@1 546 __yy_memcpy ((char *)yyls, (char *)yyls1,
rlm@1 547 size * (unsigned int) sizeof (*yylsp));
rlm@1 548 #endif
rlm@1 549 #endif /* no yyoverflow */
rlm@1 550
rlm@1 551 yyssp = yyss + size - 1;
rlm@1 552 yyvsp = yyvs + size - 1;
rlm@1 553 #ifdef YYLSP_NEEDED
rlm@1 554 yylsp = yyls + size - 1;
rlm@1 555 #endif
rlm@1 556
rlm@1 557 #if YYDEBUG != 0
rlm@1 558 if (yydebug)
rlm@1 559 fprintf(stderr, "Stack size increased to %d\n", yystacksize);
rlm@1 560 #endif
rlm@1 561
rlm@1 562 if (yyssp >= yyss + yystacksize - 1)
rlm@1 563 YYABORT;
rlm@1 564 }
rlm@1 565
rlm@1 566 #if YYDEBUG != 0
rlm@1 567 if (yydebug)
rlm@1 568 fprintf(stderr, "Entering state %d\n", yystate);
rlm@1 569 #endif
rlm@1 570
rlm@1 571 goto yybackup;
rlm@1 572 yybackup:
rlm@1 573
rlm@1 574 /* Do appropriate processing given the current state. */
rlm@1 575 /* Read a lookahead token if we need one and don't already have one. */
rlm@1 576 /* yyresume: */
rlm@1 577
rlm@1 578 /* First try to decide what to do without reference to lookahead token. */
rlm@1 579
rlm@1 580 yyn = yypact[yystate];
rlm@1 581 if (yyn == YYFLAG)
rlm@1 582 goto yydefault;
rlm@1 583
rlm@1 584 /* Not known => get a lookahead token if don't already have one. */
rlm@1 585
rlm@1 586 /* yychar is either YYEMPTY or YYEOF
rlm@1 587 or a valid token in external form. */
rlm@1 588
rlm@1 589 if (yychar == YYEMPTY)
rlm@1 590 {
rlm@1 591 #if YYDEBUG != 0
rlm@1 592 if (yydebug)
rlm@1 593 fprintf(stderr, "Reading a token: ");
rlm@1 594 #endif
rlm@1 595 yychar = YYLEX;
rlm@1 596 }
rlm@1 597
rlm@1 598 /* Convert token to internal form (in yychar1) for indexing tables with */
rlm@1 599
rlm@1 600 if (yychar <= 0) /* This means end of input. */
rlm@1 601 {
rlm@1 602 yychar1 = 0;
rlm@1 603 yychar = YYEOF; /* Don't call YYLEX any more */
rlm@1 604
rlm@1 605 #if YYDEBUG != 0
rlm@1 606 if (yydebug)
rlm@1 607 fprintf(stderr, "Now at end of input.\n");
rlm@1 608 #endif
rlm@1 609 }
rlm@1 610 else
rlm@1 611 {
rlm@1 612 yychar1 = YYTRANSLATE(yychar);
rlm@1 613
rlm@1 614 #if YYDEBUG != 0
rlm@1 615 if (yydebug)
rlm@1 616 {
rlm@1 617 fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
rlm@1 618 /* Give the individual parser a way to print the precise meaning
rlm@1 619 of a token, for further debugging info. */
rlm@1 620 #ifdef YYPRINT
rlm@1 621 YYPRINT (stderr, yychar, yylval);
rlm@1 622 #endif
rlm@1 623 fprintf (stderr, ")\n");
rlm@1 624 }
rlm@1 625 #endif
rlm@1 626 }
rlm@1 627
rlm@1 628 yyn += yychar1;
rlm@1 629 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
rlm@1 630 goto yydefault;
rlm@1 631
rlm@1 632 yyn = yytable[yyn];
rlm@1 633
rlm@1 634 /* yyn is what to do for this token type in this state.
rlm@1 635 Negative => reduce, -yyn is rule number.
rlm@1 636 Positive => shift, yyn is new state.
rlm@1 637 New state is final state => don't bother to shift,
rlm@1 638 just return success.
rlm@1 639 0, or most negative number => error. */
rlm@1 640
rlm@1 641 if (yyn < 0)
rlm@1 642 {
rlm@1 643 if (yyn == YYFLAG)
rlm@1 644 goto yyerrlab;
rlm@1 645 yyn = -yyn;
rlm@1 646 goto yyreduce;
rlm@1 647 }
rlm@1 648 else if (yyn == 0)
rlm@1 649 goto yyerrlab;
rlm@1 650
rlm@1 651 if (yyn == YYFINAL)
rlm@1 652 YYACCEPT;
rlm@1 653
rlm@1 654 /* Shift the lookahead token. */
rlm@1 655
rlm@1 656 #if YYDEBUG != 0
rlm@1 657 if (yydebug)
rlm@1 658 fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
rlm@1 659 #endif
rlm@1 660
rlm@1 661 /* Discard the token being shifted unless it is eof. */
rlm@1 662 if (yychar != YYEOF)
rlm@1 663 yychar = YYEMPTY;
rlm@1 664
rlm@1 665 *++yyvsp = yylval;
rlm@1 666 #ifdef YYLSP_NEEDED
rlm@1 667 *++yylsp = yylloc;
rlm@1 668 #endif
rlm@1 669
rlm@1 670 /* count tokens shifted since error; after three, turn off error status. */
rlm@1 671 if (yyerrstatus) yyerrstatus--;
rlm@1 672
rlm@1 673 yystate = yyn;
rlm@1 674 goto yynewstate;
rlm@1 675
rlm@1 676 /* Do the default action for the current state. */
rlm@1 677 yydefault:
rlm@1 678
rlm@1 679 yyn = yydefact[yystate];
rlm@1 680 if (yyn == 0)
rlm@1 681 goto yyerrlab;
rlm@1 682
rlm@1 683 /* Do a reduction. yyn is the number of a rule to reduce with. */
rlm@1 684 yyreduce:
rlm@1 685 yylen = yyr2[yyn];
rlm@1 686 if (yylen > 0)
rlm@1 687 yyval = yyvsp[1-yylen]; /* implement default value of the action */
rlm@1 688
rlm@1 689 #if YYDEBUG != 0
rlm@1 690 if (yydebug)
rlm@1 691 {
rlm@1 692 int i;
rlm@1 693
rlm@1 694 fprintf (stderr, "Reducing via rule %d (line %d), ",
rlm@1 695 yyn, yyrline[yyn]);
rlm@1 696
rlm@1 697 /* Print the symbols being reduced, and their result. */
rlm@1 698 for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
rlm@1 699 fprintf (stderr, "%s ", yytname[yyrhs[i]]);
rlm@1 700 fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
rlm@1 701 }
rlm@1 702 #endif
rlm@1 703
rlm@1 704
rlm@1 705 switch (yyn) {
rlm@1 706
rlm@1 707 case 1:
rlm@1 708 #line 32 "expr.y"
rlm@1 709 { result = yyvsp[0]; ;
rlm@1 710 break;}
rlm@1 711 case 2:
rlm@1 712 #line 36 "expr.y"
rlm@1 713 { yyval = yyvsp[0]; ;
rlm@1 714 break;}
rlm@1 715 case 3:
rlm@1 716 #line 37 "expr.y"
rlm@1 717 { yyval = yyvsp[-1]; ;
rlm@1 718 break;}
rlm@1 719 case 4:
rlm@1 720 #line 38 "expr.y"
rlm@1 721 { yyval = exprNodeDot(yyvsp[-2], yyvsp[0]); ;
rlm@1 722 break;}
rlm@1 723 case 5:
rlm@1 724 #line 39 "expr.y"
rlm@1 725 { yyval = exprNodeArrow(yyvsp[-2], yyvsp[0]); ;
rlm@1 726 break;}
rlm@1 727 case 6:
rlm@1 728 #line 40 "expr.y"
rlm@1 729 { yyval = exprNodeArray(yyvsp[-3], yyvsp[-1]); ;
rlm@1 730 break;}
rlm@1 731 case 7:
rlm@1 732 #line 43 "expr.y"
rlm@1 733 { yyval = yyvsp[0]; ;
rlm@1 734 break;}
rlm@1 735 case 8:
rlm@1 736 #line 44 "expr.y"
rlm@1 737 { yyval = exprNodeStar(yyvsp[0]); ;
rlm@1 738 break;}
rlm@1 739 case 9:
rlm@1 740 #line 45 "expr.y"
rlm@1 741 { yyval = exprNodeAddr(yyvsp[0]); ;
rlm@1 742 break;}
rlm@1 743 case 10:
rlm@1 744 #line 46 "expr.y"
rlm@1 745 { yyval = exprNodeSizeof(yyvsp[-1]); ;
rlm@1 746 break;}
rlm@1 747 case 11:
rlm@1 748 #line 50 "expr.y"
rlm@1 749 { yyval = exprNodeNumber(); ;
rlm@1 750 break;}
rlm@1 751 case 12:
rlm@1 752 #line 54 "expr.y"
rlm@1 753 {yyval = exprNodeIdentifier(); ;
rlm@1 754 break;}
rlm@1 755 }
rlm@1 756 /* the action file gets copied in in place of this dollarsign */
rlm@1 757 #line 543 "/usr/lib/bison.simple"
rlm@1 758
rlm@1 759 yyvsp -= yylen;
rlm@1 760 yyssp -= yylen;
rlm@1 761 #ifdef YYLSP_NEEDED
rlm@1 762 yylsp -= yylen;
rlm@1 763 #endif
rlm@1 764
rlm@1 765 #if YYDEBUG != 0
rlm@1 766 if (yydebug)
rlm@1 767 {
rlm@1 768 short *ssp1 = yyss - 1;
rlm@1 769 fprintf (stderr, "state stack now");
rlm@1 770 while (ssp1 != yyssp)
rlm@1 771 fprintf (stderr, " %d", *++ssp1);
rlm@1 772 fprintf (stderr, "\n");
rlm@1 773 }
rlm@1 774 #endif
rlm@1 775
rlm@1 776 *++yyvsp = yyval;
rlm@1 777
rlm@1 778 #ifdef YYLSP_NEEDED
rlm@1 779 yylsp++;
rlm@1 780 if (yylen == 0)
rlm@1 781 {
rlm@1 782 yylsp->first_line = yylloc.first_line;
rlm@1 783 yylsp->first_column = yylloc.first_column;
rlm@1 784 yylsp->last_line = (yylsp-1)->last_line;
rlm@1 785 yylsp->last_column = (yylsp-1)->last_column;
rlm@1 786 yylsp->text = 0;
rlm@1 787 }
rlm@1 788 else
rlm@1 789 {
rlm@1 790 yylsp->last_line = (yylsp+yylen-1)->last_line;
rlm@1 791 yylsp->last_column = (yylsp+yylen-1)->last_column;
rlm@1 792 }
rlm@1 793 #endif
rlm@1 794
rlm@1 795 /* Now "shift" the result of the reduction.
rlm@1 796 Determine what state that goes to,
rlm@1 797 based on the state we popped back to
rlm@1 798 and the rule number reduced by. */
rlm@1 799
rlm@1 800 yyn = yyr1[yyn];
rlm@1 801
rlm@1 802 yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
rlm@1 803 if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
rlm@1 804 yystate = yytable[yystate];
rlm@1 805 else
rlm@1 806 yystate = yydefgoto[yyn - YYNTBASE];
rlm@1 807
rlm@1 808 goto yynewstate;
rlm@1 809
rlm@1 810 yyerrlab: /* here on detecting error */
rlm@1 811
rlm@1 812 if (! yyerrstatus)
rlm@1 813 /* If not already recovering from an error, report this error. */
rlm@1 814 {
rlm@1 815 ++yynerrs;
rlm@1 816
rlm@1 817 #ifdef YYERROR_VERBOSE
rlm@1 818 yyn = yypact[yystate];
rlm@1 819
rlm@1 820 if (yyn > YYFLAG && yyn < YYLAST)
rlm@1 821 {
rlm@1 822 int size = 0;
rlm@1 823 char *msg;
rlm@1 824 int x, count;
rlm@1 825
rlm@1 826 count = 0;
rlm@1 827 /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
rlm@1 828 for (x = (yyn < 0 ? -yyn : 0);
rlm@1 829 x < (sizeof(yytname) / sizeof(char *)); x++)
rlm@1 830 if (yycheck[x + yyn] == x)
rlm@1 831 size += strlen(yytname[x]) + 15, count++;
rlm@1 832 msg = (char *) malloc(size + 15);
rlm@1 833 if (msg != 0)
rlm@1 834 {
rlm@1 835 strcpy(msg, "parse error");
rlm@1 836
rlm@1 837 if (count < 5)
rlm@1 838 {
rlm@1 839 count = 0;
rlm@1 840 for (x = (yyn < 0 ? -yyn : 0);
rlm@1 841 x < (sizeof(yytname) / sizeof(char *)); x++)
rlm@1 842 if (yycheck[x + yyn] == x)
rlm@1 843 {
rlm@1 844 strcat(msg, count == 0 ? ", expecting `" : " or `");
rlm@1 845 strcat(msg, yytname[x]);
rlm@1 846 strcat(msg, "'");
rlm@1 847 count++;
rlm@1 848 }
rlm@1 849 }
rlm@1 850 yyerror(msg);
rlm@1 851 free(msg);
rlm@1 852 }
rlm@1 853 else
rlm@1 854 yyerror ("parse error; also virtual memory exceeded");
rlm@1 855 }
rlm@1 856 else
rlm@1 857 #endif /* YYERROR_VERBOSE */
rlm@1 858 yyerror("parse error");
rlm@1 859 }
rlm@1 860
rlm@1 861 goto yyerrlab1;
rlm@1 862 yyerrlab1: /* here on error raised explicitly by an action */
rlm@1 863
rlm@1 864 if (yyerrstatus == 3)
rlm@1 865 {
rlm@1 866 /* if just tried and failed to reuse lookahead token after an error, discard it. */
rlm@1 867
rlm@1 868 /* return failure if at end of input */
rlm@1 869 if (yychar == YYEOF)
rlm@1 870 YYABORT;
rlm@1 871
rlm@1 872 #if YYDEBUG != 0
rlm@1 873 if (yydebug)
rlm@1 874 fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
rlm@1 875 #endif
rlm@1 876
rlm@1 877 yychar = YYEMPTY;
rlm@1 878 }
rlm@1 879
rlm@1 880 /* Else will try to reuse lookahead token
rlm@1 881 after shifting the error token. */
rlm@1 882
rlm@1 883 yyerrstatus = 3; /* Each real token shifted decrements this */
rlm@1 884
rlm@1 885 goto yyerrhandle;
rlm@1 886
rlm@1 887 yyerrdefault: /* current state does not do anything special for the error token. */
rlm@1 888
rlm@1 889 #if 0
rlm@1 890 /* This is wrong; only states that explicitly want error tokens
rlm@1 891 should shift them. */
rlm@1 892 yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
rlm@1 893 if (yyn) goto yydefault;
rlm@1 894 #endif
rlm@1 895
rlm@1 896 yyerrpop: /* pop the current state because it cannot handle the error token */
rlm@1 897
rlm@1 898 if (yyssp == yyss) YYABORT;
rlm@1 899 yyvsp--;
rlm@1 900 yystate = *--yyssp;
rlm@1 901 #ifdef YYLSP_NEEDED
rlm@1 902 yylsp--;
rlm@1 903 #endif
rlm@1 904
rlm@1 905 #if YYDEBUG != 0
rlm@1 906 if (yydebug)
rlm@1 907 {
rlm@1 908 short *ssp1 = yyss - 1;
rlm@1 909 fprintf (stderr, "Error: state stack now");
rlm@1 910 while (ssp1 != yyssp)
rlm@1 911 fprintf (stderr, " %d", *++ssp1);
rlm@1 912 fprintf (stderr, "\n");
rlm@1 913 }
rlm@1 914 #endif
rlm@1 915
rlm@1 916 yyerrhandle:
rlm@1 917
rlm@1 918 yyn = yypact[yystate];
rlm@1 919 if (yyn == YYFLAG)
rlm@1 920 goto yyerrdefault;
rlm@1 921
rlm@1 922 yyn += YYTERROR;
rlm@1 923 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
rlm@1 924 goto yyerrdefault;
rlm@1 925
rlm@1 926 yyn = yytable[yyn];
rlm@1 927 if (yyn < 0)
rlm@1 928 {
rlm@1 929 if (yyn == YYFLAG)
rlm@1 930 goto yyerrpop;
rlm@1 931 yyn = -yyn;
rlm@1 932 goto yyreduce;
rlm@1 933 }
rlm@1 934 else if (yyn == 0)
rlm@1 935 goto yyerrpop;
rlm@1 936
rlm@1 937 if (yyn == YYFINAL)
rlm@1 938 YYACCEPT;
rlm@1 939
rlm@1 940 #if YYDEBUG != 0
rlm@1 941 if (yydebug)
rlm@1 942 fprintf(stderr, "Shifting error token, ");
rlm@1 943 #endif
rlm@1 944
rlm@1 945 *++yyvsp = yylval;
rlm@1 946 #ifdef YYLSP_NEEDED
rlm@1 947 *++yylsp = yylloc;
rlm@1 948 #endif
rlm@1 949
rlm@1 950 yystate = yyn;
rlm@1 951 goto yynewstate;
rlm@1 952
rlm@1 953 yyacceptlab:
rlm@1 954 /* YYACCEPT comes here. */
rlm@1 955 if (yyfree_stacks)
rlm@1 956 {
rlm@1 957 free (yyss);
rlm@1 958 free (yyvs);
rlm@1 959 #ifdef YYLSP_NEEDED
rlm@1 960 free (yyls);
rlm@1 961 #endif
rlm@1 962 }
rlm@1 963 return 0;
rlm@1 964
rlm@1 965 yyabortlab:
rlm@1 966 /* YYABORT comes here. */
rlm@1 967 if (yyfree_stacks)
rlm@1 968 {
rlm@1 969 free (yyss);
rlm@1 970 free (yyvs);
rlm@1 971 #ifdef YYLSP_NEEDED
rlm@1 972 free (yyls);
rlm@1 973 #endif
rlm@1 974 }
rlm@1 975 return 1;
rlm@1 976 }
rlm@1 977 #line 57 "expr.y"
rlm@1 978
rlm@1 979
rlm@1 980 int yyerror(char *s)
rlm@1 981 {
rlm@1 982 return 0;
rlm@1 983 }
rlm@1 984
rlm@1 985 #ifndef SDL
rlm@1 986 extern FILE *yyin;
rlm@1 987 int main(int argc, char **argv)
rlm@1 988 {
rlm@1 989 // yydebug = 1;
rlm@1 990 ++argv, --argc;
rlm@1 991 if(argc > 0)
rlm@1 992 yyin = fopen(argv[0], "r");
rlm@1 993 else
rlm@1 994 yyin = stdin;
rlm@1 995 if(!yyparse())
rlm@1 996 result->print();
rlm@1 997 }
rlm@1 998 #endif