/* 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;
}