scan.c

来自「reads a set of C-source files and genera」· C语言 代码 · 共 2,258 行 · 第 1/4 页

C
2,258
字号
       34,   33,   32,   26,   15,   12,   10,    7,    3,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,      241,  241,  241    } ;static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;static char *yy_full_match;static int yy_lp;#define REJECT \{ \*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \yy_cp = yy_full_match; /* restore poss. backed-over text */ \++yy_lp; \goto find_rule; \}static int yy_more_offset = 0;static int yy_prev_more_offset = 0;#define yymore() (yy_more_offset = yy_flex_strlen( yytext ))#define YY_NEED_STRLEN#define YY_MORE_ADJ 0#define YY_RESTORE_YY_MORE_OFFSET \	{ \	yy_more_offset = yy_prev_more_offset; \	yyleng -= yy_more_offset; \	}#ifndef YYLMAX#define YYLMAX 8192#endifchar yytext[YYLMAX];char *yytext_ptr;#line 1 "scan.l"#define INITIAL 0#line 2 "scan.l"/* scan.l -- a lexical scanner for C written in (f)lex *//* * This is derived from a lex-scanner and yacc-parser published on the Net * by Arnold Robbins <arnold@sckeeve.atl.ga.us> May, 1985. * He commented that he got it from Scott Lee <scottlee@mindspring.com> who * wrote that it is based on the current (then - November 12 1984) draft of * the C grammar. * The original lex-scanner is in the public domain. * * I found and fixed a few bugs concerning escaped newlines in literal strings * and cpp-commands. I also changed the indentation to suit my personal * preferences. I moved most C-code to a separate file "scan.h", so it could * be cross-referenced with the cdg-program of which this scanner is a part. * * All input is now copied to file "listfile" but input lines that go beyond * column 80 are broken up at column 80 and a '\\' is output after column 80. * Tabs are expanded into spaces (tabwidth = 8). All output lines are numbered. * All parsed tokens including strings (except preprocessor commands and * comments) are copied in yytext, though the cdg parser never actually uses * that. The scanner does not return for comments and preprocessor commands. * * I ended up not using the original parser (as it was posted on the Net), * because that would require knowing all typedefs and types that may be * defined in include files. What I needed was a parser that would recognize * all identifiers and the way they were apparently used. Modifying the * original parser to work out whether a name is a type or an identifier caused * dozens of shift-reduce and reduce-reduce conflicts and the resulting parser * program refused to parse C. * * I thank Scott Lee for permitting me to use this modified scanner. * * Peter Knoppers <Peter.Knoppers@ct.tudelft.nl> */#include <stdio.h>#include <string.h>#include <ctype.h>#include "y.tab.h"			/* generated with "original" parser */#include "cdg.h"void macro(void);void string(void);void comment (void);void count(void);int identifier (void);/* Macros after this point can all be overridden by user definitions in * section 1. */#ifndef YY_SKIP_YYWRAP#ifdef __cplusplusextern "C" int yywrap YY_PROTO(( void ));#elseextern int yywrap YY_PROTO(( void ));#endif#endif#ifndef YY_NO_UNPUTstatic void yyunput YY_PROTO(( int c, char *buf_ptr ));#endif#ifndef yytext_ptrstatic void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));#endif#ifdef YY_NEED_STRLENstatic int yy_flex_strlen YY_PROTO(( yyconst char * ));#endif#ifndef YY_NO_INPUT#ifdef __cplusplusstatic int yyinput YY_PROTO(( void ));#elsestatic int input YY_PROTO(( void ));#endif#endif#if YY_STACK_USEDstatic int yy_start_stack_ptr = 0;static int yy_start_stack_depth = 0;static int *yy_start_stack = 0;#ifndef YY_NO_PUSH_STATEstatic void yy_push_state YY_PROTO(( int new_state ));#endif#ifndef YY_NO_POP_STATEstatic void yy_pop_state YY_PROTO(( void ));#endif#ifndef YY_NO_TOP_STATEstatic int yy_top_state YY_PROTO(( void ));#endif#else#define YY_NO_PUSH_STATE 1#define YY_NO_POP_STATE 1#define YY_NO_TOP_STATE 1#endif#ifdef YY_MALLOC_DECLYY_MALLOC_DECL#else#if __STDC__#ifndef __cplusplus#include <stdlib.h>#endif#else/* Just try to get by without declaring the routines.  This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */#endif#endif/* Amount of stuff to slurp up with each read. */#ifndef YY_READ_BUF_SIZE#define YY_READ_BUF_SIZE 8192#endif/* Copy whatever the last rule matched to the standard output. */#ifndef ECHO/* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )#endif/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL, * is returned in "result". */#ifndef YY_INPUT#define YY_INPUT(buf,result,max_size) \	if ( yy_current_buffer->yy_is_interactive ) \		{ \		int c = '*', n; \		for ( n = 0; n < max_size && \			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \			buf[n] = (char) c; \		if ( c == '\n' ) \			buf[n++] = (char) c; \		if ( c == EOF && ferror( yyin ) ) \			YY_FATAL_ERROR( "input in flex scanner failed" ); \		result = n; \		} \	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \		  && ferror( yyin ) ) \		YY_FATAL_ERROR( "input in flex scanner failed" );#endif/* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */#ifndef yyterminate#define yyterminate() return YY_NULL#endif/* Number of entries by which start-condition stack grows. */#ifndef YY_START_STACK_INCR#define YY_START_STACK_INCR 25#endif/* Report a fatal error. */#ifndef YY_FATAL_ERROR#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )#endif/* Default declaration of generated scanner - a define so the user can * easily add parameters. */#ifndef YY_DECL#define YY_DECL int yylex YY_PROTO(( void ))#endif/* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */#ifndef YY_USER_ACTION#define YY_USER_ACTION#endif/* Code executed at the end of each rule. */#ifndef YY_BREAK#define YY_BREAK break;#endif#define YY_RULE_SETUP \	YY_USER_ACTIONYY_DECL	{	register yy_state_type yy_current_state;	register char *yy_cp, *yy_bp;	register int yy_act;#line 56 "scan.l"	if ( yy_init )		{		yy_init = 0;#ifdef YY_USER_INIT		YY_USER_INIT;#endif		if ( ! yy_start )			yy_start = 1;	/* first start state */		if ( ! yyin )			yyin = stdin;		if ( ! yyout )			yyout = stdout;		if ( ! yy_current_buffer )			yy_current_buffer =				yy_create_buffer( yyin, YY_BUF_SIZE );		yy_load_buffer_state();		}	while ( 1 )		/* loops until end-of-file is reached */		{		yy_cp = yy_c_buf_p;		/* Support of yytext. */		*yy_cp = yy_hold_char;		/* yy_bp points to the position in yy_ch_buf of the start of		 * the current run.		 */		yy_bp = yy_cp;		yy_current_state = yy_start;		yy_state_ptr = yy_state_buf;		*yy_state_ptr++ = yy_current_state;yy_match:		do			{			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )				{				yy_current_state = (int) yy_def[yy_current_state];				if ( yy_current_state >= 242 )					yy_c = yy_meta[(unsigned int) yy_c];				}			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];			*yy_state_ptr++ = yy_current_state;			++yy_cp;			}		while ( yy_base[yy_current_state] != 340 );yy_find_action:		yy_current_state = *--yy_state_ptr;		yy_lp = yy_accept[yy_current_state];find_rule: /* we branch to this label when backing up */		for ( ; ; ) /* until we find what rule we matched */			{			if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )				{				yy_act = yy_acclist[yy_lp];					{					yy_full_match = yy_cp;					break;					}				}			--yy_cp;			yy_current_state = *--yy_state_ptr;			yy_lp = yy_accept[yy_current_state];			}		YY_DO_BEFORE_ACTION;		if ( yy_act != YY_END_OF_BUFFER )			{			int yyl;			for ( yyl = 0; yyl < yyleng; ++yyl )				if ( yytext[yyl] == '\n' )					++yylineno;			}do_action:	/* This label is used only to access EOF actions. */		switch ( yy_act )	{ /* beginning of action switch */case 1:YY_RULE_SETUP#line 57 "scan.l"{ comment(); }	YY_BREAKcase 2:YY_RULE_SETUP#line 59 "scan.l"{ count(); return(AUTO); }	YY_BREAKcase 3:YY_RULE_SETUP#line 60 "scan.l"{ count(); return(BREAK); }	YY_BREAKcase 4:YY_RULE_SETUP#line 61 "scan.l"{ count(); return(CASE); }	YY_BREAKcase 5:YY_RULE_SETUP#line 62 "scan.l"{ count(); return(CHAR); }	YY_BREAKcase 6:YY_RULE_SETUP#line 63 "scan.l"{ count(); return(CONST); }	YY_BREAKcase 7:YY_RULE_SETUP#line 64 "scan.l"{ count(); return(CONTINUE); }	YY_BREAKcase 8:YY_RULE_SETUP#line 65 "scan.l"{ count(); return(DEFAULT); }	YY_BREAKcase 9:YY_RULE_SETUP#line 66 "scan.l"{ count(); return(DO); }	YY_BREAKcase 10:YY_RULE_SETUP#line 67 "scan.l"{ count(); return(DOUBLE); }	YY_BREAKcase 11:YY_RULE_SETUP#line 68 "scan.l"{ count(); return(ELSE); }	YY_BREAKcase 12:YY_RULE_SETUP#line 69 "scan.l"{ count(); return(ENUM); }	YY_BREAKcase 13:YY_RULE_SETUP#line 70 "scan.l"{ count(); return(EXTERN); }	YY_BREAKcase 14:YY_RULE_SETUP#line 71 "scan.l"{ count(); return(FLOAT); }	YY_BREAKcase 15:YY_RULE_SETUP#line 72 "scan.l"{ count(); return(FOR); }	YY_BREAKcase 16:YY_RULE_SETUP#line 73 "scan.l"{ count(); return(GOTO); }	YY_BREAKcase 17:YY_RULE_SETUP#line 74 "scan.l"{ count(); return(IF); }	YY_BREAKcase 18:YY_RULE_SETUP#line 75 "scan.l"{ count(); return(INT); }	YY_BREAKcase 19:YY_RULE_SETUP#line 76 "scan.l"{ count(); return(LONG); }	YY_BREAKcase 20:YY_RULE_SETUP#line 77 "scan.l"{ count(); return(REGISTER); }	YY_BREAKcase 21:YY_RULE_SETUP#line 78 "scan.l"{ count(); return(RETURN); }	YY_BREAKcase 22:YY_RULE_SETUP#line 79 "scan.l"{ count(); return(SHORT); }	YY_BREAKcase 23:YY_RULE_SETUP#line 80 "scan.l"{ count(); return(SIGNED); }	YY_BREAKcase 24:YY_RULE_SETUP#line 81 "scan.l"{ count(); return(SIZEOF); }	YY_BREAKcase 25:YY_RULE_SETUP#line 82 "scan.l"{ count(); return(STATIC); }	YY_BREAKcase 26:YY_RULE_SETUP#line 83 "scan.l"{ count(); return(STRUCT); }	YY_BREAKcase 27:YY_RULE_SETUP#line 84 "scan.l"{ count(); return(SWITCH); }	YY_BREAKcase 28:YY_RULE_SETUP#line 85 "scan.l"{ count(); return(TYPEDEF); }	YY_BREAKcase 29:YY_RULE_SETUP#line 86 "scan.l"{ count(); return(UNION); }	YY_BREAKcase 30:YY_RULE_SETUP#line 87 "scan.l"{ count(); return(UNSIGNED); }	YY_BREAKcase 31:YY_RULE_SETUP#line 88 "scan.l"{ count(); return(VOID); }	YY_BREAKcase 32:YY_RULE_SETUP#line 89 "scan.l"{ count(); return(VOLATILE); }	YY_BREAKcase 33:YY_RULE_SETUP#line 90 "scan.l"{ count(); return(WHILE); }	YY_BREAKcase 34:YY_RULE_SETUP#line 92 "scan.l"{ count(); return(identifier()); }	YY_BREAKcase 35:YY_RULE_SETUP#line 94 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 36:YY_RULE_SETUP#line 95 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 37:YY_RULE_SETUP#line 96 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 38:YY_RULE_SETUP#line 97 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 39:YY_RULE_SETUP#line 98 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 40:YY_RULE_SETUP#line 99 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 41:YY_RULE_SETUP#line 100 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 42:YY_RULE_SETUP#line 102 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 43:YY_RULE_SETUP#line 103 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 44:YY_RULE_SETUP#line 104 "scan.l"{ count(); return(CONSTANT); }	YY_BREAKcase 45:YY_RULE_SETUP#line 106 "scan.l"{ string(); return(STRING_LITERAL); }	YY_BREAKcase 46:YY_RULE_SETUP#line 108 "scan.l"{ macro(); }	YY_BREAKcase 47:YY_RULE_SETUP#line 110 "scan.l"{ count(); return(ELIPSIS); }	YY_BREAKcase 48:YY_RULE_SETUP#line 112 "scan.l"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?