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