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-1998
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 
55 DLGLexerBase::
DLGLexerBase(DLGInputStream * in,unsigned bufsize,int _interactive,int _track_columns)56 DLGLexerBase(DLGInputStream *in,
57 	     unsigned bufsize,
58 	     int _interactive,
59 	     int _track_columns)
60 {
61 	this->_bufsize = bufsize;
62 	this->_lextext = new DLGChar[_bufsize];
63 	if ( this->_lextext==NULL ) {
64 	    panic("text buffer is NULL");
65 	}
66 	this->_begexpr = this->_endexpr = NULL;
67 	this->ch = this->bufovf = 0;
68 	this->nextpos = NULL;
69 	this->cl = 0;
70 	this->add_erase = 0;
71 	this->input = in;
72 	this->_begcol = 0;
73 	this->_endcol = 0;
74 	this->_line = 1;
75 	this->charfull = 0;
76 	this->automaton = 0;
77 	this->token_to_fill = NULL;
78 	this->interactive = _interactive;
79 	this->track_columns = _track_columns;
80 	this->debugLexerFlag = 0;					// MR1
81 	this->parser = NULL;						// MR1
82     this->lexErrCount=0;                        // MR11
83 }
84 
85 // MR19  THM
86 
reset()87 void DLGLexerBase::reset()
88 {
89 	this->charfull = 0;
90 	this->_begcol = 0;
91 	this->_endcol = 0;
92 	this->automaton = 0;
93 	this->_line=1;
94 	this->lexErrCount=0;
95 }
96 
97 void DLGLexerBase::
setInputStream(DLGInputStream * in)98 setInputStream( DLGInputStream *in )
99 {
100 	this->input = in;
101 	_line = 1;
102 	charfull = 0;
103 }
104 
105 /* saves dlg state, but not what feeds dlg (such as file position) */
106 void DLGLexerBase::
saveState(DLGState * state)107 saveState(DLGState *state)
108 {
109 	state->input = input;
110 	state->interactive = interactive;
111 	state->track_columns = track_columns;
112 	state->auto_num = automaton;
113 	state->add_erase = add_erase;
114 	state->lookc = ch;
115 	state->char_full = charfull;
116 	state->begcol = _begcol;
117 	state->endcol = _endcol;
118 	state->line = _line;
119 	state->lextext = _lextext;
120 	state->begexpr = _begexpr;
121 	state->endexpr = _endexpr;
122 	state->bufsize = _bufsize;
123 	state->bufovf = bufovf;
124 	state->nextpos = nextpos;
125 	state->class_num = cl;
126 	state->debugLexerFlag = debugLexerFlag;				// MR1
127 	state->parser = parser;						// MR1
128 }
129 
130 void DLGLexerBase::
restoreState(DLGState * state)131 restoreState(DLGState *state)
132 {
133 	input = state->input;
134 	interactive = state->interactive;
135 	track_columns = state->track_columns;
136 	automaton = state->auto_num;
137 	add_erase = state->add_erase;
138 	ch = state->lookc;
139 	charfull = state->char_full;
140 	_begcol = state->begcol;
141 	_endcol = state->endcol;
142 	_line = state->line;
143 	_lextext = state->lextext;
144 	_begexpr = state->begexpr;
145 	_endexpr = state->endexpr;
146 	_bufsize = state->bufsize;
147 	bufovf = state->bufovf;
148 	nextpos = state->nextpos;
149 	cl = state->class_num;
150 	debugLexerFlag = state->debugLexerFlag;				// MR1
151 	parser = state->parser;						// MR1
152 }
153 
154 /* erase what is currently in the buffer, and get a new reg. expr */
155 void DLGLexerBase::
skip()156 skip()
157 {
158 	add_erase = 1;
159 }
160 
161 /* don't erase what is in the lextext buffer, add on to it */
162 void DLGLexerBase::
more()163 more()
164 {
165 	add_erase = 2;
166 }
167 
168 /* substitute c for the reg. expr last matched and is in the buffer */
169 void DLGLexerBase::
replchar(DLGChar c)170 replchar(DLGChar c)
171 {
172 	/* can't allow overwriting null at end of string */
173 	if (_begexpr < &_lextext[_bufsize-1]){
174 		*_begexpr = c;
175 		*(_begexpr+1) = '\0';
176 	}
177 	_endexpr = _begexpr;
178 	nextpos = _begexpr + 1;
179 }
180 
181 /* replace the string s for the reg. expr last matched and in the buffer */
182 
183 void DLGLexerBase::
replstr(const DLGChar * s)184 replstr(const DLGChar *s) /* MR20 const */
185 {
186 	register DLGChar *l= &_lextext[_bufsize -1];
187 
188 	nextpos = _begexpr;
189 	if (s){
190 	 	while ((nextpos <= l) && (*(nextpos++) = *(s++))){
191 			/* empty */
192 		}
193 		/* correct for NULL at end of string */
194 		nextpos--;
195 	}
196 	if ((nextpos <= l) && (*(--s) == 0)){
197 		bufovf = 0;
198 	}else{
199 		bufovf = 1;
200 	}
201 	*(nextpos) = '\0';
202 	_endexpr = nextpos - 1;
203 }
204 
205 void DLGLexerBase::
errstd(const char * s)206 errstd(const char *s)                               /* MR20 const */
207 {
208         lexErrCount++;                              /* MR11 */
209         fprintf(stderr,
210                 "%s near line %d (text was '%s')\n",
211                 ((s == NULL) ? "Lexical error" : s),
212                 _line,_lextext);
213 }
214 
215 int DLGLexerBase::
err_in()216 err_in()
217 {
218 	fprintf(stderr,"No input stream, function, or string\n");
219 	/* return eof to get out gracefully */
220 	return EOF;
221 }
222 
223 ANTLRTokenType DLGLexerBase::
erraction()224 erraction()
225 {
226 	errstd("invalid token");
227 	advance();
228 	skip();
229 	return (ANTLRTokenType) 0;	// bogus, but satisfies compiler
230 }
231 
232 _ANTLRTokenPtr DLGLexerBase::
getToken()233 getToken()
234 {
235 	if ( token_to_fill==NULL ) panic("NULL token_to_fill");
236 	ANTLRTokenType tt = nextTokenType();
237 	_ANTLRTokenPtr tk = token_to_fill->makeToken(tt, _lextext,_line);
238 	return tk;
239 }
240 
241 void DLGLexerBase::
panic(const char * msg)242 panic(const char *msg)      /* MR20 const */
243 {
244 	fprintf(stderr, "DLG panic: %s\n", msg);
245 //
246 //  7-Apr-97 133MR1
247 //
248 	exit(PCCTS_EXIT_FAILURE);					// MR1
249 }
250 
251 ANTLRParser * DLGLexerBase::						// MR1
setParser(ANTLRParser * p)252 setParser(ANTLRParser *p) {						// MR1
253   ANTLRParser	*oldValue=parser;					// MR1
254   parser=p;								// MR1
255   return oldValue;							// MR1
256 }									// MR1
257 									// MR1
258 ANTLRParser * DLGLexerBase::						// MR1
getParser()259 getParser() {								// MR1
260   return parser;							// MR1
261 }									// MR1
262 									// MR1
263 int DLGLexerBase::							// MR1
debugLexer(int newValue)264 debugLexer(int newValue) {						// MR1
265   int	oldValue=debugLexerFlag;					// MR1
266   debugLexerFlag=newValue;						// MR1
267   return oldValue;							// MR1
268 }									// MR1
269