git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			303 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* DLGLexerBase.c
 | 
						|
 *
 | 
						|
 * SOFTWARE RIGHTS
 | 
						|
 *
 | 
						|
 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 | 
						|
 * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 | 
						|
 * company may do whatever they wish with source code distributed with
 | 
						|
 * PCCTS or the code generated by PCCTS, including the incorporation of
 | 
						|
 * PCCTS, or its output, into commerical software.
 | 
						|
 *
 | 
						|
 * We encourage users to develop software with PCCTS.  However, we do ask
 | 
						|
 * that credit is given to us for developing PCCTS.  By "credit",
 | 
						|
 * we mean that if you incorporate our source code into one of your
 | 
						|
 * programs (commercial product, research project, or otherwise) that you
 | 
						|
 * acknowledge this fact somewhere in the documentation, research report,
 | 
						|
 * etc...  If you like PCCTS and have developed a nice tool with the
 | 
						|
 * output, please mention that you developed it using PCCTS.  In
 | 
						|
 * addition, we ask that this header remain intact in our source code.
 | 
						|
 * As long as these guidelines are kept, we expect to continue enhancing
 | 
						|
 * this system and expect to make other tools available as they are
 | 
						|
 * completed.
 | 
						|
 *
 | 
						|
 * ANTLR 1.33
 | 
						|
 * Terence Parr
 | 
						|
 * Parr Research Corporation
 | 
						|
 * with Purdue University and AHPCRC, University of Minnesota
 | 
						|
 * 1989-2000
 | 
						|
 */
 | 
						|
 | 
						|
#include "pcctscfg.h"
 | 
						|
 | 
						|
#include "pccts_stdio.h"
 | 
						|
#include "pccts_stdlib.h"
 | 
						|
 | 
						|
PCCTS_NAMESPACE_STD
 | 
						|
 | 
						|
/* I have to put this here due to C++ limitation
 | 
						|
 * that you can't have a 'forward' decl for enums.
 | 
						|
 * I hate C++!!!!!!!!!!!!!!!
 | 
						|
 */
 | 
						|
 | 
						|
// MR1
 | 
						|
// MR1  10-Apr-97  133MR1  Prevent use of varying sizes for the
 | 
						|
// MR1  			ANTLRTokenType enum
 | 
						|
// MR1
 | 
						|
 | 
						|
enum ANTLRTokenType { TER_HATES_CPP=0, ITS_UTTER_GARBAGE,		// MR1
 | 
						|
					 WITH_SOME_GOOD_IDEAS=9999};	// MR1
 | 
						|
 | 
						|
#define ANTLR_SUPPORT_CODE
 | 
						|
 | 
						|
#include "pcctscfg.h"
 | 
						|
#include DLEXERBASE_H
 | 
						|
#include APARSER_H		// MR23
 | 
						|
 | 
						|
DLGLexerBase::
 | 
						|
DLGLexerBase(DLGInputStream *in,
 | 
						|
	     unsigned bufsize,
 | 
						|
	     int _interactive,
 | 
						|
	     int _track_columns)
 | 
						|
{
 | 
						|
	this->_bufsize = bufsize;
 | 
						|
	this->_lextext = new DLGChar[_bufsize];
 | 
						|
	if ( this->_lextext==NULL ) {
 | 
						|
	    panic("text buffer is NULL");
 | 
						|
	}
 | 
						|
	this->_begexpr = this->_endexpr = NULL;
 | 
						|
	this->ch = this->bufovf = 0;
 | 
						|
	this->nextpos = NULL;
 | 
						|
	this->cl = 0;
 | 
						|
	this->add_erase = 0;
 | 
						|
	this->input = in;
 | 
						|
	this->_begcol = 0;
 | 
						|
	this->_endcol = 0;
 | 
						|
	this->_line = 1;
 | 
						|
	this->charfull = 0;
 | 
						|
	this->automaton = 0;
 | 
						|
	this->token_to_fill = NULL;
 | 
						|
	this->interactive = _interactive;
 | 
						|
	this->track_columns = _track_columns;
 | 
						|
	this->debugLexerFlag = 0;					// MR1
 | 
						|
	this->parser = NULL;						// MR1
 | 
						|
    this->lexErrCount=0;                        // MR11
 | 
						|
}
 | 
						|
 | 
						|
// MR19  THM 
 | 
						|
 | 
						|
void DLGLexerBase::reset()
 | 
						|
{
 | 
						|
	this->charfull = 0;
 | 
						|
	this->_begcol = 0;
 | 
						|
	this->_endcol = 0;
 | 
						|
	this->automaton = 0;
 | 
						|
	this->_line=1;
 | 
						|
	this->lexErrCount=0;
 | 
						|
}
 | 
						|
 | 
						|
