DLexerBase.cpp revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* DLGLexerBase.c
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * SOFTWARE RIGHTS
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Set (PCCTS) -- PCCTS is in the public domain. An individual or
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * company may do whatever they wish with source code distributed with
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * PCCTS or the code generated by PCCTS, including the incorporation of
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * PCCTS, or its output, into commerical software.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * We encourage users to develop software with PCCTS. However, we do ask
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * that credit is given to us for developing PCCTS. By "credit",
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * we mean that if you incorporate our source code into one of your
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * programs (commercial product, research project, or otherwise) that you
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * acknowledge this fact somewhere in the documentation, research report,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * etc... If you like PCCTS and have developed a nice tool with the
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * output, please mention that you developed it using PCCTS. In
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * addition, we ask that this header remain intact in our source code.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * As long as these guidelines are kept, we expect to continue enhancing
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * this system and expect to make other tools available as they are
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * completed.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * ANTLR 1.33
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Terence Parr
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Parr Research Corporation
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * with Purdue University and AHPCRC, University of Minnesota
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * 1989-2000
d0538f66491267879b7418b21ad78e3dcc2dcc83cg */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include "pcctscfg.h"
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include "pccts_stdio.h"
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include "pccts_stdlib.h"
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgPCCTS_NAMESPACE_STD
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* I have to put this here due to C++ limitation
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * that you can't have a 'forward' decl for enums.
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * I hate C++!!!!!!!!!!!!!!!
d0538f66491267879b7418b21ad78e3dcc2dcc83cg */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg// MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg// MR1 10-Apr-97 133MR1 Prevent use of varying sizes for the
d0538f66491267879b7418b21ad78e3dcc2dcc83cg// MR1 ANTLRTokenType enum
d0538f66491267879b7418b21ad78e3dcc2dcc83cg// MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgenum ANTLRTokenType { TER_HATES_CPP=0, ITS_UTTER_GARBAGE, // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg WITH_SOME_GOOD_IDEAS=9999}; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#define ANTLR_SUPPORT_CODE
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include "pcctscfg.h"
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include DLEXERBASE_H
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#include APARSER_H // MR23
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgDLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgDLGLexerBase(DLGInputStream *in,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg unsigned bufsize,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg int _interactive,
d0538f66491267879b7418b21ad78e3dcc2dcc83cg int _track_columns)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_bufsize = bufsize;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_lextext = new DLGChar[_bufsize];
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if ( this->_lextext==NULL ) {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg panic("text buffer is NULL");
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_begexpr = this->_endexpr = NULL;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->ch = this->bufovf = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->nextpos = NULL;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->cl = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->add_erase = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->input = in;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_begcol = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_endcol = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_line = 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->charfull = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->automaton = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->token_to_fill = NULL;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->interactive = _interactive;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->track_columns = _track_columns;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->debugLexerFlag = 0; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->parser = NULL; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->lexErrCount=0; // MR11
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg// MR19 THM
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::reset()
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->charfull = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_begcol = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_endcol = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->automaton = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->_line=1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->lexErrCount=0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgsetInputStream( DLGInputStream *in )
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg this->input = in;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _line = 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg charfull = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* saves dlg state, but not what feeds dlg (such as file position) */
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgsaveState(DLGState *state)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->input = input;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->interactive = interactive;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->track_columns = track_columns;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->auto_num = automaton;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->add_erase = add_erase;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->lookc = ch;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->char_full = charfull;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->begcol = _begcol;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->endcol = _endcol;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->line = _line;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->lextext = _lextext;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->begexpr = _begexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->endexpr = _endexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->bufsize = _bufsize;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->bufovf = bufovf;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->nextpos = nextpos;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->class_num = cl;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->debugLexerFlag = debugLexerFlag; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg state->parser = parser; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgrestoreState(DLGState *state)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg input = state->input;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg interactive = state->interactive;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg track_columns = state->track_columns;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg automaton = state->auto_num;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg add_erase = state->add_erase;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg ch = state->lookc;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg charfull = state->char_full;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _begcol = state->begcol;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _endcol = state->endcol;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _line = state->line;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _lextext = state->lextext;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _begexpr = state->begexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _endexpr = state->endexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _bufsize = state->bufsize;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg bufovf = state->bufovf;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg nextpos = state->nextpos;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg cl = state->class_num;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg debugLexerFlag = state->debugLexerFlag; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg parser = state->parser; // MR1
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* erase what is currently in the buffer, and get a new reg. expr */
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgskip()
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg add_erase = 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* don't erase what is in the lextext buffer, add on to it */
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgmore()
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg add_erase = 2;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* substitute c for the reg. expr last matched and is in the buffer */
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgreplchar(DLGChar c)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg /* can't allow overwriting null at end of string */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (_begexpr < &_lextext[_bufsize-1]){
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *_begexpr = c;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *(_begexpr+1) = '\0';
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _endexpr = _begexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (c != '\0') {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg nextpos = _begexpr + 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }
d0538f66491267879b7418b21ad78e3dcc2dcc83cg else {
d0538f66491267879b7418b21ad78e3dcc2dcc83cg nextpos = _begexpr; /* MR30 Zero terminates string. */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg/* replace the string s for the reg. expr last matched and in the buffer */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#ifdef _MSC_VER // MR23
d0538f66491267879b7418b21ad78e3dcc2dcc83cg//Turn off "assignment within conditional expression" warning
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#pragma warning(disable : 4706)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#endif
d0538f66491267879b7418b21ad78e3dcc2dcc83cgvoid DLGLexerBase::
d0538f66491267879b7418b21ad78e3dcc2dcc83cgreplstr(const DLGChar *s) /* MR20 const */
d0538f66491267879b7418b21ad78e3dcc2dcc83cg{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg register DLGChar *l= &_lextext[_bufsize -1];
d0538f66491267879b7418b21ad78e3dcc2dcc83cg
d0538f66491267879b7418b21ad78e3dcc2dcc83cg nextpos = _begexpr;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (s){
d0538f66491267879b7418b21ad78e3dcc2dcc83cg while ((nextpos <= l) && (*(nextpos++) = *(s++))){
dc8c6b69817035ac35a9f4e5a835d114ce2b5e24ms /* empty */
dc8c6b69817035ac35a9f4e5a835d114ce2b5e24ms }
dc8c6b69817035ac35a9f4e5a835d114ce2b5e24ms /* correct for NULL at end of string */
fc6df3bdbec9a23827d64460d15c987a4497ef35miao chen - Sun Microsystems - Beijing China nextpos--;
fc6df3bdbec9a23827d64460d15c987a4497ef35miao chen - Sun Microsystems - Beijing China }
fc6df3bdbec9a23827d64460d15c987a4497ef35miao chen - Sun Microsystems - Beijing China if ((nextpos <= l) && (*(--s) == 0)){
fc6df3bdbec9a23827d64460d15c987a4497ef35miao chen - Sun Microsystems - Beijing China bufovf = 0;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }else{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg bufovf = 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg }
d0538f66491267879b7418b21ad78e3dcc2dcc83cg *(nextpos) = '\0';
d0538f66491267879b7418b21ad78e3dcc2dcc83cg _endexpr = nextpos - 1;
d0538f66491267879b7418b21ad78e3dcc2dcc83cg}
d0538f66491267879b7418b21ad78e3dcc2dcc83cg#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;
}