www.pudn.com > LEX.rar > LEX.PAR
#include#include #include #include #include #include #define COPY(d,s,a) memmove(d,s,a) #define STDIN 0 #define BUFSIZE 1024 #define EOLN 257 typedef unsigned char uchar ; uchar Start_buf[BUFSIZE] ; uchar *End_buf = Start_buf; uchar *Next = Start_buf; uchar *sMark = Start_buf; uchar *eMark = Start_buf; int Inp_file = STDIN; int Lineno = 0; int Mline = 0; int Termchar = 0; int (*Openp)() =(int (*)())open; int (*Closep)() =(int (*)())close; int (*Readp)(int, char *, int ) =(int (*)(int,char *, int))read; char *ii_mark_start( void ); char *ii_mark_end( void ); char *ii_to_mark( void ); int ii_advance( void ); int ii_fillbuf( unsigned char *starting_at ); int ii_look( int ); int ii_pushback( int ); void ii_term( void ); void ii_unterm( void ); void prnt( int (*ofunct)(char,void *), void *funct_arg, char *format, va_list args ) { char buf[256], *p; vsprintf( buf, format, args ); for ( p = buf; *p; p ++ ) (*ofunct)( *p, funct_arg ); } int on_ferr( void ) { extern int errno ; return errno ; } int ferr( char *fmt, ... ) { va_list args ; va_start( args, fmt ) ; if( fmt ) prnt ( (int(*)(char,void *))fputc, stderr, fmt , args ) ; else perror( va_arg( args, char* ) ) ; va_end( args ) ; exit ( on_ferr() ) ; return 0; } /*------------------------------------------------------------------------- VISIT ROUTINE & MARK-MOVING */ char *ii_text (void) { return sMark ; } int ii_length (void) { return eMark-sMark ; } int ii_lineno (void) { return Lineno ; } char *ii_mark_start(void) { if ( Next >= End_buf ) { ii_fillbuf( Start_buf ); Next = Start_buf; Lineno ++; } Mline = Lineno; eMark = sMark = Next; return sMark; } char *ii_mark_end(void) { Mline =Lineno ; return( eMark =Next ) ; } char *ii_to_mark(void) { Lineno =Mline ; return( Next =eMark ) ; } /*------------------------------------------------------------------------- INPUT ROUTINE */ int ii_advance(void) { return( *Next++ ) ; } /*-------------------------------------------------------------------------*/ int ii_fillbuf( unsigned char *starting_at ) { int got; if( (got =(*Readp)(Inp_file, starting_at, BUFSIZE)) ==-1 ) ferr("Cannot erad input file \n"); End_buf =starting_at + got; return got ; } /*------------------------------------------------------------------------- LOOKAHEAD */ int ii_look( int n ) { uchar *p ; p =Next +(n-1) ; return (p>=End_buf)? EOLN : *p ; } /*------------------------------------------------------------------------- PUSH n CHARACTERS BACK INTO THE INPUT. */ int ii_pushback( int n ) { while( --n >=0 && Next >sMark ) { --Next; } if( Next sMark ) ; } /*-------------------------------------------------------------------------*/ void ii_term(void) { Termchar =*Next ; *Next ='\0' ; } void ii_unterm(void) { if( Termchar ) { *Next =Termchar ; Termchar =0 ; } } /*-------------------------------------------------------------*/ #ifndef YYPRIVATE # define YYPRIVATE static #endif #ifndef NULL # include #endif #ifdef YYDEBUG int yydebug =0 ; # define YY_D(x) if( yydebug ) { x; } else #else # define YY_D(x) #endif typedef unsigned char YY_TTYPE ; #define YYF (( YY_TTYPE )(-1) ) /* Global variables used by the parser. */ char *yytext ; int yyleng ; int yylineno ; FILE *yyout =stdout ; #define output(c) putc(c,yyout) #define ECHO fprintf(yyout,"%s", yytext) #ifndef YYERROR # define YYERROR(t) fprintf(stderr,"%s", t ) #endif #define yymore() yymoreflg=1 #define unput(c) (ii_unput(c), --yyleng ) #define yyless(n) ( ii_unterm(), \ ( yyleng -=ii_pushback(n)? n:yyleng ), \ ii_term() \ ) #define yywrap() 1 /*-------------------------------------------------------------------*/ yylex() { int yymoreflg ; static int yystate =-1 ; int yylastaccept ; int yyprev ; int yynstate ; int yylook ; int yyanchor ; yystate =0 ; yylastaccept =0; yymoreflg =0 ; ii_unterm(); ii_mark_start(); while(1) { while(1) { yylook = ii_look(1); if( yylook == EOLN ) { yynstate = YYF; break; } if( yylook !=EOF ) { yynstate =yy_next( yystate, yylook ); break ; } else { if( yylastaccept ) { yynstate =YYF ; break ; } else if( yywrap() ) { yytext ="" ; yyleng =0 ; return 0 ; } else { ii_advance() ; ii_pushback(1) ; } } } if( yynstate !=YYF ) { YY_D( printf(" Transition from state %d", yystate) ) ; YY_D( printf(" to state %d on <%c>\n", yynstate, yylook ) ); ii_advance(); if( (yyanchor =Yyaccept[ yynstate ]) != 0) { yyprev =yystate; yylastaccept =yynstate; ii_mark_end(); } yystate =yynstate; } else { if( !yylastaccept ) { #ifdef YYBADINP YYERROR("Ignoring bad input\n") ; #endif ii_advance() ; } else { ii_to_mark(); ii_term(); yyleng =ii_length(); yytext =ii_text() ; yylineno =ii_lineno() ; YY_D( printf("Accepting state %d, ", yylastaccept ) ) ; YY_D( printf("line %d: <%s>\n", yylineno, yytext ) ); switch( yylastaccept ) { default: YYERROR( "Internal error, yylex\n") ; break ; } } ii_unterm() ; yylastaccept =0 ; if( !yymoreflg ) { yystate=0 ; ii_mark_start() ; } else { yystate =yyprev ; yymoreflg =0 ; } } } }