void DLGLexerBase::
 | 
						|
setInputStream( DLGInputStream *in )
 | 
						|
{
 | 
						|
	this->input = in;
 | 
						|
	_line = 1;
 | 
						|
	charfull = 0;
 | 
						|
}
 | 
						|
 | 
						|
/* saves dlg state, but not what feeds dlg (such as file position) */
 | 
						|
void DLGLexerBase::
 | 
						|
saveState(DLGState *state)
 | 
						|
{
 | 
						|
	state->input = input;
 | 
						|
	state->interactive = interactive;
 | 
						|
	state->track_columns = track_columns;
 | 
						|
	state->auto_num = automaton;
 | 
						|
	state->add_erase = add_erase;
 | 
						|
	state->lookc = ch;
 | 
						|
	state->char_full = charfull;
 | 
						|
	state->begcol = _begcol;
 | 
						|
	state->endcol = _endcol;
 | 
						|
	state->line = _line;
 | 
						|
	state->lextext = _lextext;
 | 
						|
	state->begexpr = _begexpr;
 | 
						|
	state->endexpr = _endexpr;
 | 
						|
	state->bufsize = _bufsize;
 | 
						|
	state->bufovf = bufovf;
 | 
						|
	state->nextpos = nextpos;
 | 
						|
	state->class_num = cl;
 | 
						|
	state->debugLexerFlag = debugLexerFlag;				// MR1
 | 
						|
	state->parser = parser;						// MR1
 | 
						|
}
 | 
						|
 | 
						|
void DLGLexerBase::
 | 
						|
restoreState(DLGState *state)
 | 
						|
{
 | 
						|
	input = state->input;
 | 
						|
	interactive = state->interactive;
 | 
						|
	track_columns = state->track_columns;
 | 
						|
	automaton = state->auto_num;
 | 
						|
	add_erase = state->add_erase;
 | 
						|
	ch = state->lookc;
 | 
						|
	charfull = state->char_full;
 | 
						|
	_begcol = state->begcol;
 | 
						|
	_endcol = state->endcol;
 | 
						|
	_line = state->line;
 | 
						|
	_lextext = state->lextext;
 | 
						|
	_begexpr = state->begexpr;
 | 
						|
	_endexpr = state->endexpr;
 | 
						|
	_bufsize = state->bufsize;
 | 
						|
	bufovf = state->bufovf;
 | 
						|
	nextpos = state->nextpos;
 | 
						|
	cl = state->class_num;
 | 
						|
	debugLexerFlag = state->debugLexerFlag;				// MR1
 | 
						|
	parser = state->parser;						// MR1
 | 
						|
}
 | 
						|
 | 
						|
/* erase what is currently in the buffer, and get a new reg. expr */
 | 
						|
void DLGLexerBase::
 | 
						|
skip()
 | 
						|
{
 | 
						|
	add_erase = 1;
 | 
						|
}
 | 
						|
 | 
						|
/* don't erase what is in the lextext buffer, add on to it */
 | 
						|
void DLGLexerBase::
 | 
						|
more()
 | 
						|
{
 | 
						|
	add_erase = 2;
 | 
						|
}
 | 
						|
 | 
						|
/* substitute c for the reg. expr last matched and is in the buffer */
 | 
						|
void DLGLexerBase::
 | 
						|
