git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1676 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* DLGLexerBase.h
 | 
						|
 *
 | 
						|
 * 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
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef DLGX_H
 | 
						|
#define DLGX_H
 | 
						|
 | 
						|
#include "pcctscfg.h"
 | 
						|
#include "pccts_stdio.h"
 | 
						|
 | 
						|
PCCTS_NAMESPACE_STD
 | 
						|
 | 
						|
#include ATOKEN_H
 | 
						|
#include ATOKENSTREAM_H
 | 
						|
 | 
						|
class ANTLRParser;							// MR1
 | 
						|
 | 
						|
/* must define what a char looks like; can make this a class too */
 | 
						|
typedef char DLGChar;
 | 
						|
 | 
						|
/*  Can have it as a class too: (ack this looks weird; is it right?)
 | 
						|
class DllExportPCCTS DLGChar {
 | 
						|
private:
 | 
						|
	int c;
 | 
						|
public:
 | 
						|
	DLGChar(int ch) { c = ch; }
 | 
						|
	int atom() { return c; }
 | 
						|
};
 | 
						|
*/
 | 
						|
 | 
						|
/* user must subclass this */
 | 
						|
class DllExportPCCTS DLGInputStream {
 | 
						|
public:
 | 
						|
	virtual int nextChar() = 0;
 | 
						|
};
 | 
						|
 | 
						|
/* Predefined char stream: Input from FILE */
 | 
						|
class DllExportPCCTS DLGFileInput : public DLGInputStream {
 | 
						|
private:
 | 
						|
	int found_eof;
 | 
						|
	FILE *input;
 | 
						|
public:
 | 
						|
	DLGFileInput(FILE *f) { input = f; found_eof = 0; }
 | 
						|
	int nextChar() {
 | 
						|
			int c;
 | 
						|
			if ( found_eof ) return EOF;
 | 
						|
			else {
 | 
						|
				c=getc(input);
 | 
						|
				if ( c==EOF ) found_eof = 1;
 | 
						|
				return c;
 | 
						|
			}
 | 
						|
	}
 | 
						|
    void DLGFileReset(FILE *f) {input=f; found_eof = 0; };              // MR11
 | 
						|
};
 | 
						|
 | 
						|
// MR9  Suggested by Bruce Guenter (bruceg@qcc.sk.ca)
 | 
						|
// MR9  Make DLGStringInput const correct
 | 
						|
 | 
						|
/* Predefined char stream: Input from string */
 | 
						|
class DllExportPCCTS DLGStringInput : public DLGInputStream {
 | 
						|
private:
 | 
						|
	const DLGChar *input;                                           // MR9
 | 
						|
	const DLGChar *p;                                               // MR9
 | 
						|
public:
 | 
						|
	DLGStringInput(const DLGChar *s) { input = s; p = &input[0];}   // MR9
 | 
						|
	int nextChar()
 | 
						|
		{
 | 
						|
			if (*p) return (int) (unsigned char) *p++;              // MR14
 | 
						|
			else return EOF;
 | 
						|
		}
 | 
						|
 | 
						|
    void DLGStringReset(const DLGChar *s) {input=s; p= &input[0]; }; // MR11 // MR16
 | 
						|
};
 | 
						|
 | 
						|
class DllExportPCCTS DLGState {
 | 
						|
public:
 | 
						|
	DLGInputStream *input;
 | 
						|
	int interactive;
 | 
						|
	int track_columns;
 | 
						|
	int auto_num;
 | 
						|
	int add_erase;
 | 
						|
	int lookc;
 | 
						|
	int char_full;
 | 
						|
	int begcol, endcol;
 | 
						|
	int line;
 | 
						|
	DLGChar *lextext, *begexpr, *endexpr;
 | 
						|
	int bufsize;
 | 
						|
	int bufovf;
 | 
						|
	DLGChar *nextpos;
 | 
						|
	int	class_num;
 | 
						|
	int	debugLexerFlag;						// MR1
 | 
						|
	ANTLRParser *parser;						// MR1
 | 
						|
};
 | 
						|
 | 
						|
/* user must subclass this */
 | 
						|
