mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-27 01:03:45 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1676 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;
 | |
| }
 |