replchar(DLGChar c)
 | 
						|
{
 | 
						|
	/* can't allow overwriting null at end of string */
 | 
						|
	if (_begexpr < &_lextext[_bufsize-1]){
 | 
						|
		*_begexpr = c;
 | 
						|
		*(_begexpr+1) = '\0';
 | 
						|
	}
 | 
						|
	_endexpr = _begexpr;
 | 
						|
	if (c != '\0') {
 | 
						|
		nextpos = _begexpr + 1;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		nextpos = _begexpr;	/* MR30 Zero terminates string. */
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* replace the string s for the reg. expr last matched and in the buffer */
 | 
						|
 | 
						|
#ifdef _MSC_VER  // MR23
 | 
						|
//Turn off "assignment within conditional expression" warning
 | 
						|
#pragma warning(disable : 4706)
 | 
						|
#endif
 | 
						|
void DLGLexerBase::
 | 
						|
replstr(const DLGChar *s) /* MR20 const */
 | 
						|
{
 | 
						|
	register DLGChar *l= &_lextext[_bufsize -1];
 | 
						|
 | 
						|
	nextpos = _begexpr;
 | 
						|
	if (s){
 | 
						|
		while ((nextpos <= l) && (*(nextpos++) = *(s++))){
 | 
						|
			/* empty */
 | 
						|
		}
 | 
						|
		/* correct for NULL at end of string */
 | 
						|
		nextpos--;
 | 
						|
	}
 | 
						|
	if ((nextpos <= l) && (*(--s) == 0)){
 | 
						|
		bufovf = 0;
 | 
						|
	}else{
 | 
						|
		bufovf = 1;
 | 
						|
	}
 | 
						|
	*(nextpos) = '\0';
 | 
						|
	_endexpr = nextpos - 1;
 | 
						|
}
 | 
						|
#ifdef _MSC_VER  // MR23
 | 
						|
#pragma warning(default: 4706)
 | 
						|
#endif
 | 
						|
 | 
						|
void DLGLexerBase::
 | 
						|
errstd(const char *s)                               /* MR20 const */
 | 
						|
{
 | 
						|
        lexErrCount++;                              /* MR11 */
 | 
						|
        /* MR23 */ printMessage(stderr,
 | 
						|
                "%s near line %d (text was '%s')\n",
 | 
						|
                ((s == NULL) ? "Lexical error" : s),
 | 
						|
                _line,_lextext);
 | 
						|
}
 | 
						|
 | 
						|
int DLGLexerBase::
 | 
						|
err_in()
 | 
						|
{
 | 
						|
	/* MR23 */ printMessage(stderr,"No input stream, function, or string\n");
 | 
						|
	/* return eof to get out gracefully */
 | 
						|
	return EOF;
 | 
						|
}
 | 
						|
 | 
						|
ANTLRTokenType DLGLexerBase::
 | 
						|
erraction()
 | 
						|
{
 | 
						|
	errstd("invalid token");
 | 
						|
	advance();
 | 
						|
	skip();
 | 
						|
	return (ANTLRTokenType) 0;	// bogus, but satisfies compiler
 | 
						|
}
 | 
						|
 | 
						|
_ANTLRTokenPtr DLGLexerBase::
 | 
						|
getToken()
 | 
						|
{
 | 
						|
	if ( token_to_fill==NULL ) panic("NULL token_to_fill");
 | 
						|
	ANTLRTokenType tt = nextTokenType();
 | 
						|
	_ANTLRTokenPtr tk = token_to_fill->makeToken(tt, _lextext,_line);
 | 
						|
	return tk;
 | 
						|
}
 | 
						|
 | 
						|
void DLGLexerBase::
 | 
						|
panic(const char *msg)      /* MR20 const */
 | 
						|
{
 | 
						|
	if (parser)				//MR23
 | 
						|
		parser->panic(msg);	//MR23
 | 
						|
	else					//MR23
 | 
						|
	{
 | 
						|
		/* MR23 */ printMessage(stderr, "DLG panic: %s\n", msg);
 | 
						|
	//
 | 
						|
	//  7-Apr-97 133MR1
 | 
						|
	//
 | 
						|
		exit(PCCTS_EXIT_FAILURE);					// MR1
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
ANTLRParser * DLGLexerBase::						// MR1
 | 
						|
setParser(ANTLRParser *p) {						// MR1
 | 
						|
  ANTLRParser	*oldValue=parser;					// MR1
 | 
						|
  parser=p;								// MR1
 | 
						|
  return oldValue;							// MR1
 | 
						|
}									// MR1
 | 
						|
									// MR1
 | 
						|
ANTLRParser * DLGLexerBase::						// MR1
 | 
						|
getParser() {								// MR1
 | 
						|
  return parser;							// MR1
 | 
						|
}									// MR1
 | 
						|
									// MR1
 | 
						|
int DLGLexerBase::							// MR1
 | 
						|
debugLexer(int newValue) {						// MR1
 | 
						|
  int	oldValue=debugLexerFlag;					// MR1
 | 
						|
  debugLexerFlag=newValue;						// MR1
 | 
						|
  return oldValue;							// MR1
 | 
						|
}									// MR1
 | 
						|
 | 
						|
//MR23
 | 
						|
int DLGLexerBase::printMessage(FILE* pFile, const char* pFormat, ...)
 | 
						|
{
 | 
						|
	va_list marker;
 | 
						|
	va_start( marker, pFormat );
 | 
						|
 | 
						|
	int iRet = 0;
 | 
						|
	if (parser)
 | 
						|
		parser->printMessageV(pFile, pFormat, marker);
 | 
						|
	else
 | 
						|
  		iRet = vfprintf(pFile, pFormat, marker);
 | 
						|
 | 
						|
	va_end( marker );
 | 
						|
	return iRet;
 | 
						|
}
 |