class DllExportPCCTS DLGLexerBase : public ANTLRTokenStream {
 | 
						|
public:
 | 
						|
	virtual ANTLRTokenType erraction();
 | 
						|
 | 
						|
protected:
 | 
						|
	DLGInputStream *input;
 | 
						|
	int interactive;
 | 
						|
	int track_columns;
 | 
						|
	DLGChar	*_lextext;	/* text of most recently matched token */
 | 
						|
	DLGChar	*_begexpr;	/* beginning of last reg expr recogn. */
 | 
						|
	DLGChar	*_endexpr;	/* beginning of last reg expr recogn. */
 | 
						|
	int	_bufsize;		/* number of characters in lextext */
 | 
						|
	int	_begcol;		/* column that first character of token is in*/
 | 
						|
	int	_endcol;		/* column that last character of token is in */
 | 
						|
	int	_line;			/* line current token is on */
 | 
						|
	int	ch;				/* character to determine next state */
 | 
						|
	int	bufovf;			/* indicates that buffer too small for text */
 | 
						|
	int	charfull;
 | 
						|
	DLGChar	*nextpos;	/* points to next available position in lextext*/
 | 
						|
	int	cl;
 | 
						|
	int automaton;
 | 
						|
	int	add_erase;
 | 
						|
	DLGChar ebuf[70];
 | 
						|
	_ANTLRTokenPtr token_to_fill;
 | 
						|
 | 
						|
	int	debugLexerFlag;						// MR1
 | 
						|
	ANTLRParser	*parser;					// MR1
 | 
						|
public:
 | 
						|
	virtual _ANTLRTokenPtr getToken();      // MR12 public
 | 
						|
	virtual void advance(void) = 0;
 | 
						|
	void	skip(void);		/* erase lextext, look for antoher token */
 | 
						|
	void	more(void);		/* keep lextext, look for another token */
 | 
						|
	void	mode(int k);	/* switch to automaton 'k' */
 | 
						|
	void	saveState(DLGState *);
 | 
						|
	void	restoreState(DLGState *);
 | 
						|
	virtual ANTLRTokenType nextTokenType(void)=0;/* get next token */
 | 
						|
	void	replchar(DLGChar c);	/* replace last recognized reg. expr. with
 | 
						|
									 a character */
 | 
						|
	void	replstr(const DLGChar *s);	/* replace last recognized reg. expr. with
 | 
						|
    									 a string */ /* MR20 const */
 | 
						|
        virtual int err_in();						// MR1
 | 
						|
	virtual void errstd(const char *);				// MR1  MR20 const
 | 
						|
	int		line()		{ return _line; }
 | 
						|
	void	set_line(int newValue)	{ _line=newValue; };		// MR1
 | 
						|
	virtual void newline()	{ _line++; }
 | 
						|
	DLGChar	*lextext()	{ return _lextext; }
 | 
						|
 | 
						|
	int		begcol()	{ return _begcol; }
 | 
						|
	int		endcol()	{ return _endcol; }
 | 
						|
	void	set_begcol(int a)	{ _begcol=a; }
 | 
						|
	void	set_endcol(int a)	{ _endcol=a; }
 | 
						|
	DLGChar	*begexpr()	{ return _begexpr; }
 | 
						|
	DLGChar	*endexpr()	{ return _endexpr; }
 | 
						|
	int		bufsize()	{ return _bufsize; }
 | 
						|
 | 
						|
	void	setToken(ANTLRAbstractToken *t)	{ token_to_fill = t; }
 | 
						|
 | 
						|
	void	setInputStream(DLGInputStream *);
 | 
						|
	DLGLexerBase(DLGInputStream *in,
 | 
						|
				 unsigned bufsize=2000,
 | 
						|
				 int interactive=0,
 | 
						|
				 int track_columns=0);
 | 
						|
	void reset();									// MR19
 | 
						|
	virtual ~DLGLexerBase() { delete [] _lextext; }
 | 
						|
	virtual void panic(const char *msg);			// MR1  MR20 const
 | 
						|
	void	trackColumns() {
 | 
						|
				track_columns = 1;
 | 
						|
				this->_begcol = 0;
 | 
						|
				this->_endcol = 0;
 | 
						|
			};
 | 
						|
	virtual ANTLRParser *setParser(ANTLRParser *p);			// MR1
 | 
						|
	virtual ANTLRParser *getParser();				// MR1
 | 
						|
	virtual int debugLexer(int value);				// MR1
 | 
						|
    int     lexErrCount;                            // MR12
 | 
						|
	virtual int printMessage(FILE* pFile, const char* pFormat, ...); // MR23
 | 
						|
};
 | 
						|
 | 
						|
#endif
 |