SDL:
- The expression parser/lexer is SDL specific, moved it to the sdl folder - Readded the flex/bison source files from VBA's CVS - Rebuilt the parser/lexer from source
This commit is contained in:
parent
a80233260c
commit
ccfed5c1c3
|
@ -172,6 +172,9 @@ SET(SRC_SDL
|
||||||
src/sdl/filters.cpp
|
src/sdl/filters.cpp
|
||||||
src/sdl/text.cpp
|
src/sdl/text.cpp
|
||||||
src/sdl/sndSDL.cpp
|
src/sdl/sndSDL.cpp
|
||||||
|
src/sdl/expr.cpp
|
||||||
|
src/sdl/exprNode.cpp
|
||||||
|
src/sdl/expr-lex.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(SRC_FEX_MINI
|
SET(SRC_FEX_MINI
|
||||||
|
@ -211,9 +214,6 @@ IF( NOT NO_DEBUGGER )
|
||||||
SET(SRC_DEBUGGER
|
SET(SRC_DEBUGGER
|
||||||
src/armdis.cpp
|
src/armdis.cpp
|
||||||
src/elf.cpp
|
src/elf.cpp
|
||||||
src/expr.cpp
|
|
||||||
src/exprNode.cpp
|
|
||||||
src/expr-lex.cpp
|
|
||||||
src/remote.cpp
|
src/remote.cpp
|
||||||
)
|
)
|
||||||
ENDIF( NOT NO_DEBUGGER )
|
ENDIF( NOT NO_DEBUGGER )
|
||||||
|
|
1591
src/expr-lex.cpp
1591
src/expr-lex.cpp
File diff suppressed because it is too large
Load Diff
998
src/expr.cpp
998
src/expr.cpp
|
@ -1,998 +0,0 @@
|
||||||
|
|
||||||
/* A Bison parser, made from expr.y
|
|
||||||
by GNU Bison version 1.28 */
|
|
||||||
|
|
||||||
#define YYBISON 1 /* Identify Bison output. */
|
|
||||||
|
|
||||||
#define TOKEN_IDENTIFIER 257
|
|
||||||
#define TOKEN_DOT 258
|
|
||||||
#define TOKEN_STAR 259
|
|
||||||
#define TOKEN_ARROW 260
|
|
||||||
#define TOKEN_ADDR 261
|
|
||||||
#define TOKEN_SIZEOF 262
|
|
||||||
#define TOKEN_NUMBER 263
|
|
||||||
|
|
||||||
#line 1 "expr.y"
|
|
||||||
|
|
||||||
namespace std {
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <memory.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#include "System.h"
|
|
||||||
#include "elf.h"
|
|
||||||
#include "exprNode.h"
|
|
||||||
|
|
||||||
extern int yyerror(char *);
|
|
||||||
extern int yylex();
|
|
||||||
extern char *yytext;
|
|
||||||
|
|
||||||
|
|
||||||
//#define YYERROR_VERBOSE 1
|
|
||||||
//#define YYDEBUG 1
|
|
||||||
|
|
||||||
Node *result = NULL;
|
|
||||||
#ifndef YYSTYPE
|
|
||||||
#define YYSTYPE int
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
#ifndef __STDC__
|
|
||||||
#define const
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define YYFINAL 26
|
|
||||||
#define YYFLAG -32768
|
|
||||||
#define YYNTBASE 14
|
|
||||||
|
|
||||||
#define YYTRANSLATE(x) ((unsigned)(x) <= 263 ? yytranslate[x] : 19)
|
|
||||||
|
|
||||||
static const char yytranslate[] = { 0,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 11,
|
|
||||||
12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
10, 2, 13, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
|
|
||||||
7, 8, 9
|
|
||||||
};
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
static const short yyprhs[] = { 0,
|
|
||||||
0, 2, 4, 8, 12, 16, 21, 23, 26, 29,
|
|
||||||
34, 36
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yyrhs[] = { 15,
|
|
||||||
0, 16, 0, 11, 15, 12, 0, 15, 4, 18,
|
|
||||||
0, 15, 6, 18, 0, 15, 10, 17, 13, 0,
|
|
||||||
18, 0, 5, 15, 0, 7, 15, 0, 8, 11,
|
|
||||||
15, 12, 0, 9, 0, 3, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
static const short yyrline[] = { 0,
|
|
||||||
32, 35, 36, 37, 38, 39, 42, 43, 44, 45,
|
|
||||||
49, 53
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
|
|
||||||
|
|
||||||
static const char * const yytname[] = { "$","error","$undefined.","TOKEN_IDENTIFIER",
|
|
||||||
"TOKEN_DOT","TOKEN_STAR","TOKEN_ARROW","TOKEN_ADDR","TOKEN_SIZEOF","TOKEN_NUMBER",
|
|
||||||
"'['","'('","')'","']'","final","expression","simple_expression","number","ident", NULL
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const short yyr1[] = { 0,
|
|
||||||
14, 15, 15, 15, 15, 15, 16, 16, 16, 16,
|
|
||||||
17, 18
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yyr2[] = { 0,
|
|
||||||
1, 1, 3, 3, 3, 4, 1, 2, 2, 4,
|
|
||||||
1, 1
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yydefact[] = { 0,
|
|
||||||
12, 0, 0, 0, 0, 1, 2, 7, 8, 9,
|
|
||||||
0, 0, 0, 0, 0, 0, 3, 4, 5, 11,
|
|
||||||
0, 10, 6, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yydefgoto[] = { 24,
|
|
||||||
6, 7, 21, 8
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yypact[] = { -1,
|
|
||||||
-32768, -1, -1, -6, -1, 17,-32768,-32768, 17, 17,
|
|
||||||
-1, 7, 5, 5, 13, 8,-32768,-32768,-32768,-32768,
|
|
||||||
11,-32768,-32768, 25, 26,-32768
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yypgoto[] = {-32768,
|
|
||||||
-2,-32768,-32768, 2
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define YYLAST 27
|
|
||||||
|
|
||||||
|
|
||||||
static const short yytable[] = { 9,
|
|
||||||
10, 1, 12, 2, 11, 3, 4, 1, 16, 5,
|
|
||||||
13, 13, 14, 14, 18, 19, 15, 15, 17, 22,
|
|
||||||
13, 20, 14, 23, 25, 26, 15
|
|
||||||
};
|
|
||||||
|
|
||||||
static const short yycheck[] = { 2,
|
|
||||||
3, 3, 5, 5, 11, 7, 8, 3, 11, 11,
|
|
||||||
4, 4, 6, 6, 13, 14, 10, 10, 12, 12,
|
|
||||||
4, 9, 6, 13, 0, 0, 10
|
|
||||||
};
|
|
||||||
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
|
||||||
#line 3 "/usr/lib/bison.simple"
|
|
||||||
/* This file comes from bison-1.28. */
|
|
||||||
|
|
||||||
/* Skeleton output parser for bison,
|
|
||||||
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* As a special exception, when this file is copied by Bison into a
|
|
||||||
Bison output file, you may use that output file without restriction.
|
|
||||||
This special exception was added by the Free Software Foundation
|
|
||||||
in version 1.24 of Bison. */
|
|
||||||
|
|
||||||
/* This is the parser code that is written into each bison parser
|
|
||||||
when the %semantic_parser declaration is not specified in the grammar.
|
|
||||||
It was written by Richard Stallman by simplifying the hairy parser
|
|
||||||
used when %semantic_parser is specified. */
|
|
||||||
|
|
||||||
#ifndef YYSTACK_USE_ALLOCA
|
|
||||||
#ifdef alloca
|
|
||||||
#define YYSTACK_USE_ALLOCA
|
|
||||||
#else /* alloca not defined */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define YYSTACK_USE_ALLOCA
|
|
||||||
#define alloca __builtin_alloca
|
|
||||||
#else /* not GNU C. */
|
|
||||||
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
|
|
||||||
#define YYSTACK_USE_ALLOCA
|
|
||||||
#include <alloca.h>
|
|
||||||
#else /* not sparc */
|
|
||||||
/* We think this test detects Watcom and Microsoft C. */
|
|
||||||
/* This used to test MSDOS, but that is a bad idea
|
|
||||||
since that symbol is in the user namespace. */
|
|
||||||
#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
|
|
||||||
#if 0 /* No need for malloc.h, which pollutes the namespace;
|
|
||||||
instead, just don't use alloca. */
|
|
||||||
#include <malloc.h>
|
|
||||||
#endif
|
|
||||||
#else /* not MSDOS, or __TURBOC__ */
|
|
||||||
#if defined(_AIX)
|
|
||||||
/* I don't know what this was needed for, but it pollutes the namespace.
|
|
||||||
So I turned it off. rms, 2 May 1997. */
|
|
||||||
/* #include <malloc.h> */
|
|
||||||
#pragma alloca
|
|
||||||
#define YYSTACK_USE_ALLOCA
|
|
||||||
#else /* not MSDOS, or __TURBOC__, or _AIX */
|
|
||||||
#if 0
|
|
||||||
#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
|
|
||||||
and on HPUX 10. Eventually we can turn this on. */
|
|
||||||
#define YYSTACK_USE_ALLOCA
|
|
||||||
#define alloca __builtin_alloca
|
|
||||||
#endif /* __hpux */
|
|
||||||
#endif
|
|
||||||
#endif /* not _AIX */
|
|
||||||
#endif /* not MSDOS, or __TURBOC__ */
|
|
||||||
#endif /* not sparc */
|
|
||||||
#endif /* not GNU C */
|
|
||||||
#endif /* alloca not defined */
|
|
||||||
#endif /* YYSTACK_USE_ALLOCA not defined */
|
|
||||||
|
|
||||||
#ifdef YYSTACK_USE_ALLOCA
|
|
||||||
#define YYSTACK_ALLOC alloca
|
|
||||||
#else
|
|
||||||
#define YYSTACK_ALLOC malloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Note: there must be only one dollar sign in this file.
|
|
||||||
It is replaced by the list of actions, each action
|
|
||||||
as one case of the switch. */
|
|
||||||
|
|
||||||
#define yyerrok (yyerrstatus = 0)
|
|
||||||
#define yyclearin (yychar = YYEMPTY)
|
|
||||||
#define YYEMPTY -2
|
|
||||||
#define YYEOF 0
|
|
||||||
#define YYACCEPT goto yyacceptlab
|
|
||||||
#define YYABORT goto yyabortlab
|
|
||||||
#define YYERROR goto yyerrlab1
|
|
||||||
/* Like YYERROR except do call yyerror.
|
|
||||||
This remains here temporarily to ease the
|
|
||||||
transition to the new meaning of YYERROR, for GCC.
|
|
||||||
Once GCC version 2 has supplanted version 1, this can go. */
|
|
||||||
#define YYFAIL goto yyerrlab
|
|
||||||
#define YYRECOVERING() (!!yyerrstatus)
|
|
||||||
#define YYBACKUP(token, value) \
|
|
||||||
do \
|
|
||||||
if (yychar == YYEMPTY && yylen == 1) \
|
|
||||||
{ yychar = (token), yylval = (value); \
|
|
||||||
yychar1 = YYTRANSLATE (yychar); \
|
|
||||||
YYPOPSTACK; \
|
|
||||||
goto yybackup; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ yyerror ("syntax error: cannot back up"); YYERROR; } \
|
|
||||||
while (0)
|
|
||||||
|
|
||||||
#define YYTERROR 1
|
|
||||||
#define YYERRCODE 256
|
|
||||||
|
|
||||||
#ifndef YYPURE
|
|
||||||
#define YYLEX yylex()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef YYPURE
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
#ifdef YYLEX_PARAM
|
|
||||||
#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
|
|
||||||
#else
|
|
||||||
#define YYLEX yylex(&yylval, &yylloc)
|
|
||||||
#endif
|
|
||||||
#else /* not YYLSP_NEEDED */
|
|
||||||
#ifdef YYLEX_PARAM
|
|
||||||
#define YYLEX yylex(&yylval, YYLEX_PARAM)
|
|
||||||
#else
|
|
||||||
#define YYLEX yylex(&yylval)
|
|
||||||
#endif
|
|
||||||
#endif /* not YYLSP_NEEDED */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If nonreentrant, generate the variables here */
|
|
||||||
|
|
||||||
#ifndef YYPURE
|
|
||||||
|
|
||||||
int yychar; /* the lookahead symbol */
|
|
||||||
YYSTYPE yylval; /* the semantic value of the */
|
|
||||||
/* lookahead symbol */
|
|
||||||
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
YYLTYPE yylloc; /* location data for the lookahead */
|
|
||||||
/* symbol */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int yynerrs; /* number of parse errors so far */
|
|
||||||
#endif /* not YYPURE */
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
int yydebug; /* nonzero means print parse trace */
|
|
||||||
/* Since this is uninitialized, it does not stop multiple parsers
|
|
||||||
from coexisting. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* YYINITDEPTH indicates the initial size of the parser's stacks */
|
|
||||||
|
|
||||||
#ifndef YYINITDEPTH
|
|
||||||
#define YYINITDEPTH 200
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* YYMAXDEPTH is the maximum size the stacks can grow to
|
|
||||||
(effective only if the built-in stack extension method is used). */
|
|
||||||
|
|
||||||
#if YYMAXDEPTH == 0
|
|
||||||
#undef YYMAXDEPTH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef YYMAXDEPTH
|
|
||||||
#define YYMAXDEPTH 10000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define __yy_memcpy. Note that the size argument
|
|
||||||
should be passed with type unsigned int, because that is what the non-GCC
|
|
||||||
definitions require. With GCC, __builtin_memcpy takes an arg
|
|
||||||
of type size_t, but it can handle unsigned int. */
|
|
||||||
|
|
||||||
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
|
|
||||||
#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
|
|
||||||
#else /* not GNU C or C++ */
|
|
||||||
#ifndef __cplusplus
|
|
||||||
|
|
||||||
/* This is the most reliable way to avoid incompatibilities
|
|
||||||
in available built-in functions on various systems. */
|
|
||||||
static void
|
|
||||||
__yy_memcpy (to, from, count)
|
|
||||||
char *to;
|
|
||||||
char *from;
|
|
||||||
unsigned int count;
|
|
||||||
{
|
|
||||||
register char *f = from;
|
|
||||||
register char *t = to;
|
|
||||||
register int i = count;
|
|
||||||
|
|
||||||
while (i-- > 0)
|
|
||||||
*t++ = *f++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* __cplusplus */
|
|
||||||
|
|
||||||
/* This is the most reliable way to avoid incompatibilities
|
|
||||||
in available built-in functions on various systems. */
|
|
||||||
static void
|
|
||||||
__yy_memcpy (char *to, char *from, unsigned int count)
|
|
||||||
{
|
|
||||||
register char *t = to;
|
|
||||||
register char *f = from;
|
|
||||||
register int i = count;
|
|
||||||
|
|
||||||
while (i-- > 0)
|
|
||||||
*t++ = *f++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#line 217 "/usr/lib/bison.simple"
|
|
||||||
|
|
||||||
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
|
||||||
into yyparse. The argument should have type void *.
|
|
||||||
It should actually point to an object.
|
|
||||||
Grammar actions can access the variable by casting it
|
|
||||||
to the proper pointer type. */
|
|
||||||
|
|
||||||
#ifdef YYPARSE_PARAM
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
|
|
||||||
#define YYPARSE_PARAM_DECL
|
|
||||||
#else /* not __cplusplus */
|
|
||||||
#define YYPARSE_PARAM_ARG YYPARSE_PARAM
|
|
||||||
#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
|
|
||||||
#endif /* not __cplusplus */
|
|
||||||
#else /* not YYPARSE_PARAM */
|
|
||||||
#define YYPARSE_PARAM_ARG
|
|
||||||
#define YYPARSE_PARAM_DECL
|
|
||||||
#endif /* not YYPARSE_PARAM */
|
|
||||||
|
|
||||||
/* Prevent warning if -Wstrict-prototypes. */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#ifdef YYPARSE_PARAM
|
|
||||||
int yyparse (void *);
|
|
||||||
#else
|
|
||||||
int yyparse (void);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
yyparse(YYPARSE_PARAM_ARG)
|
|
||||||
YYPARSE_PARAM_DECL
|
|
||||||
{
|
|
||||||
register int yystate;
|
|
||||||
register int yyn;
|
|
||||||
register short *yyssp;
|
|
||||||
register YYSTYPE *yyvsp;
|
|
||||||
int yyerrstatus; /* number of tokens to shift before error messages enabled */
|
|
||||||
int yychar1 = 0; /* lookahead token as an internal (translated) token number */
|
|
||||||
|
|
||||||
short yyssa[YYINITDEPTH]; /* the state stack */
|
|
||||||
YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
|
|
||||||
|
|
||||||
short *yyss = yyssa; /* refer to the stacks thru separate pointers */
|
|
||||||
YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
|
|
||||||
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
|
|
||||||
YYLTYPE *yyls = yylsa;
|
|
||||||
YYLTYPE *yylsp;
|
|
||||||
|
|
||||||
#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
|
|
||||||
#else
|
|
||||||
#define YYPOPSTACK (yyvsp--, yyssp--)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int yystacksize = YYINITDEPTH;
|
|
||||||
int yyfree_stacks = 0;
|
|
||||||
|
|
||||||
#ifdef YYPURE
|
|
||||||
int yychar;
|
|
||||||
YYSTYPE yylval;
|
|
||||||
int yynerrs;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
YYLTYPE yylloc;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
YYSTYPE yyval; /* the variable used to return */
|
|
||||||
/* semantic values from the action */
|
|
||||||
/* routines */
|
|
||||||
|
|
||||||
int yylen;
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Starting parse\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yystate = 0;
|
|
||||||
yyerrstatus = 0;
|
|
||||||
yynerrs = 0;
|
|
||||||
yychar = YYEMPTY; /* Cause a token to be read. */
|
|
||||||
|
|
||||||
/* Initialize stack pointers.
|
|
||||||
Waste one element of value and location stack
|
|
||||||
so that they stay on the same level as the state stack.
|
|
||||||
The wasted elements are never initialized. */
|
|
||||||
|
|
||||||
yyssp = yyss - 1;
|
|
||||||
yyvsp = yyvs;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yylsp = yyls;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Push a new state, which is found in yystate . */
|
|
||||||
/* In all cases, when you get here, the value and location stacks
|
|
||||||
have just been pushed. so pushing a state here evens the stacks. */
|
|
||||||
yynewstate:
|
|
||||||
|
|
||||||
*++yyssp = yystate;
|
|
||||||
|
|
||||||
if (yyssp >= yyss + yystacksize - 1)
|
|
||||||
{
|
|
||||||
/* Give user a chance to reallocate the stack */
|
|
||||||
/* Use copies of these so that the &'s don't force the real ones into memory. */
|
|
||||||
YYSTYPE *yyvs1 = yyvs;
|
|
||||||
short *yyss1 = yyss;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
YYLTYPE *yyls1 = yyls;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get the current used size of the three stacks, in elements. */
|
|
||||||
int size = yyssp - yyss + 1;
|
|
||||||
|
|
||||||
#ifdef yyoverflow
|
|
||||||
/* Each stack pointer address is followed by the size of
|
|
||||||
the data in use in that stack, in bytes. */
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
/* This used to be a conditional around just the two extra args,
|
|
||||||
but that might be undefined if yyoverflow is a macro. */
|
|
||||||
yyoverflow("parser stack overflow",
|
|
||||||
&yyss1, size * sizeof (*yyssp),
|
|
||||||
&yyvs1, size * sizeof (*yyvsp),
|
|
||||||
&yyls1, size * sizeof (*yylsp),
|
|
||||||
&yystacksize);
|
|
||||||
#else
|
|
||||||
yyoverflow("parser stack overflow",
|
|
||||||
&yyss1, size * sizeof (*yyssp),
|
|
||||||
&yyvs1, size * sizeof (*yyvsp),
|
|
||||||
&yystacksize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yyss = yyss1; yyvs = yyvs1;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yyls = yyls1;
|
|
||||||
#endif
|
|
||||||
#else /* no yyoverflow */
|
|
||||||
/* Extend the stack our own way. */
|
|
||||||
if (yystacksize >= YYMAXDEPTH)
|
|
||||||
{
|
|
||||||
yyerror("parser stack overflow");
|
|
||||||
if (yyfree_stacks)
|
|
||||||
{
|
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
free (yyls);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
yystacksize *= 2;
|
|
||||||
if (yystacksize > YYMAXDEPTH)
|
|
||||||
yystacksize = YYMAXDEPTH;
|
|
||||||
#ifndef YYSTACK_USE_ALLOCA
|
|
||||||
yyfree_stacks = 1;
|
|
||||||
#endif
|
|
||||||
yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
|
|
||||||
__yy_memcpy ((char *)yyss, (char *)yyss1,
|
|
||||||
size * (unsigned int) sizeof (*yyssp));
|
|
||||||
yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
|
|
||||||
__yy_memcpy ((char *)yyvs, (char *)yyvs1,
|
|
||||||
size * (unsigned int) sizeof (*yyvsp));
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
|
|
||||||
__yy_memcpy ((char *)yyls, (char *)yyls1,
|
|
||||||
size * (unsigned int) sizeof (*yylsp));
|
|
||||||
#endif
|
|
||||||
#endif /* no yyoverflow */
|
|
||||||
|
|
||||||
yyssp = yyss + size - 1;
|
|
||||||
yyvsp = yyvs + size - 1;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yylsp = yyls + size - 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Stack size increased to %d\n", yystacksize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (yyssp >= yyss + yystacksize - 1)
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Entering state %d\n", yystate);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
goto yybackup;
|
|
||||||
yybackup:
|
|
||||||
|
|
||||||
/* Do appropriate processing given the current state. */
|
|
||||||
/* Read a lookahead token if we need one and don't already have one. */
|
|
||||||
/* yyresume: */
|
|
||||||
|
|
||||||
/* First try to decide what to do without reference to lookahead token. */
|
|
||||||
|
|
||||||
yyn = yypact[yystate];
|
|
||||||
if (yyn == YYFLAG)
|
|
||||||
goto yydefault;
|
|
||||||
|
|
||||||
/* Not known => get a lookahead token if don't already have one. */
|
|
||||||
|
|
||||||
/* yychar is either YYEMPTY or YYEOF
|
|
||||||
or a valid token in external form. */
|
|
||||||
|
|
||||||
if (yychar == YYEMPTY)
|
|
||||||
{
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Reading a token: ");
|
|
||||||
#endif
|
|
||||||
yychar = YYLEX;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert token to internal form (in yychar1) for indexing tables with */
|
|
||||||
|
|
||||||
if (yychar <= 0) /* This means end of input. */
|
|
||||||
{
|
|
||||||
yychar1 = 0;
|
|
||||||
yychar = YYEOF; /* Don't call YYLEX any more */
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Now at end of input.\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
yychar1 = YYTRANSLATE(yychar);
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
|
|
||||||
/* Give the individual parser a way to print the precise meaning
|
|
||||||
of a token, for further debugging info. */
|
|
||||||
#ifdef YYPRINT
|
|
||||||
YYPRINT (stderr, yychar, yylval);
|
|
||||||
#endif
|
|
||||||
fprintf (stderr, ")\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
yyn += yychar1;
|
|
||||||
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
|
|
||||||
goto yydefault;
|
|
||||||
|
|
||||||
yyn = yytable[yyn];
|
|
||||||
|
|
||||||
/* yyn is what to do for this token type in this state.
|
|
||||||
Negative => reduce, -yyn is rule number.
|
|
||||||
Positive => shift, yyn is new state.
|
|
||||||
New state is final state => don't bother to shift,
|
|
||||||
just return success.
|
|
||||||
0, or most negative number => error. */
|
|
||||||
|
|
||||||
if (yyn < 0)
|
|
||||||
{
|
|
||||||
if (yyn == YYFLAG)
|
|
||||||
goto yyerrlab;
|
|
||||||
yyn = -yyn;
|
|
||||||
goto yyreduce;
|
|
||||||
}
|
|
||||||
else if (yyn == 0)
|
|
||||||
goto yyerrlab;
|
|
||||||
|
|
||||||
if (yyn == YYFINAL)
|
|
||||||
YYACCEPT;
|
|
||||||
|
|
||||||
/* Shift the lookahead token. */
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Discard the token being shifted unless it is eof. */
|
|
||||||
if (yychar != YYEOF)
|
|
||||||
yychar = YYEMPTY;
|
|
||||||
|
|
||||||
*++yyvsp = yylval;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
*++yylsp = yylloc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* count tokens shifted since error; after three, turn off error status. */
|
|
||||||
if (yyerrstatus) yyerrstatus--;
|
|
||||||
|
|
||||||
yystate = yyn;
|
|
||||||
goto yynewstate;
|
|
||||||
|
|
||||||
/* Do the default action for the current state. */
|
|
||||||
yydefault:
|
|
||||||
|
|
||||||
yyn = yydefact[yystate];
|
|
||||||
if (yyn == 0)
|
|
||||||
goto yyerrlab;
|
|
||||||
|
|
||||||
/* Do a reduction. yyn is the number of a rule to reduce with. */
|
|
||||||
yyreduce:
|
|
||||||
yylen = yyr2[yyn];
|
|
||||||
if (yylen > 0)
|
|
||||||
yyval = yyvsp[1-yylen]; /* implement default value of the action */
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
fprintf (stderr, "Reducing via rule %d (line %d), ",
|
|
||||||
yyn, yyrline[yyn]);
|
|
||||||
|
|
||||||
/* Print the symbols being reduced, and their result. */
|
|
||||||
for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
|
|
||||||
fprintf (stderr, "%s ", yytname[yyrhs[i]]);
|
|
||||||
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
switch (yyn) {
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
#line 32 "expr.y"
|
|
||||||
{ result = yyvsp[0]; ;
|
|
||||||
break;}
|
|
||||||
case 2:
|
|
||||||
#line 36 "expr.y"
|
|
||||||
{ yyval = yyvsp[0]; ;
|
|
||||||
break;}
|
|
||||||
case 3:
|
|
||||||
#line 37 "expr.y"
|
|
||||||
{ yyval = yyvsp[-1]; ;
|
|
||||||
break;}
|
|
||||||
case 4:
|
|
||||||
#line 38 "expr.y"
|
|
||||||
{ yyval = exprNodeDot(yyvsp[-2], yyvsp[0]); ;
|
|
||||||
break;}
|
|
||||||
case 5:
|
|
||||||
#line 39 "expr.y"
|
|
||||||
{ yyval = exprNodeArrow(yyvsp[-2], yyvsp[0]); ;
|
|
||||||
break;}
|
|
||||||
case 6:
|
|
||||||
#line 40 "expr.y"
|
|
||||||
{ yyval = exprNodeArray(yyvsp[-3], yyvsp[-1]); ;
|
|
||||||
break;}
|
|
||||||
case 7:
|
|
||||||
#line 43 "expr.y"
|
|
||||||
{ yyval = yyvsp[0]; ;
|
|
||||||
break;}
|
|
||||||
case 8:
|
|
||||||
#line 44 "expr.y"
|
|
||||||
{ yyval = exprNodeStar(yyvsp[0]); ;
|
|
||||||
break;}
|
|
||||||
case 9:
|
|
||||||
#line 45 "expr.y"
|
|
||||||
{ yyval = exprNodeAddr(yyvsp[0]); ;
|
|
||||||
break;}
|
|
||||||
case 10:
|
|
||||||
#line 46 "expr.y"
|
|
||||||
{ yyval = exprNodeSizeof(yyvsp[-1]); ;
|
|
||||||
break;}
|
|
||||||
case 11:
|
|
||||||
#line 50 "expr.y"
|
|
||||||
{ yyval = exprNodeNumber(); ;
|
|
||||||
break;}
|
|
||||||
case 12:
|
|
||||||
#line 54 "expr.y"
|
|
||||||
{yyval = exprNodeIdentifier(); ;
|
|
||||||
break;}
|
|
||||||
}
|
|
||||||
/* the action file gets copied in in place of this dollarsign */
|
|
||||||
#line 543 "/usr/lib/bison.simple"
|
|
||||||
|
|
||||||
yyvsp -= yylen;
|
|
||||||
yyssp -= yylen;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yylsp -= yylen;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
{
|
|
||||||
short *ssp1 = yyss - 1;
|
|
||||||
fprintf (stderr, "state stack now");
|
|
||||||
while (ssp1 != yyssp)
|
|
||||||
fprintf (stderr, " %d", *++ssp1);
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*++yyvsp = yyval;
|
|
||||||
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yylsp++;
|
|
||||||
if (yylen == 0)
|
|
||||||
{
|
|
||||||
yylsp->first_line = yylloc.first_line;
|
|
||||||
yylsp->first_column = yylloc.first_column;
|
|
||||||
yylsp->last_line = (yylsp-1)->last_line;
|
|
||||||
yylsp->last_column = (yylsp-1)->last_column;
|
|
||||||
yylsp->text = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
yylsp->last_line = (yylsp+yylen-1)->last_line;
|
|
||||||
yylsp->last_column = (yylsp+yylen-1)->last_column;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Now "shift" the result of the reduction.
|
|
||||||
Determine what state that goes to,
|
|
||||||
based on the state we popped back to
|
|
||||||
and the rule number reduced by. */
|
|
||||||
|
|
||||||
yyn = yyr1[yyn];
|
|
||||||
|
|
||||||
yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
|
|
||||||
if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
|
|
||||||
yystate = yytable[yystate];
|
|
||||||
else
|
|
||||||
yystate = yydefgoto[yyn - YYNTBASE];
|
|
||||||
|
|
||||||
goto yynewstate;
|
|
||||||
|
|
||||||
yyerrlab: /* here on detecting error */
|
|
||||||
|
|
||||||
if (! yyerrstatus)
|
|
||||||
/* If not already recovering from an error, report this error. */
|
|
||||||
{
|
|
||||||
++yynerrs;
|
|
||||||
|
|
||||||
#ifdef YYERROR_VERBOSE
|
|
||||||
yyn = yypact[yystate];
|
|
||||||
|
|
||||||
if (yyn > YYFLAG && yyn < YYLAST)
|
|
||||||
{
|
|
||||||
int size = 0;
|
|
||||||
char *msg;
|
|
||||||
int x, count;
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
/* Start X at -yyn if nec to avoid negative indexes in yycheck. */
|
|
||||||
for (x = (yyn < 0 ? -yyn : 0);
|
|
||||||
x < (sizeof(yytname) / sizeof(char *)); x++)
|
|
||||||
if (yycheck[x + yyn] == x)
|
|
||||||
size += strlen(yytname[x]) + 15, count++;
|
|
||||||
msg = (char *) malloc(size + 15);
|
|
||||||
if (msg != 0)
|
|
||||||
{
|
|
||||||
strcpy(msg, "parse error");
|
|
||||||
|
|
||||||
if (count < 5)
|
|
||||||
{
|
|
||||||
count = 0;
|
|
||||||
for (x = (yyn < 0 ? -yyn : 0);
|
|
||||||
x < (sizeof(yytname) / sizeof(char *)); x++)
|
|
||||||
if (yycheck[x + yyn] == x)
|
|
||||||
{
|
|
||||||
strcat(msg, count == 0 ? ", expecting `" : " or `");
|
|
||||||
strcat(msg, yytname[x]);
|
|
||||||
strcat(msg, "'");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
yyerror(msg);
|
|
||||||
free(msg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
yyerror ("parse error; also virtual memory exceeded");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif /* YYERROR_VERBOSE */
|
|
||||||
yyerror("parse error");
|
|
||||||
}
|
|
||||||
|
|
||||||
goto yyerrlab1;
|
|
||||||
yyerrlab1: /* here on error raised explicitly by an action */
|
|
||||||
|
|
||||||
if (yyerrstatus == 3)
|
|
||||||
{
|
|
||||||
/* if just tried and failed to reuse lookahead token after an error, discard it. */
|
|
||||||
|
|
||||||
/* return failure if at end of input */
|
|
||||||
if (yychar == YYEOF)
|
|
||||||
YYABORT;
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yychar = YYEMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Else will try to reuse lookahead token
|
|
||||||
after shifting the error token. */
|
|
||||||
|
|
||||||
yyerrstatus = 3; /* Each real token shifted decrements this */
|
|
||||||
|
|
||||||
goto yyerrhandle;
|
|
||||||
|
|
||||||
yyerrdefault: /* current state does not do anything special for the error token. */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* This is wrong; only states that explicitly want error tokens
|
|
||||||
should shift them. */
|
|
||||||
yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
|
|
||||||
if (yyn) goto yydefault;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yyerrpop: /* pop the current state because it cannot handle the error token */
|
|
||||||
|
|
||||||
if (yyssp == yyss) YYABORT;
|
|
||||||
yyvsp--;
|
|
||||||
yystate = *--yyssp;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
yylsp--;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
{
|
|
||||||
short *ssp1 = yyss - 1;
|
|
||||||
fprintf (stderr, "Error: state stack now");
|
|
||||||
while (ssp1 != yyssp)
|
|
||||||
fprintf (stderr, " %d", *++ssp1);
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yyerrhandle:
|
|
||||||
|
|
||||||
yyn = yypact[yystate];
|
|
||||||
if (yyn == YYFLAG)
|
|
||||||
goto yyerrdefault;
|
|
||||||
|
|
||||||
yyn += YYTERROR;
|
|
||||||
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
|
|
||||||
goto yyerrdefault;
|
|
||||||
|
|
||||||
yyn = yytable[yyn];
|
|
||||||
if (yyn < 0)
|
|
||||||
{
|
|
||||||
if (yyn == YYFLAG)
|
|
||||||
goto yyerrpop;
|
|
||||||
yyn = -yyn;
|
|
||||||
goto yyreduce;
|
|
||||||
}
|
|
||||||
else if (yyn == 0)
|
|
||||||
goto yyerrpop;
|
|
||||||
|
|
||||||
if (yyn == YYFINAL)
|
|
||||||
YYACCEPT;
|
|
||||||
|
|
||||||
#if YYDEBUG != 0
|
|
||||||
if (yydebug)
|
|
||||||
fprintf(stderr, "Shifting error token, ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*++yyvsp = yylval;
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
*++yylsp = yylloc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
yystate = yyn;
|
|
||||||
goto yynewstate;
|
|
||||||
|
|
||||||
yyacceptlab:
|
|
||||||
/* YYACCEPT comes here. */
|
|
||||||
if (yyfree_stacks)
|
|
||||||
{
|
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
free (yyls);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
yyabortlab:
|
|
||||||
/* YYABORT comes here. */
|
|
||||||
if (yyfree_stacks)
|
|
||||||
{
|
|
||||||
free (yyss);
|
|
||||||
free (yyvs);
|
|
||||||
#ifdef YYLSP_NEEDED
|
|
||||||
free (yyls);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#line 57 "expr.y"
|
|
||||||
|
|
||||||
|
|
||||||
int yyerror(char *s)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SDL
|
|
||||||
extern FILE *yyin;
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
// yydebug = 1;
|
|
||||||
++argv, --argc;
|
|
||||||
if(argc > 0)
|
|
||||||
yyin = fopen(argv[0], "r");
|
|
||||||
else
|
|
||||||
yyin = stdin;
|
|
||||||
if(!yyparse())
|
|
||||||
result->print();
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,13 +0,0 @@
|
||||||
#ifndef YYSTYPE
|
|
||||||
#define YYSTYPE int
|
|
||||||
#endif
|
|
||||||
#define TOKEN_IDENTIFIER 257
|
|
||||||
#define TOKEN_DOT 258
|
|
||||||
#define TOKEN_STAR 259
|
|
||||||
#define TOKEN_ARROW 260
|
|
||||||
#define TOKEN_ADDR 261
|
|
||||||
#define TOKEN_SIZEOF 262
|
|
||||||
#define TOKEN_NUMBER 263
|
|
||||||
|
|
||||||
|
|
||||||
extern YYSTYPE yylval;
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include "../Port.h"
|
#include "../Port.h"
|
||||||
#include "../armdis.h"
|
#include "../armdis.h"
|
||||||
#include "../elf.h"
|
#include "../elf.h"
|
||||||
#include "../exprNode.h"
|
#include "exprNode.h"
|
||||||
|
|
||||||
extern bool debugger;
|
extern bool debugger;
|
||||||
extern int emulating;
|
extern int emulating;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,71 @@
|
||||||
|
/* A Bison parser, made by GNU Bison 2.3. */
|
||||||
|
|
||||||
|
/* Skeleton interface for Bison's Yacc-like parsers in C
|
||||||
|
|
||||||
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, you may create a larger work that contains
|
||||||
|
part or all of the Bison parser skeleton and distribute that work
|
||||||
|
under terms of your choice, so long as that work isn't itself a
|
||||||
|
parser generator using the skeleton or a modified version thereof
|
||||||
|
as a parser skeleton. Alternatively, if you modify or redistribute
|
||||||
|
the parser skeleton itself, you may (at your option) remove this
|
||||||
|
special exception, which will cause the skeleton and the resulting
|
||||||
|
Bison output files to be licensed under the GNU General Public
|
||||||
|
License without this special exception.
|
||||||
|
|
||||||
|
This special exception was added by the Free Software Foundation in
|
||||||
|
version 2.2 of Bison. */
|
||||||
|
|
||||||
|
/* Tokens. */
|
||||||
|
#ifndef YYTOKENTYPE
|
||||||
|
# define YYTOKENTYPE
|
||||||
|
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||||
|
know about them. */
|
||||||
|
enum yytokentype {
|
||||||
|
TOKEN_IDENTIFIER = 258,
|
||||||
|
TOKEN_DOT = 259,
|
||||||
|
TOKEN_STAR = 260,
|
||||||
|
TOKEN_ARROW = 261,
|
||||||
|
TOKEN_ADDR = 262,
|
||||||
|
TOKEN_SIZEOF = 263,
|
||||||
|
TOKEN_NUMBER = 264
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
/* Tokens. */
|
||||||
|
#define TOKEN_IDENTIFIER 258
|
||||||
|
#define TOKEN_DOT 259
|
||||||
|
#define TOKEN_STAR 260
|
||||||
|
#define TOKEN_ARROW 261
|
||||||
|
#define TOKEN_ADDR 262
|
||||||
|
#define TOKEN_SIZEOF 263
|
||||||
|
#define TOKEN_NUMBER 264
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
|
typedef int YYSTYPE;
|
||||||
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern YYSTYPE yylval;
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
%{
|
||||||
|
#include "expr.cpp.h"
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#include <io.h>
|
||||||
|
#define isatty _isatty
|
||||||
|
#define fileno _fileno
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *exprString;
|
||||||
|
int exprCol;
|
||||||
|
|
||||||
|
#define YY_INPUT(buf,result,max_size) \
|
||||||
|
{ \
|
||||||
|
int c = *exprString++; \
|
||||||
|
exprCol++;\
|
||||||
|
result = (c == 0) ? YY_NULL : (buf[0] = c, 1); \
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%option nomain
|
||||||
|
%option noyywrap
|
||||||
|
%option nounput
|
||||||
|
|
||||||
|
SIZEOF "sizeof"
|
||||||
|
ID [a-zA-Z_][a-zA-Z0-9_]*
|
||||||
|
NUM [0-9]+
|
||||||
|
DOT "."
|
||||||
|
ARROW "->"
|
||||||
|
STAR "*"
|
||||||
|
ADDR "&"
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
{SIZEOF} {
|
||||||
|
return TOKEN_SIZEOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
{ID} {
|
||||||
|
return TOKEN_IDENTIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
{NUM} {
|
||||||
|
return TOKEN_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
{DOT} {
|
||||||
|
return TOKEN_DOT;
|
||||||
|
}
|
||||||
|
|
||||||
|
{ARROW} {
|
||||||
|
return TOKEN_ARROW;
|
||||||
|
}
|
||||||
|
|
||||||
|
{ADDR} {
|
||||||
|
return TOKEN_ADDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
{STAR} {
|
||||||
|
return TOKEN_STAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ \t\n]+
|
||||||
|
|
||||||
|
. return *yytext;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
void exprCleanBuffer()
|
||||||
|
{
|
||||||
|
yy_delete_buffer(YY_CURRENT_BUFFER);
|
||||||
|
yy_init = 1;
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
%{
|
||||||
|
namespace std {
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <memory.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "../System.h"
|
||||||
|
#include "../elf.h"
|
||||||
|
#include "exprNode.h"
|
||||||
|
|
||||||
|
extern int yyerror(char *);
|
||||||
|
extern int yylex();
|
||||||
|
extern char *yytext;
|
||||||
|
|
||||||
|
|
||||||
|
//#define YYERROR_VERBOSE 1
|
||||||
|
//#define YYDEBUG 1
|
||||||
|
|
||||||
|
Node *result = NULL;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%token TOKEN_IDENTIFIER TOKEN_DOT TOKEN_STAR TOKEN_ARROW TOKEN_ADDR
|
||||||
|
%token TOKEN_SIZEOF TOKEN_NUMBER
|
||||||
|
%left TOKEN_DOT TOKEN_ARROW '['
|
||||||
|
%expect 6
|
||||||
|
%%
|
||||||
|
|
||||||
|
final: expression { result = $1; }
|
||||||
|
;
|
||||||
|
|
||||||
|
expression:
|
||||||
|
simple_expression { $$ = $1; } |
|
||||||
|
'(' expression ')' { $$ = $2; } |
|
||||||
|
expression TOKEN_DOT ident { $$ = exprNodeDot($1, $3); } |
|
||||||
|
expression TOKEN_ARROW ident { $$ = exprNodeArrow($1, $3); } |
|
||||||
|
expression '[' number ']' { $$ = exprNodeArray($1, $3); }
|
||||||
|
;
|
||||||
|
simple_expression:
|
||||||
|
ident { $$ = $1; } |
|
||||||
|
TOKEN_STAR expression { $$ = exprNodeStar($2); } |
|
||||||
|
TOKEN_ADDR expression { $$ = exprNodeAddr($2); } |
|
||||||
|
TOKEN_SIZEOF '(' expression ')' { $$ = exprNodeSizeof($3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
number:
|
||||||
|
TOKEN_NUMBER { $$ = exprNodeNumber(); }
|
||||||
|
;
|
||||||
|
|
||||||
|
ident:
|
||||||
|
TOKEN_IDENTIFIER {$$ = exprNodeIdentifier(); }
|
||||||
|
;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
int yyerror(char *s)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SDL
|
||||||
|
extern FILE *yyin;
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
// yydebug = 1;
|
||||||
|
++argv, --argc;
|
||||||
|
if(argc > 0)
|
||||||
|
yyin = fopen(argv[0], "r");
|
||||||
|
else
|
||||||
|
yyin = stdin;
|
||||||
|
if(!yyparse())
|
||||||
|
result->print();
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -20,9 +20,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "agb/GBA.h"
|
#include "../agb/GBA.h"
|
||||||
#include "Port.h"
|
#include "../Port.h"
|
||||||
#include "elf.h"
|
#include "../elf.h"
|
||||||
#include "exprNode.h"
|
#include "exprNode.h"
|
||||||
|
|
||||||
#ifndef __GNUC__
|
#ifndef __GNUC__
|
Loading…
Reference in New Issue