home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
FORTH
/
FLEX.ARC
/
FLEXFAST.SRC
< prev
next >
Wrap
Text File
|
1988-10-09
|
10KB
|
407 lines
/* A lexical scanner generated by flex */
#define FLEX_FAST_SKEL
#indef MSDOS
# include "fastskeldef.h"
#else
# include "fastskel.h"
#endif
%% section 1 code and the definition of YY_TRANS_OFFSET_TYPE, if needed, go here
#ifndef FLEX_FULL_TABLE
/* struct for yy_transition */
struct yy_trans_info
{
/* v is a verify for a transition. */
short v;
/* In cases where its sister v *is* a "yes, there is a transition",
* n is* the offset (in records) to the next state. In most cases
* where there is no transition, the value of n is irrelevant. If n
* is the -1th record of a state, though, then n is the action
* number for that state
*/
YY_TRANS_OFFSET_TYPE n;
};
#endif
%% data tables for DFA go here
/* these declarations have to come after the section 1 code or lint gets
* confused about whether the variables are used
*/
FILE *yyin = stdin, *yyout = stdout;
/* these variables are all declared out here so that section 3 code can
* manipulate them
*/
static char *yy_c_buf_p; /* points to current character in buffer */
static char *yy_b_buf_p; /* points to start of current scan */
static int yy_init = 1; /* whether we need to initialize */
static int yy_start; /* start state number */
/* true when we've seen an EOF for the current input file */
static int yy_eof_has_been_seen;
static int yy_n_chars; /* number of characters read into yy_ch_buf */
/* yy_ch_buf has to be 2 characters longer than YY_BUF_SIZE because we need
* to put in 2 end-of-buffer characters (this is explained where it is
* done) at the end of yy_ch_buf
*/
static char yy_ch_buf[YY_BUF_SIZE + 2];
/* yy_hold_char holds the character lost when yytext is formed */
static char yy_hold_char;
char *yytext;
static int yyleng; /* length of yytext */
static YY_CS_TYPE yy_last_accepting_state;
static char *yy_last_accepting_cpos;
static YY_CS_TYPE yy_get_previous_state();
static int yy_get_next_buffer();
#define FLEX_USES_BACKTRACKING
#ifdef FLEX_USES_BACKTRACKING
# ifdef FLEX_FULL_TABLE
# define YY_BACKTRACKING_ACTION \
if ( l[yy_current_state] ) \
{ \
yy_last_accepting_state = yy_current_state; \
yy_last_accepting_cpos = yy_c_buf_p; \
}
# else
# define YY_BACKTRACKING_ACTION \
if ( yy_current_state[-1].n ) \
{ \
yy_last_accepting_state = yy_current_state; \
yy_last_accepting_cpos = yy_c_buf_p; \
}
# endif
#else
# define YY_BACKTRACKING_ACTION
#endif
YY_DECL
{
register YY_CS_TYPE yy_current_state;
register int yy_c;
register struct yy_trans_info *yy_trans_info;
register int yy_act;
%% user's declarations go here
if ( yy_init )
{
yy_start = 1; /* first start state */
new_file:
/* this is where we enter upon encountering and end-of-file and
* yywrap() indicating that we should continue processing
*/
/* we put in the '\n' and start reading from [1] so that an
* initial match-at-newline will be true.
*/
yy_ch_buf[0] = '\n';
yy_n_chars = 1;
/* we always need two end-of-buffer characters. The first causes
* a transition to the end-of-buffer state. The second causes
* a jam in that state.
*/
yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
yy_eof_has_been_seen = 0;
YY_FAST_INIT;
yy_init = 0;
}
while ( 1 ) /* loops until end-of-file is reached */
{
/* support of yytext and yyleng */
YY_DO_BEFORE_SCAN;
/* yy_b_buf_p points to the position in yy_ch_buf of the start of the
* current run.
*/
yy_b_buf_p = yy_c_buf_p;
YY_FIND_START_STATE( yy_current_state );
YY_FIND_NEXT_MATCH;
YY_DO_BEFORE_ACTION;
/* we need this label to process the very last action (right before the end of
* the file)
*/
do_action:
YY_FIND_ACTION( yy_act );
#ifdef FLEX_DEBUG
fprintf( stderr, "--accepting rule #%d\n", yy_act );
#endif
switch ( yy_act )
{
%% actions go here
case YY_BACK_TRACK:
YY_DO_BEFORE_SCAN; /* undo the effects of YY_DO_BEFORE_ACTION */
yy_c_buf_p = yy_last_accepting_cpos + 1;
yy_current_state = yy_last_accepting_state;
YY_DO_BEFORE_ACTION;
goto do_action;
case YY_NEW_FILE:
break; /* begin reading from new file */
case YY_DO_DEFAULT:
/* we have to eat up one character and recompute yytext and
* yyleng
*/
YY_DO_BEFORE_SCAN; /* undo the effects of YY_DO_BEFORE_ACTION */
++yy_c_buf_p;
YY_DO_BEFORE_ACTION;
YY_DEFAULT_ACTION;
break;
case YY_END_OF_BUFFER:
YY_DO_BEFORE_SCAN; /* undo the effects of YY_DO_BEFORE_ACTION */
switch ( yy_get_next_buffer() )
{
case EOB_ACT_END_OF_FILE:
{
if ( yywrap() )
{
/* note: because we've taken care in
* yy_get_next_buffer() to have set up yy_b_buf_p,
* we can now set up yy_c_buf_p so that if some
* total hoser (like flex itself) wants
* to call the scanner after we return the
* YY_NULL, it'll still work - another YY_NULL
* will get returned.
*/
yy_c_buf_p = yy_b_buf_p;
return ( YY_NULL );
}
else
goto new_file;
}
break;
case EOB_ACT_RESTART_SCAN:
yy_c_buf_p = yy_b_buf_p;
YY_DO_BEFORE_RESTART;
break;
case EOB_ACT_LAST_MATCH:
yy_c_buf_p = &yy_ch_buf[yy_n_chars];
yy_current_state = yy_get_previous_state();
YY_DO_BEFORE_ACTION;
goto do_action;
}
break;
default:
printf( "action # %d\n", yy_act );
YY_FATAL_ERROR( "fatal flex scanner internal error" );
}
}
}
/* yy_get_next_buffer - try to read in new buffer
*
* synopsis
* int yy_get_next_buffer();
*
* returns a code representing an action
* EOB_ACT_LAST_MATCH -
* EOB_ACT_RESTART_SCAN - restart the scanner
* EOB_ACT_END_OF_FILE - end of file
*/
static int yy_get_next_buffer()
{
if ( yy_c_buf_p != &yy_ch_buf[yy_n_chars + 1] )
{
YY_FATAL_ERROR( "NULL in input" );
/*NOTREACHED*/
}
else
{ /* try to read more data */
register char *dest = yy_ch_buf;
register char *source = yy_b_buf_p - 1; /* copy prev. char, too */
register int number_to_move, i;
int ret_val;
/* first move last chars to start of buffer */
number_to_move = yy_c_buf_p - yy_b_buf_p;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
if ( yy_eof_has_been_seen )
/* don't do the read, it's not guaranteed to return an EOF,
* just force an EOF
*/
yy_n_chars = 0;
else
/* read in more data */
YY_INPUT( (&yy_ch_buf[number_to_move]), yy_n_chars,
YY_BUF_SIZE - number_to_move - 1 );
if ( yy_n_chars == 0 )
{
if ( number_to_move == 1 )
ret_val = EOB_ACT_END_OF_FILE;
else
ret_val = EOB_ACT_LAST_MATCH;
yy_eof_has_been_seen = 1;
}
else
ret_val = EOB_ACT_RESTART_SCAN;
yy_n_chars += number_to_move;
yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
/* yy_b_buf_p begins at the second character in
* yy_ch_buf; the first character is the one which
* preceded it before reading in the latest buffer;
* it needs to be kept around in case it's a
* newline, so yy_get_previous_state() will have
* with '^' rules active
*/
yy_b_buf_p = &yy_ch_buf[1];
return ( ret_val );
}
}
/* yy_get_previous_state - get the state just before the eob char was reached
*
* synopsis
* YY_CS_TYPE yy_get_previous_state();
*/
static YY_CS_TYPE yy_get_previous_state()
{
register YY_CS_TYPE yy_cur_state;
register char *yy_temp_char_ptr;
YY_FIND_START_STATE( yy_cur_state );
for ( yy_temp_char_ptr = yy_b_buf_p; yy_temp_char_ptr < yy_c_buf_p; )
YY_GET_NEXT_STATE;
return ( yy_cur_state );
}
static unput( c )
int c;
{
YY_DO_BEFORE_SCAN; /* undo effects of setting up yytext */
if ( yy_c_buf_p < yy_ch_buf + 2 )
{ /* need to shift things up to make room */
register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */
register char *dest = &yy_ch_buf[YY_BUF_SIZE + 2];
register char *source = &yy_ch_buf[number_to_move];
while ( source > yy_ch_buf )
*--dest = *--source;
yy_c_buf_p += dest - source;
yy_b_buf_p += dest - source;
if ( yy_c_buf_p < yy_ch_buf + 2 )
YY_FATAL_ERROR( "flex scanner push-back overflow" );
}
if ( yy_c_buf_p > yy_b_buf_p && yy_c_buf_p[-1] == '\n' )
yy_c_buf_p[-2] = '\n';
*--yy_c_buf_p = c;
YY_DO_BEFORE_ACTION; /* set up yytext again */
}
static int input()
{
int c;
YY_DO_BEFORE_SCAN;
if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
{ /* need more input */
yy_b_buf_p = yy_c_buf_p;
++yy_c_buf_p;
switch ( yy_get_next_buffer() )
{
/* this code, unfortunately, is somewhat redundant with
* that above
*/
case EOB_ACT_END_OF_FILE:
{
if ( yywrap() )
{
yy_c_buf_p = yy_b_buf_p;
return ( EOF );
}
yy_ch_buf[0] = '\n';
yy_n_chars = 1;
yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
yy_eof_has_been_seen = 0;
YY_FAST_INIT;
return ( input() );
}
break;
case EOB_ACT_RESTART_SCAN:
yy_c_buf_p = yy_b_buf_p;
break;
case EOB_ACT_LAST_MATCH:
YY_FATAL_ERROR( "unexpected last match in input()" );
}
}
c = *yy_c_buf_p++;
YY_DO_BEFORE_RESTART;
return ( c );
}