home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
pccts.zip
/
pccts
/
h
/
DLexer.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-31
|
4KB
|
154 lines
/* 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.20
* Terence Parr
* Purdue University
* With AHPCRC, University of Minnesota
* 1989-1994
*/
#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(ebuf,"Invalid automaton mode = %d ",m);
errstd(ebuf);
}
}
TokenType DLGLexer::
gettok()
{
register int state, newstate;
/* last space reserved for the null char */
register DLGChar *lastpos;
TokenType 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 = (TokenType)
(*actions[accepts[state]])(this); // must pass this manually
// actions is not a [] of pointers
// to member functions.
#endif
tk = actions[accepts[state]]();
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;
}