dlg_p.g

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

G
550
字号
		| L_PAR reg_expr R_PAR			<<				($$.l)->trans[0] = $2.l;				($2.r)->trans[1] = $$.r;			>>		| L_BRACE reg_expr R_BRACE			<<				($$.l)->trans[0] = $2.l;				($$.l)->trans[1] = $$.r;				($2.r)->trans[1] = $$.r;			>>		| atom			<<				($$.l)->trans[0] = $$.r;				($$.l)->label = set_dup($1.label);				set_orin(&used_chars,($$.l)->label);			>>		;atom_list	: << set_free($$.label); >>			(near_atom <<set_orin(&($$.label),$1.label);>>)*		;near_atom	: << register int i;		     register int i_prime;		  >>		  anychar			<<$$.letter=$1.letter; $$.label=set_of($1.letter);			i_prime = $1.letter + MIN_CHAR;			if (case_insensitive && islower(i_prime))				set_orel(toupper(i_prime)-MIN_CHAR,					&($$.label));			if (case_insensitive && isupper(i_prime))	 			set_orel(tolower(i_prime)-MIN_CHAR,					&($$.label));			>>			{ RANGE anychar				<< if (case_insensitive){					i_prime = $$.letter+MIN_CHAR;					$$.letter = (islower(i_prime) ?						toupper(i_prime) : i_prime)-MIN_CHAR;					i_prime = $2.letter+MIN_CHAR;					$2.letter = (islower(i_prime) ?						toupper(i_prime) : i_prime)-MIN_CHAR;				   }				   /* check to see if range okay */				   if ($$.letter > $2.letter){					  error("invalid range  ", zzline);				   }				   for (i=$$.letter; i<= (int)$2.letter; ++i){					set_orel(i,&($$.label));					i_prime = i+MIN_CHAR;					if (case_insensitive && islower(i_prime))						set_orel(toupper(i_prime)-MIN_CHAR,							&($$.label));					if (case_insensitive && isupper(i_prime))		 				set_orel(tolower(i_prime)-MIN_CHAR,							&($$.label));					}				>>			}		;atom		: << register int i_prime;>>		  anychar		  <<$$.label = set_of($1.letter);		    i_prime = $1.letter + MIN_CHAR;		    if (case_insensitive && islower(i_prime))			set_orel(toupper(i_prime)-MIN_CHAR,				&($$.label));		    if (case_insensitive && isupper(i_prime))	 		set_orel(tolower(i_prime)-MIN_CHAR,				&($$.label));		  >>		;anychar		: REGCHAR	<<$$.letter = $1.letter - MIN_CHAR;>>		| OCTAL_VALUE	<<$$.letter = $1.letter - MIN_CHAR;>>		| HEX_VALUE	<<$$.letter = $1.letter - MIN_CHAR;>>		| DEC_VALUE	<<$$.letter = $1.letter - MIN_CHAR;>>		| TAB		<<$$.letter = $1.letter - MIN_CHAR;>>		| NL		<<$$.letter = $1.letter - MIN_CHAR;>>		| CR		<<$$.letter = $1.letter - MIN_CHAR;>>		| BS		<<$$.letter = $1.letter - MIN_CHAR;>>		| LIT		<<$$.letter = $1.letter - MIN_CHAR;>>		/* NOTE: LEX_EOF is ALWAYS shifted to 0 = MIN_CHAR - MIN_CHAR*/		| L_EOF		<<$$.letter = 0;>>		;<</* empty action */>>#lexclass ACT#token "@"	<< error("unterminated action", zzline); zzmode(START); >>#token ACTION "\>\>"		<< if (func_action) fprintf(OUT,"}\n\n");		   zzmode(START);/* MR1									    *//* MR1  11-Apr-97	Provide mechanism for inserting code into DLG class *//* MR1				via <<%%lexmember ...>>			    *//* MR1			This is a consequence of not saving actions         *//* MR1									    *//* MR1 */	   parserClass=0;		/* MR1 */	   lexPrefix=0;/* MR1 */	   lexAction=0;/* MR1 */	   lexMember=0;		>>#token "\>"		<< xxputc(zzlextext[0]); zzskip(); >>		/* MR1 */#token "\\\>"		<< xxputc('>'); zzskip(); >>			/* MR1 */#token "\\"		<< xxputc('\\'); zzskip(); >>			/* MR1 */#token "\n"		<< xxputc(zzlextext[0]); ++zzline; zzskip(); >>	/* MR1 */#token "/\*"		<< zzmode(ACTION_COMMENTS);			/* MR1 */			   xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */			>>						/* MR1 */#token "//"		<< zzmode(ACTION_CPP_COMMENTS);			/* MR1 */			   xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */			>>						/* MR1 */#token "~[]"		<< xxputc(zzlextext[0]); zzskip(); >>		/* MR1 */									/* MR1 */#lexclass ACTION_COMMENTS						/* MR1 */#token "\*/"		<< zzmode(ACT);					/* MR1 */			   xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */			>>						/* MR1 */#token "[\n\r]"		<< zzline++; xxputc(zzlextext[0]); zzskip();>>	/* MR1 */#token "~[]"		<< xxputc(zzlextext[0]); zzskip();>>		/* MR1 */									/* MR1 */#lexclass ACTION_CPP_COMMENTS						/* MR1 */#token "[\n\r]"		<< zzmode(ACT); zzline++;			/* MR1 */			   xxprintf("%s", &(zzlextext[0])); zzskip();	/* MR1 */			>>						/* MR1 */#token "~[]"		<< xxputc(zzlextext[0]); zzskip();>>		/* MR1 */<</* adds a new nfa to the binary tree and returns a pointer to it */nfa_node *new_nfa_node(){	register nfa_node *t;	static int nfa_size=0;	/* elements nfa_array[] can hold */	++nfa_allocated;	if (nfa_size<=nfa_allocated){		/* need to redo array */		if (!nfa_array){			/* need some to do inital allocation */			nfa_size=nfa_allocated+NFA_MIN;			nfa_array=(nfa_node **) malloc(sizeof(nfa_node*)*				nfa_size);		}else{			/* need more space */			nfa_size=2*(nfa_allocated+1);			nfa_array=(nfa_node **) realloc(nfa_array,				sizeof(nfa_node*)*nfa_size);		}	}	/* fill out entry in array */	t = (nfa_node*) malloc(sizeof(nfa_node));	nfa_array[nfa_allocated] = t;	*t = nfa_model_node;	t->node_no = nfa_allocated;	return t;}/* initialize the model node used to fill in newly made nfa_nodes */voidmake_nfa_model_node(){	nfa_model_node.node_no = -1; /* impossible value for real nfa node */	nfa_model_node.nfa_set = 0;	nfa_model_node.accept = 0;   /* error state default*/	nfa_model_node.trans[0] = NULL;	nfa_model_node.trans[1] = NULL;	nfa_model_node.label = empty;}>><<#ifdef DEBUG/* print out the pointer value and the node_number */fprint_dfa_pair(f, p)FILE *f;nfa_node *p;{	if (p){		fprintf(f, "%x (%d)", p, p->node_no);	}else{		fprintf(f, "(nil)");	}}/* print out interest information on a set */fprint_set(f,s)FILE *f;set s;{	unsigned int *x;	fprintf(f, "n = %d,", s.n);	if (s.setword){		fprintf(f, "setword = %x,   ", s.setword);		/* print out all the elements in the set */		x = set_pdq(s);		while (*x!=nil){			fprintf(f, "%d ", *x);			++x;		}	}else{		fprintf(f, "setword = (nil)");	}}/* code to be able to dump out the nfas	return 0 if okay dump	return 1 if screwed up */int dump_nfas(first_node, last_node)int first_node;int last_node;{	register int i;	nfa_node *t;	for (i=first_node; i<=last_node; ++i){		t = NFA(i);		if (!t) break;		fprintf(stderr, "nfa_node %d {\n", t->node_no);		fprintf(stderr, "\n\tnfa_set = %d\n", t->nfa_set);		fprintf(stderr, "\taccept\t=\t%d\n", t->accept);		fprintf(stderr, "\ttrans\t=\t(");		fprint_dfa_pair(stderr, t->trans[0]);		fprintf(stderr, ",");		fprint_dfa_pair(stderr, t->trans[1]);		fprintf(stderr, ")\n");		fprintf(stderr, "\tlabel\t=\t{ ");		fprint_set(stderr, t->label);		fprintf(stderr, "\t}\n");		fprintf(stderr, "}\n\n");	}	return 0;}#endif>><</* DLG-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */void#ifdef __USE_PROTOSzzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text)#elsezzsyn(text, tok, egroup, eset, etok, k, bad_text)char *text, *egroup, *bad_text;int tok;int etok;int k;SetWordType *eset;#endif{	fprintf(stderr, ErrHdr, file_str[0]!=NULL?file_str[0]:"stdin", zzline);	fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text);	if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}	if ( k==1 ) fprintf(stderr, " missing");	else	{		fprintf(stderr, "; \"%s\" not", bad_text);		if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");	}	if ( zzset_deg(eset)>0 ) zzedecode(eset);	else fprintf(stderr, " %s", zztokens[etok]);	if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup);	fprintf(stderr, "\n");}>>

⌨️ 快捷键说明

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