Logo Search packages:      
Sourcecode: cccc version File versions

DLexer.cpp

/* DLexer.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
 */

#define ZZINC {if ( track_columns ) (++_endcol);}

#define ZZGETC {ch = input->nextChar(); cl = ZZSHIFT(ch);}

#define ZZNEWSTATE      (newstate = dfa[state][cl])

#ifndef ZZCOPY
#define ZZCOPY    \
      /* Truncate matching buffer to size (not an error) */ \
      if (nextpos < lastpos){                   \
            *(nextpos++) = ch;                  \
      }else{                                          \
            bufovf = 1;                         \
      }
#endif

void DLGLexer::
mode( int m )
{
      /* points to base of dfa table */
      if (m<MAX_MODE){
            automaton = m;
            /* have to redo class since using different compression */
            cl = ZZSHIFT(ch);
      }else{
            sprintf((char *)ebuf,"Invalid automaton mode = %d ",m);
            errstd(ebuf);
      }
}

ANTLRTokenType DLGLexer::
nextTokenType(void)
{
      register int state, newstate;
      /* last space reserved for the null char */
      register DLGChar *lastpos;
      ANTLRTokenType tk;

skip:
      bufovf = 0;
      lastpos = &_lextext[_bufsize-1];
      nextpos = _lextext;
      _begcol = _endcol+1;
more:
      _begexpr = nextpos;
      if ( interactive ) {
            /* interactive version of automaton */
            /* if there is something in ch, process it */
            state = newstate = dfa_base[automaton];
            if (charfull){
                  ZZINC;
                  ZZCOPY;
                  ZZNEWSTATE;
            }
            while (alternatives[newstate]){
                  state = newstate;
                  ZZGETC;
                  ZZINC;
                  ZZCOPY;
                  ZZNEWSTATE;
            }
            /* figure out if last character really part of token */
            if ((state != dfa_base[automaton]) && (newstate == DfaStates)){
                  charfull = 1;
                  --nextpos;
            }else{
                  charfull = 0;
                  state = newstate;
            }
            *(nextpos) = '\0';
            /* Able to transition out of start state to some non err state?*/
            if ( state == dfa_base[automaton] ){
                  /* make sure doesn't get stuck */
                  advance();
            }
      }
      else { /* non-interactive version of automaton */
            if (!charfull)
                  advance();
            else
                  ZZINC;
            state = dfa_base[automaton];
            while (ZZNEWSTATE != DfaStates) {
                  state = newstate;
                  ZZCOPY;
                  ZZGETC;
                  ZZINC;
            }
            charfull = 1;
            if ( state == dfa_base[automaton] ){
                  if (nextpos < lastpos){
                        *(nextpos++) = ch;
                  }else{
                        bufovf = 1;
                  }
                  *nextpos = '\0';
                  /* make sure doesn't get stuck */
                  advance();
            }else{
                  *nextpos = '\0';
            }
      }
      if ( track_columns ) _endcol -= charfull;
      _endexpr = nextpos -1;
      add_erase = 0;
#ifdef OLD
      tk = (ANTLRTokenType)
             (*actions[accepts[state]])(this);  // must pass this manually
                                                                  // actions is not a [] of pointers
                                                                  // to member functions.
#endif
      tk = (this->*actions[accepts[state]])();

// MR1
// MR1 11-Apr-97  Help for tracking DLG results
// MR1

#ifdef DEBUG_LEXER

/* MR1 */        if (debugLexerFlag) {
/* MR1 */      if (parser != NULL) {
/* MR1 */        printf("\ntoken name=%s",parser->parserTokenName(tk));
/* MR1 */      } else {
/* MR1 */        printf("\ntoken nnumber=%d",tk);
/* MR1 */      };
/* MR1 */      printf(" lextext=(%s) mode=%d",
/* MR1 */          (_lextext[0]=='\n' && _lextext[1]==0) ?
/* MR1 */               "newline" : _lextext,
/* MR1 */                     automaton);
/* MR1 */          if (interactive && !charfull) {
/* MR1 */        printf(" char=empty");
/* MR1 */          } else {
/* MR1 */        if (ch=='\n') {
/* MR1 */          printf(" char=newline");
/* MR1 */        } else {
/* MR1 */          printf(" char=(%c)",ch);
/* MR1 */        };
/* MR1 */      };
/* MR1 */      printf(" %s\n",
/* MR1 */          (add_erase==1 ? "skip()" :
/* MR1 */           add_erase==2 ? "more()" :
/* MR1 */           ""));
/* MR1 */        };

#endif

      switch (add_erase) {
            case 1: goto skip;
            case 2: goto more;
      }
      return tk;
}

void DLGLexer::
advance()
{
      if ( input==NULL ) err_in();
      ZZGETC; charfull = 1; ZZINC;
}

Generated by  Doxygen 1.6.0   Back to index