Home | History | Annotate | Download | only in h
      1 /* DLGLexerBase.c
      2  *
      3  * SOFTWARE RIGHTS
      4  *
      5  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
      6  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
      7  * company may do whatever they wish with source code distributed with
      8  * PCCTS or the code generated by PCCTS, including the incorporation of
      9  * PCCTS, or its output, into commerical software.
     10  *
     11  * We encourage users to develop software with PCCTS.  However, we do ask
     12  * that credit is given to us for developing PCCTS.  By "credit",
     13  * we mean that if you incorporate our source code into one of your
     14  * programs (commercial product, research project, or otherwise) that you
     15  * acknowledge this fact somewhere in the documentation, research report,
     16  * etc...  If you like PCCTS and have developed a nice tool with the
     17  * output, please mention that you developed it using PCCTS.  In
     18  * addition, we ask that this header remain intact in our source code.
     19  * As long as these guidelines are kept, we expect to continue enhancing
     20  * this system and expect to make other tools available as they are
     21  * completed.
     22  *
     23  * ANTLR 1.33
     24  * Terence Parr
     25  * Parr Research Corporation
     26  * with Purdue University and AHPCRC, University of Minnesota
     27  * 1989-2000
     28  */
     29 
     30 #include "pcctscfg.h"
     31 
     32 #include "pccts_stdio.h"
     33 #include "pccts_stdlib.h"
     34 
     35 PCCTS_NAMESPACE_STD
     36 
     37 /* I have to put this here due to C++ limitation
     38  * that you can't have a 'forward' decl for enums.
     39  * I hate C++!!!!!!!!!!!!!!!
     40  */
     41 
     42 // MR1
     43 // MR1  10-Apr-97  133MR1  Prevent use of varying sizes for the
     44 // MR1  			ANTLRTokenType enum
     45 // MR1
     46 
     47 enum ANTLRTokenType { TER_HATES_CPP=0, ITS_UTTER_GARBAGE,		// MR1
     48 					 WITH_SOME_GOOD_IDEAS=9999};	// MR1
     49 
     50 #define ANTLR_SUPPORT_CODE
     51 
     52 #include "pcctscfg.h"
     53 #include DLEXERBASE_H
     54 #include APARSER_H		// MR23
     55 
     56 DLGLexerBase::
     57 DLGLexerBase(DLGInputStream *in,
     58 	     unsigned bufsize,
     59 	     int _interactive,
     60 	     int _track_columns)
     61 {
     62 	this->_bufsize = bufsize;
     63 	this->_lextext = new DLGChar[_bufsize];
     64 	if ( this->_lextext==NULL ) {
     65 	    panic("text buffer is NULL");
     66 	}
     67 	this->_begexpr = this->_endexpr = NULL;
     68 	this->ch = this->bufovf = 0;
     69 	this->nextpos = NULL;
     70 	this->cl = 0;
     71 	this->add_erase = 0;
     72 	this->input = in;
     73 	this->_begcol = 0;
     74 	this->_endcol = 0;
     75 	this->_line = 1;
     76 	this->charfull = 0;
     77 	this->automaton = 0;
     78 	this->token_to_fill = NULL;
     79 	this->interactive = _interactive;
     80 	this->track_columns = _track_columns;
     81 	this->debugLexerFlag = 0;					// MR1
     82 	this->parser = NULL;						// MR1
     83     this->lexErrCount=0;                        // MR11
     84 }
     85 
     86 // MR19  THM
     87 
     88 void DLGLexerBase::reset()
     89 {
     90 	this->charfull = 0;
     91 	this->_begcol = 0;
     92 	this->_endcol = 0;
     93 	this->automaton = 0;
     94 	this->_line=1;
     95 	this->lexErrCount=0;
     96 }
     97 
     98 void DLGLexerBase::
     99 setInputStream( DLGInputStream *in )
    100 {
    101 	this->input = in;
    102 	_line = 1;
    103 	charfull = 0;
    104 }
    105 
    106 /* saves dlg state, but not what feeds dlg (such as file position) */
    107 void DLGLexerBase::
    108 saveState(DLGState *state)
    109 {
    110 	state->input = input;
    111 	state->interactive = interactive;
    112 	state->track_columns = track_columns;
    113 	state->auto_num = automaton;
    114 	state->add_erase = add_erase;
    115 	state->lookc = ch;
    116 	state->char_full = charfull;
    117 	state->begcol = _begcol;
    118 	state->endcol = _endcol;
    119 	state->line = _line;
    120 	state->lextext = _lextext;
    121 	state->begexpr = _begexpr;
    122 	state->endexpr = _endexpr;
    123 	state->bufsize = _bufsize;
    124 	state->bufovf = bufovf;
    125 	state->nextpos = nextpos;
    126 	state->class_num = cl;
    127 	state->debugLexerFlag = debugLexerFlag;				// MR1
    128 	state->parser = parser;						// MR1
    129 }
    130 
    131 void DLGLexerBase::
    132 restoreState(DLGState *state)
    133 {
    134 	input = state->input;
    135 	interactive = state->interactive;
    136 	track_columns = state->track_columns;
    137 	automaton = state->auto_num;
    138 	add_erase = state->add_erase;
    139 	ch = state->lookc;
    140 	charfull = state->char_full;
    141 	_begcol = state->begcol;
    142 	_endcol = state->endcol;
    143 	_line = state->line;
    144 	_lextext = state->lextext;
    145 	_begexpr = state->begexpr;
    146 	_endexpr = state->endexpr;
    147 	_bufsize = state->bufsize;
    148 	bufovf = state->bufovf;
    149 	nextpos = state->nextpos;
    150 	cl = state->class_num;
    151 	debugLexerFlag = state->debugLexerFlag;				// MR1
    152 	parser = state->parser;						// MR1
    153 }
    154 
    155 /* erase what is currently in the buffer, and get a new reg. expr */
    156 void DLGLexerBase::
    157 skip()
    158 {
    159 	add_erase = 1;
    160 }
    161 
    162 /* don't erase what is in the lextext buffer, add on to it */
    163 void DLGLexerBase::
    164 more()
    165 {
    166 	add_erase = 2;
    167 }
    168 
    169 /* substitute c for the reg. expr last matched and is in the buffer */
    170 void DLGLexerBase::
    171 replchar(DLGChar c)
    172 {
    173 	/* can't allow overwriting null at end of string */
    174 	if (_begexpr < &_lextext[_bufsize-1]){
    175 		*_begexpr = c;
    176 		*(_begexpr+1) = '\0';
    177 	}
    178 	_endexpr = _begexpr;
    179 	if (c != '\0') {
    180 		nextpos = _begexpr + 1;
    181 	}
    182 	else {
    183 		nextpos = _begexpr;	/* MR30 Zero terminates string. */
    184 	}
    185 }
    186 
    187 /* replace the string s for the reg. expr last matched and in the buffer */
    188 
    189 #ifdef _MSC_VER  // MR23
    190 //Turn off "assignment within conditional expression" warning
    191 #pragma warning(disable : 4706)
    192 #endif
    193 void DLGLexerBase::
    194 replstr(const DLGChar *s) /* MR20 const */
    195 {
    196 	register DLGChar *l= &_lextext[_bufsize -1];
    197 
    198 	nextpos = _begexpr;
    199 	if (s){
    200 		while ((nextpos <= l) && (*(nextpos++) = *(s++))){
    201 			/* empty */
    202 		}
    203 		/* correct for NULL at end of string */
    204 		nextpos--;
    205 	}
    206 	if ((nextpos <= l) && (*(--s) == 0)){
    207 		bufovf = 0;
    208 	}else{
    209 		bufovf = 1;
    210 	}
    211 	*(nextpos) = '\0';
    212 	_endexpr = nextpos - 1;
    213 }
    214 #ifdef _MSC_VER  // MR23
    215 #pragma warning(default: 4706)
    216 #endif
    217 
    218 void DLGLexerBase::
    219 errstd(const char *s)                               /* MR20 const */
    220 {
    221         lexErrCount++;                              /* MR11 */
    222         /* MR23 */ printMessage(stderr,
    223                 "%s near line %d (text was '%s')\n",
    224                 ((s == NULL) ? "Lexical error" : s),
    225                 _line,_lextext);
    226 }
    227 
    228 int DLGLexerBase::
    229 err_in()
    230 {
    231 	/* MR23 */ printMessage(stderr,"No input stream, function, or string\n");
    232 	/* return eof to get out gracefully */
    233 	return EOF;
    234 }
    235 
    236 ANTLRTokenType DLGLexerBase::
    237 erraction()
    238 {
    239 	errstd("invalid token");
    240 	advance();
    241 	skip();
    242 	return (ANTLRTokenType) 0;	// bogus, but satisfies compiler
    243 }
    244 
    245 _ANTLRTokenPtr DLGLexerBase::
    246 getToken()
    247 {
    248 	if ( token_to_fill==NULL ) panic("NULL token_to_fill");
    249 	ANTLRTokenType tt = nextTokenType();
    250 	_ANTLRTokenPtr tk = token_to_fill->makeToken(tt, _lextext,_line);
    251 	return tk;
    252 }
    253 
    254 void DLGLexerBase::
    255 panic(const char *msg)      /* MR20 const */
    256 {
    257 	if (parser)				//MR23
    258 		parser->panic(msg);	//MR23
    259 	else					//MR23
    260 	{
    261 		/* MR23 */ printMessage(stderr, "DLG panic: %s\n", msg);
    262 	//
    263 	//  7-Apr-97 133MR1
    264 	//
    265 		exit(PCCTS_EXIT_FAILURE);					// MR1
    266 	}
    267 }
    268 
    269 ANTLRParser * DLGLexerBase::						// MR1
    270 setParser(ANTLRParser *p) {						// MR1
    271   ANTLRParser	*oldValue=parser;					// MR1
    272   parser=p;								// MR1
    273   return oldValue;							// MR1
    274 }									// MR1
    275 									// MR1
    276 ANTLRParser * DLGLexerBase::						// MR1
    277 getParser() {								// MR1
    278   return parser;							// MR1
    279 }									// MR1
    280 									// MR1
    281 int DLGLexerBase::							// MR1
    282 debugLexer(int newValue) {						// MR1
    283   int	oldValue=debugLexerFlag;					// MR1
    284   debugLexerFlag=newValue;						// MR1
    285   return oldValue;							// MR1
    286 }									// MR1
    287 
    288 //MR23
    289 int DLGLexerBase::printMessage(FILE* pFile, const char* pFormat, ...)
    290 {
    291 	va_list marker;
    292 	va_start( marker, pFormat );
    293 
    294 	int iRet = 0;
    295 	if (parser)
    296 		parser->printMessageV(pFile, pFormat, marker);
    297 	else
    298   		iRet = vfprintf(pFile, pFormat, marker);
    299 
    300 	va_end( marker );
    301 	return iRet;
    302 }
    303