dlexerbase.cpp
来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C++ 代码 · 共 256 行
CPP
256 行
/* 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-1998 */#include "pcctscfg.h"#include PCCTS_STDIO_H#include PCCTS_STDLIB_HPCCTS_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// MR1enum ANTLRTokenType { TER_HATES_CPP=0, ITS_UTTER_GARBAGE, // MR1 WITH_SOME_GOOD_IDEAS=9999}; // MR1#define ANTLR_SUPPORT_CODE#include "pcctscfg.h"#include DLEXERBASE_HDLGLexerBase::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}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; nextpos = _begexpr + 1;}/* replace the string s for the reg. expr last matched and in the buffer */void DLGLexerBase::replstr(register DLGChar *s){ 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;}void DLGLexerBase::errstd(char *s){ lexErrCount++; /* MR11 */ fprintf(stderr, "%s near line %d (text was '%s')\n", ((s == NULL) ? "Lexical error" : s), _line,_lextext);}int DLGLexerBase::err_in(){ fprintf(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(char *msg){ fprintf(stderr, "DLG panic: %s\n", msg);//// 7-Apr-97 133MR1// exit(PCCTS_EXIT_FAILURE); // MR1}ANTLRParser * DLGLexerBase:: // MR1setParser(ANTLRParser *p) { // MR1 ANTLRParser *oldValue=parser; // MR1 parser=p; // MR1 return oldValue; // MR1} // MR1 // MR1ANTLRParser * DLGLexerBase:: // MR1getParser() { // MR1 return parser; // MR1} // MR1 // MR1int DLGLexerBase:: // MR1debugLexer(int newValue) { // MR1 int oldValue=debugLexerFlag; // MR1 debugLexerFlag=newValue; // MR1 return oldValue; // MR1} // MR1
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?