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