|  | 
 | /* Grammar subroutines needed by parser */ | 
 |  | 
 | #include "Python.h" | 
 | #include "pgenheaders.h" | 
 | #include "grammar.h" | 
 | #include "token.h" | 
 |  | 
 | /* Return the DFA for the given type */ | 
 |  | 
 | dfa * | 
 | PyGrammar_FindDFA(grammar *g, register int type) | 
 | { | 
 | 	register dfa *d; | 
 | #if 1 | 
 | 	/* Massive speed-up */ | 
 | 	d = &g->g_dfa[type - NT_OFFSET]; | 
 | 	assert(d->d_type == type); | 
 | 	return d; | 
 | #else | 
 | 	/* Old, slow version */ | 
 | 	register int i; | 
 | 	 | 
 | 	for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) { | 
 | 		if (d->d_type == type) | 
 | 			return d; | 
 | 	} | 
 | 	assert(0); | 
 | 	/* NOTREACHED */ | 
 | #endif | 
 | } | 
 |  | 
 | char * | 
 | PyGrammar_LabelRepr(label *lb) | 
 | { | 
 | 	static char buf[100]; | 
 | 	 | 
 | 	if (lb->lb_type == ENDMARKER) | 
 | 		return "EMPTY"; | 
 | 	else if (ISNONTERMINAL(lb->lb_type)) { | 
 | 		if (lb->lb_str == NULL) { | 
 | 			PyOS_snprintf(buf, sizeof(buf), "NT%d", lb->lb_type); | 
 | 			return buf; | 
 | 		} | 
 | 		else | 
 | 			return lb->lb_str; | 
 | 	} | 
 | 	else { | 
 | 		if (lb->lb_str == NULL) | 
 | 			return _PyParser_TokenNames[lb->lb_type]; | 
 | 		else { | 
 | 			PyOS_snprintf(buf, sizeof(buf), "%.32s(%.32s)", | 
 | 				_PyParser_TokenNames[lb->lb_type], lb->lb_str); | 
 | 			return buf; | 
 | 		} | 
 | 	} | 
 | } |