⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
			C_long_decl : C_short_decl,		"yy_nxt", tblend + 1 );	for ( i = 1; i <= tblend; ++i )		{		if ( nxt[i] == 0 || chk[i] == 0 )			nxt[i] = jamstate;	/* new state is the JAM state */		mkdata( nxt[i] );		}	dataend();	printf( (total_states >= MAX_SHORT || long_align) ?			C_long_decl : C_short_decl,		"yy_chk", tblend + 1 );	for ( i = 1; i <= tblend; ++i )		{		if ( chk[i] == 0 )			++nummt;		mkdata( chk[i] );		}	dataend();	}/* Write out a formatted string (with a secondary string argument) at the * current indentation level, adding a final newline. */void indent_put2s( fmt, arg )char fmt[], arg[];	{	do_indent();	printf( fmt, arg );	putchar( '\n' );	}/* Write out a string at the current indentation level, adding a final * newline. */void indent_puts( str )char str[];	{	do_indent();	puts( str );	}/* make_tables - generate transition tables and finishes generating output file */void make_tables()	{	register int i;	int did_eof_rule = false;	skelout();	/* First, take care of YY_DO_BEFORE_ACTION depending on yymore	 * being used.	 */	set_indent( 1 );	if ( yymore_used )		{		indent_puts( "yytext_ptr -= yy_more_len; \\" );		indent_puts( "yyleng = yy_cp - yytext_ptr; \\" );		}	else		indent_puts( "yyleng = yy_cp - yy_bp; \\" );	/* Now also deal with copying yytext_ptr to yytext if needed. */	skelout();	if ( yytext_is_array )		{		indent_puts( "if ( yyleng >= YYLMAX ) \\" );		indent_up();		indent_puts(		"YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\" );		indent_down();		indent_puts( "yy_flex_strcpy( yytext, yytext_ptr ); \\" );		}	set_indent( 0 );	skelout();	printf( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 );	if ( fullspd )		{		/* Need to define the transet type as a size large		 * enough to hold the biggest offset.		 */		int total_table_size = tblend + numecs + 1;		char *trans_offset_type =			(total_table_size >= MAX_SHORT || long_align) ?				"long" : "short";		set_indent( 0 );		indent_puts( "struct yy_trans_info" );		indent_up();		indent_puts( "{" ); 	/* } for vi */		if ( long_align )			indent_puts( "long yy_verify;" );		else			indent_puts( "short yy_verify;" );		/* In cases where its sister yy_verify *is* a "yes, there is		 * a transition", yy_nxt is the offset (in records) to the		 * next state.  In most cases where there is no transition,		 * the value of yy_nxt is irrelevant.  If yy_nxt is the -1th		 * record of a state, though, then yy_nxt is the action number		 * for that state.		 */		indent_put2s( "%s yy_nxt;", trans_offset_type );		indent_puts( "};" );		indent_down();		}	if ( fullspd )		genctbl();	else if ( fulltbl )		genftbl();	else		gentabs();	/* Definitions for backing up.  We don't need them if REJECT	 * is being used because then we use an alternative backin-up	 * technique instead.	 */	if ( num_backing_up > 0 && ! reject )		{		if ( ! C_plus_plus )			{			indent_puts(			"static yy_state_type yy_last_accepting_state;" );			indent_puts(				"static char *yy_last_accepting_cpos;\n" );			}		}	if ( nultrans )		{		printf( C_state_decl, "yy_NUL_trans", lastdfa + 1 );		for ( i = 1; i <= lastdfa; ++i )			{			if ( fullspd )				printf( "    &yy_transition[%d],\n", base[i] );			else				mkdata( nultrans[i] );			}		dataend();		}	if ( ddebug )		{ /* Spit out table mapping rules to line numbers. */		indent_puts( "extern int yy_flex_debug;" );		indent_puts( "int yy_flex_debug = 1;\n" );		printf( long_align ? C_long_decl : C_short_decl,			"yy_rule_linenum", num_rules );		for ( i = 1; i < num_rules; ++i )			mkdata( rule_linenum[i] );		dataend();		}	if ( reject )		{		/* Declare state buffer variables. */		if ( ! C_plus_plus )			{			puts(	"static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" );			puts( "static char *yy_full_match;" );			puts( "static int yy_lp;" );			}		if ( variable_trailing_context_rules )			{			if ( ! C_plus_plus )				{				puts(				"static int yy_looking_for_trail_begin = 0;" );				puts( "static int yy_full_lp;" );				puts( "static int *yy_full_state;" );				}			printf( "#define YY_TRAILING_MASK 0x%x\n",				(unsigned int) YY_TRAILING_MASK );			printf( "#define YY_TRAILING_HEAD_MASK 0x%x\n",				(unsigned int) YY_TRAILING_HEAD_MASK );			}		puts( "#define REJECT \\" );		puts( "{ \\" );		/* } for vi */		puts(	"*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" );		puts(	"yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" );		if ( variable_trailing_context_rules )			{			puts(		"yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" );			puts(		"yy_state_ptr = yy_full_state; /* restore orig. state */ \\" );			puts(	"yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" );			}		puts( "++yy_lp; \\" );		puts( "goto find_rule; \\" );		/* { for vi */		puts( "}" );		}	else		{		puts(		"/* The intent behind this definition is that it'll catch" );		puts( " * any uses of REJECT which lex missed." );		puts( " */" );		puts( "#define REJECT reject_used_but_not_detected" );		}	if ( yymore_used )		{		if ( ! C_plus_plus )			{			indent_puts( "static int yy_more_flag = 0;" );			indent_puts( "static int yy_more_len = 0;" );			}		indent_puts( "#define yymore() (yy_more_flag = 1)" );		indent_puts( "#define YY_MORE_ADJ yy_more_len" );		}	else		{		indent_puts( "#define yymore() yymore_used_but_not_detected" );		indent_puts( "#define YY_MORE_ADJ 0" );		}	if ( ! C_plus_plus )		{		if ( yytext_is_array )			{			puts( "#ifndef YYLMAX" );			puts( "#define YYLMAX 8192" );			puts( "#endif\n" );			puts( "char yytext[YYLMAX];" );			puts( "char *yytext_ptr;" );			}		else			puts( "char *yytext;" );		}	fputs( &action_array[defs1_offset], stdout );	skelout();	if ( ! C_plus_plus )		{		if ( use_read )			{			printf("\tif ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\\n" );			printf(		"\t\tYY_FATAL_ERROR( \"input in lex scanner failed\" );\n" );			}		else			{			printf(			"\tif ( yy_current_buffer->yy_is_interactive ) \\\n" );			printf( "\t\t{ \\\n" );			printf( "\t\tint c = getc( yyin ); \\\n" );			printf( "\t\tresult = c == EOF ? 0 : 1; \\\n" );			printf( "\t\tbuf[0] = (char) c; \\\n" );			printf( "\t\t} \\\n" );			printf(	"\telse if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \\\n" );			printf( "\t\t  && ferror( yyin ) ) \\\n" );			printf(		"\t\tYY_FATAL_ERROR( \"input in lex scanner failed\" );\n" );			}		}	skelout();	/* Copy prolog to output file. */	fputs( &action_array[prolog_offset], stdout );	skelout();	set_indent( 2 );	if ( yymore_used )		{		indent_puts( "yy_more_len = 0;" );		indent_puts( "if ( yy_more_flag )" );		indent_up();		indent_puts( "{" );		indent_puts( "yy_more_len = yyleng;" );		indent_puts( "yy_more_flag = 0;" );		indent_puts( "}" );		indent_down();		}	skelout();	gen_start_state();	/* Note, don't use any indentation. */	puts( "yy_match:" );	gen_next_match();	skelout();	set_indent( 2 );	gen_find_action();	skelout();	if ( lex_compat )		{		indent_puts( "if ( yy_act != YY_END_OF_BUFFER )" );		indent_up();		indent_puts( "{" );		indent_puts( "int yyl;" );		indent_puts( "for ( yyl = 0; yyl < yyleng; ++yyl )" );		indent_up();		indent_puts( "if ( yytext[yyl] == '\\n' )" );		indent_up();		indent_puts( "++yylineno;" );		indent_down();		indent_down();		indent_puts( "}" );		indent_down();		}	skelout();	if ( ddebug )		{		indent_puts( "if ( yy_flex_debug )" );		indent_up();		indent_puts( "{" );		indent_puts( "if ( yy_act == 0 )" );		indent_up();		indent_puts(			"fprintf( stderr, \"--scanner backing up\\n\" );" );		indent_down();		do_indent();		printf( "else if ( yy_act < %d )\n", num_rules );		indent_up();		indent_puts(	"fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," );		indent_puts( "         yy_rule_linenum[yy_act], yytext );" );		indent_down();		do_indent();		printf( "else if ( yy_act == %d )\n", num_rules );		indent_up();		indent_puts(	"fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," );		indent_puts( "         yytext );" );		indent_down();		do_indent();		printf( "else if ( yy_act == %d )\n", num_rules + 1 );		indent_up();		indent_puts(	"fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" );		indent_down();		do_indent();		printf( "else\n" );		indent_up();		indent_puts(	"fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );" );		indent_down();		indent_puts( "}" );		indent_down();		}	/* Copy actions to output file. */	skelout();	indent_up();	gen_bu_action();	fputs( &action_array[action_offset], stdout );	/* generate cases for any missing EOF rules */	for ( i = 1; i <= lastsc; ++i )		if ( ! sceof[i] )			{			do_indent();			printf( "case YY_STATE_EOF(%s):\n", scname[i] );			did_eof_rule = true;			}	if ( did_eof_rule )		{		indent_up();		indent_puts( "yyterminate();" );		indent_down();		}	/* Generate code for handling NUL's, if needed. */	/* First, deal with backing up and setting up yy_cp if the scanner	 * finds that it should JAM on the NUL>	 */	skelout();	set_indent( 7 );	if ( fullspd || fulltbl )		indent_puts( "yy_cp = yy_c_buf_p;" );	else		{ /* compressed table */		if ( ! reject && ! interactive )			{			/* Do the guaranteed-needed backing up to figure			 * out the match.			 */			indent_puts( "yy_cp = yy_last_accepting_cpos;" );			indent_puts(				"yy_current_state = yy_last_accepting_state;" );			}		}	/* Generate code for yy_get_previous_state(). */	set_indent( 1 );	skelout();	if ( bol_needed )		indent_puts( "register char *yy_bp = yytext_ptr;\n" );	gen_start_state();	set_indent( 2 );	skelout();	gen_next_state( true );	set_indent( 1 );	skelout();	gen_NUL_trans();	skelout();	if ( lex_compat )		{ /* update yylineno inside of unput() */		indent_puts( "if ( c == '\\n' )" );		indent_up();		indent_puts( "--yylineno;" );		indent_down();		}	skelout();	/* Copy remainder of input to output. */	line_directive_out( stdout );	if ( sectnum == 3 )		(void) flexscan(); /* copy remainder of input to output */	}

⌨️ 快捷键说明

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