- Fixed: The check arrays for BlockThingsIterators were not properly
freed and each iterator allocated a new one as a result. - Split the Xlat parser context class into a generic part that can be used for other Lemon-based parsers in the future and a smaller Xlat-specific part. SVN r892 (trunk)
This commit is contained in:
parent
17816dcadd
commit
3a14dab2e8
8 changed files with 691 additions and 476 deletions
150
src/parsecontext.h
Normal file
150
src/parsecontext.h
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
** parsecontext.h
|
||||
** Base class for Lemon-based parsers
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 2008 Christoph Oelckers
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions
|
||||
** are met:
|
||||
**
|
||||
** 1. Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** 2. Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in the
|
||||
** documentation and/or other materials provided with the distribution.
|
||||
** 3. The name of the author may not be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
*/
|
||||
|
||||
#ifndef __PARSECONTEST__H_
|
||||
#define __PARSECONTEST__H_
|
||||
|
||||
#include "tarray.h"
|
||||
|
||||
// The basic tokens the parser requires the grammar to understand
|
||||
enum
|
||||
{
|
||||
OR =1,
|
||||
XOR ,
|
||||
AND ,
|
||||
MINUS ,
|
||||
PLUS ,
|
||||
MULTIPLY ,
|
||||
DIVIDE ,
|
||||
NUM ,
|
||||
SYMNUM ,
|
||||
LPAREN ,
|
||||
RPAREN ,
|
||||
SYM ,
|
||||
RBRACE ,
|
||||
LBRACE ,
|
||||
COMMA ,
|
||||
EQUALS ,
|
||||
LBRACKET ,
|
||||
RBRACKET ,
|
||||
OR_EQUAL ,
|
||||
COLON ,
|
||||
SEMICOLON,
|
||||
LSHASSIGN,
|
||||
RSHASSIGN,
|
||||
STRING ,
|
||||
INCLUDE ,
|
||||
};
|
||||
|
||||
#define DEFINE_TOKEN_TRANS(prefix) \
|
||||
static int TokenTrans[] = { \
|
||||
0, \
|
||||
prefix##OR, \
|
||||
prefix##XOR, \
|
||||
prefix##AND, \
|
||||
prefix##MINUS, \
|
||||
prefix##PLUS, \
|
||||
prefix##MULTIPLY, \
|
||||
prefix##DIVIDE, \
|
||||
prefix##NUM, \
|
||||
prefix##SYMNUM, \
|
||||
prefix##LPAREN, \
|
||||
prefix##RPAREN, \
|
||||
prefix##SYM, \
|
||||
prefix##RBRACE, \
|
||||
prefix##LBRACE, \
|
||||
prefix##COMMA, \
|
||||
prefix##EQUALS, \
|
||||
prefix##LBRACKET, \
|
||||
prefix##RBRACKET, \
|
||||
prefix##OR_EQUAL, \
|
||||
prefix##COLON, \
|
||||
prefix##SEMICOLON, \
|
||||
prefix##LSHASSIGN, \
|
||||
prefix##RSHASSIGN, \
|
||||
prefix##STRING, \
|
||||
prefix##INCLUDE, \
|
||||
};
|
||||
|
||||
|
||||
struct FParseSymbol
|
||||
{
|
||||
int Value;
|
||||
char Sym[80];
|
||||
};
|
||||
|
||||
union FParseToken
|
||||
{
|
||||
int val;
|
||||
char sym[80];
|
||||
char string[80];
|
||||
FParseSymbol *symval;
|
||||
};
|
||||
|
||||
|
||||
struct FParseContext;
|
||||
|
||||
typedef void (*ParseFunc)(void *pParser, int tokentype, FParseToken token, FParseContext *context);
|
||||
|
||||
struct FParseContext
|
||||
{
|
||||
TArray<FParseSymbol> symbols;
|
||||
int SourceLine;
|
||||
const char *SourceFile;
|
||||
int EnumVal;
|
||||
int *TokenTrans;
|
||||
void *pParser;
|
||||
ParseFunc Parse;
|
||||
|
||||
FParseContext(void *parser, ParseFunc parse, int *tt)
|
||||
{
|
||||
SourceLine = 0;
|
||||
SourceFile = NULL;
|
||||
pParser = parser;
|
||||
Parse = parse;
|
||||
TokenTrans = tt;
|
||||
}
|
||||
|
||||
virtual ~FParseContext() {}
|
||||
|
||||
void AddSym (char *sym, int val);
|
||||
bool FindSym (char *sym, FParseSymbol **val);
|
||||
virtual bool FindToken (char *tok, int *type) = 0;
|
||||
int GetToken (char *&sourcep, FParseToken *yylval);
|
||||
int PrintError (const char *s);
|
||||
void ParseLump(const char *lumpname);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue