home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
290_01
/
fastskel.c
< prev
next >
Wrap
Text File
|
1990-05-14
|
11KB
|
427 lines
/* A lexical scanner generated by flex */
#define FLEX_FAST_SKEL
#include <stdlib.h>
#include <io.h>
#include "fastskel.h"
%% 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();
/*
* * Flex: fast skeleton function prototypes
*/
static int
yy_get_next_buffer(void);
static YY_CS_TYPE
yy_get_previous_state();
static void
unput(char);
static int
input(void);
#define FLEX_USES_BACKTRACKING
#ifdef FLEX_USES_BACKTRACKING
# ifdef FLEX_FULL_TABLE
# define YY_BACKTRACKING_ACTION(cur_state,cur_buf_p) \
if ( l[cur_state] ) \
{ \
yy_last_accepting_state = cur_state; \
yy_last_accepting_cpos = cur_buf_p; \
}
# else
# define YY_BACKTRACKING_ACTION(cur_state,cur_buf_p) \
if ( cur_state[-1].n ) \
{ \
yy_last_accepting_state = cur_state; \
yy_last_accepting_cpos = cur_buf_p; \
}
# endif
#else
# define YY_BACKTRACKING_ACTION(cur_state,cur_buf_p)
#endif
/*--------------------------------------------------------------------------*/
/*------------------------- BEGIN LEXICAL ANALYZER -------------------------*/
/*--------------------------------------------------------------------------*/
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