output.c

来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C语言 代码 · 共 743 行 · 第 1/2 页

C
743
字号
		gen_cpp?ClassName("::"):"",(i-1), (classes+1));#else	fprintf(OUT, "static DfaState st%d[%d] = {\n  ", (i-1), classes);#endif	items_on_line = MAX_ON_LINE;	for(j=0; j<classes; ++j){		DAWDLE;		trans = DFA(i)->trans[j];		if (trans == NIL_INDEX)			trans = dfa_allocated+1;		/* all of DFA moved down one in array */		fprintf(OUT, "%d", trans-1);		fprintf(OUT, ", ");		if (!(--items_on_line)){			fprintf(OUT, "\n  ");			items_on_line = MAX_ON_LINE;		}	}#if 1	/* put in jump to error state */	fprintf(OUT, "%d\n};\n\n", dfa_allocated);#else	fprintf(OUT, "\n};\n\n");#endif}void p_dfa_table(){	register int	i;	fprintf(OUT, "\n%sDfaState *%sdfa[%d] = {\n",		gen_cpp?ClassName("::"):"",gen_cpp?ClassName("::"):"", dfa_allocated);	for (i=0; i<(dfa_allocated-1); ++i){		fprintf(OUT, "\tst%d,\n", i);	}	fprintf(OUT, "\tst%d\n", i);	fprintf(OUT, "};\n\n");}void p_accept_table(){	register int	i = 1;	register int	items_on_line = 0;	int		true_interactive = TRUE;	/* make sure element for one past (zzerraction) -WEC 12/16/92 */	fprintf(OUT,"\n%sDfaState %saccepts[%d] = {\n  ",			gen_cpp?ClassName("::"):"",			gen_cpp?ClassName("::"):"",			dfa_allocated+1);	/* don't do anything if no dfa nodes */	if (i>dfa_allocated) goto skip_accepts;	while (TRUE){		int accept;		set accept_set;		set nfa_states;		unsigned int *t, *nfa_i;		unsigned int *q, *regular_expr;		accept_set = empty;		nfa_states = DFA(i)->nfa_states;		t = nfa_i = set_pdq(nfa_states);		/* NOTE: picks lowest accept because accepts monotonic	*/		/*	with respect to nfa node numbers and set_pdq	*/		/*	returns in that order				*/		while((*nfa_i != nil) && (!(accept = NFA(*nfa_i)->accept))){			nfa_i++;		}		/* figure out if more than one accept state there */		if (warn_ambig ){			set_orel(accept, &accept_set);			while(*nfa_i != nil){				set_orel(NFA(*nfa_i)->accept, &accept_set);				nfa_i++;			}			/* remove error action from consideration */			set_rm(0, accept_set);			if( set_deg(accept_set)>1){				fprintf(stderr, "dlg warning: ambiguous regular expression ");				q = regular_expr = set_pdq(accept_set);				while(*regular_expr != nil){					fprintf(stderr," %d ", *regular_expr);					++regular_expr;				}				fprintf(stderr, "\n");				free(q);			}		}		if ((DFA(i)->alternatives) && (accept != 0)){			true_interactive = FALSE;		}		fprintf(OUT, "%d, ", accept);		/* free up memory before we "break" below -ATG 4/6/95 */		free(t);		set_free(accept_set);		if ((++i)>dfa_allocated)			break;		if ((++items_on_line)>=MAX_ON_LINE){			fprintf(OUT,"\n  ");			items_on_line = 0;		}/*		free(t);		set_free(accept_set);*/	}	/* make sure element for one past (zzerraction) -WEC 12/16/92 */skip_accepts:	fprintf(OUT, "0\n};\n\n");}void p_action_table(){	register int	i;	char* theClassName = ClassName("");	if ( gen_cpp )		fprintf(OUT, "Ptr%sMemberFunc %s::actions[%d] = {\n", theClassName,					theClassName, action_no+1);	else		fprintf(OUT, "void (*actions[%d])() = {\n", action_no+1);	if ( gen_cpp )/*		fprintf(OUT, "\t(Ptr%sMemberFunc)&%s::erraction,\n", theClassName, theClassName);*/		fprintf(OUT, "\t&%s::erraction,\n", theClassName);	else		fprintf(OUT, "\tzzerraction,\n");	for (i=1; i<action_no; ++i) {		if ( gen_cpp )/*			fprintf(OUT,"\t(Ptr%sMemberFunc)&%s::act%d,\n", theClassName, theClassName, i);*/			fprintf(OUT,"\t&%s::act%d,\n", theClassName, i);		else			fprintf(OUT,"\tact%d,\n", i);		DAWDLE;	}	if ( gen_cpp )/*		fprintf(OUT,"\t(Ptr%sMemberFunc)&%s::act%d\n", theClassName, theClassName, i);*/		fprintf(OUT,"\t&%s::act%d\n", theClassName, i);	else		fprintf(OUT,"\tact%d\n", i);	fprintf(OUT, "};\n\n");}void p_shift_table(m)						/* MR1 */int m;{	register int	i = 0, j;	register int	items_on_line = 0;	fprintf(OUT, "%s unsigned char %sshift%d[%d] = {\n  ",		gen_cpp?"":"static",		gen_cpp?ClassName("::"):"", m, CHAR_RANGE);	while (TRUE){		/* find which partition character i is in */		for (j=0; j<dfa_class_nop[mode_counter]; ++j){			if (set_el(i,class_sets[j]))				break;			}		fprintf(OUT,"%d",j);		if ((++i)>=CHAR_RANGE)			break;		fprintf(OUT,", ");		if ((++items_on_line)>=MAX_ON_LINE){			fprintf(OUT,"\n  ");			items_on_line = 0;			}		}	fprintf(OUT, "\n};\n\n");}void p_base_table(){	register int m;	fprintf(OUT, "%sDfaState %sdfa_base[] = {\n",			gen_cpp?ClassName("::"):"static ",			gen_cpp?ClassName("::"):"");	for(m=0; m<(mode_counter-1); ++m)		fprintf(OUT, "\t%d,\n", dfa_basep[m]-1);	fprintf(OUT, "\t%d\n};\n\n", dfa_basep[m]-1);}void p_class_table()						/* MR1 */{#if 0	register int m;	fprintf(OUT,"%s int %sdfa_class_no[] = {\n",			gen_cpp?"":"static",			gen_cpp?ClassName("::"):"");	for(m=0; m<(mode_counter-1); ++m)		fprintf(OUT,"\t%d,\n", dfa_class_nop[m]);	fprintf(OUT,"\t%d\n};\n\n", dfa_class_nop[m]);#endif}void p_bshift_table()						/* MR1 */{	register int m;	fprintf(OUT,"%s unsigned char *%sb_class_no[] = {\n",		gen_cpp?"":"static",		gen_cpp?ClassName("::"):"");	for(m=0; m<(mode_counter-1); ++m)		fprintf(OUT, "\tshift%d,\n", m);	fprintf(OUT, "\tshift%d\n};\n\n", m);}void p_alternative_table()					/* MR1 */{	register int i;	if ( !gen_cpp ) fprintf(OUT, "#define ZZINTERACTIVE\n\n");	if ( gen_cpp )		fprintf(OUT, "DLGChar %salternatives[%sDfaStates+1] = {\n",				ClassName("::"),				ClassName("::"));	else		fprintf(OUT, "static %s zzalternatives[DfaStates+1] = {\n",				minsize(dfa_allocated));	for(i=1; i<=dfa_allocated; ++i)		fprintf(OUT, "\t%d,\n", DFA(i)->alternatives);	fprintf(OUT, "/* must have 0 for zzalternatives[DfaStates] */\n");	fprintf(OUT, "\t0\n};\n\n");}void p_mode_def(s,m)					/* MR1 */char *s;int m;{	if ( gen_cpp )	{		mode_name[cur_mode] = mystrdup(s);		mode_number[cur_mode] = m;		cur_mode++;	}	else		fprintf(mode_stream, "#define %s %d\n", s, m);}char *ClassName(suffix)char *suffix;{	static char buf[200];	extern char *class_name;	sprintf(buf, "%s%s", class_name, suffix);	return buf;}#ifdef DEBUG/* print out a particular nfa node that is pointed to by p */p_nfa_node(p)nfa_node *p;{	 register nfa_node *t;	if (p != NIL_INDEX){		printf("NFA state : %d\naccept state : %d\n",			NFA_NO(p),p->accept);		if (p->trans[0] != NIL_INDEX){			printf("trans[0] => %d on ", NFA_NO(p->trans[0]));			p_set(p->label);			printf("\n");			}		else			printf("trans[0] => nil\n");		if (p->trans[1] != NIL_INDEX)			printf("trans[1] => %d on epsilon\n",				NFA_NO(p->trans[1]));		else			printf("trans[1] => nil\n");		printf("\n");		}}#endif#ifdef  DEBUG/* code to print out special structures when using a debugger */p_nfa(p)nfa_node *p;	/* state number also index into array */{/* each node has a marker on it so it only gets printed once */	operation_no++; /* get new number */	s_p_nfa(p);}s_p_nfa(p)nfa_node *p;	/* state number also index into array */{	if ((p != NIL_INDEX) && (p->nfa_set != operation_no)){		/* so it is only printed once */		p->nfa_set = operation_no;		p_nfa_node(p);		s_p_nfa(p->trans[0]);		s_p_nfa(p->trans[1]);		}}p_dfa_node(p)dfa_node *p;{	int i;	if (p != NIL_INDEX){		printf("DFA state :%d\n",NFA_NO(p));		if (p->done)			printf("done\n");		else			printf("undone\n");		printf("from nfa states : ");		p_set(p->nfa_states);		printf("\n");		/* NOTE: trans arcs stored as ints rather than pointer*/		for (i=0; i<class_no; i++){			printf("%d ",p->trans[i]);			}		printf("\n\n");		}}p_dfa(){/* prints out all the dfa nodes actually allocated */	int i;	for (i = 1; i<=dfa_allocated; i++)		p_dfa_node(NFA(i));}/* print out numbers in the set label */p_set(label)set label;{	unsigned *t, *e;	if (set_nil(label)){		printf("epsilon\n");	}else{		t = e = set_pdq(label);		while(*e != nil){			printf("%d ", (*e+MIN_CHAR));			e++;		}		printf("\n");		free(t);	}	}#endif

⌨️ 快捷键说明

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