|  | 
 | /* 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, int type) | 
 | { | 
 |     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 */ | 
 |     int i; | 
 |  | 
 |     for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) { | 
 |         if (d->d_type == type) | 
 |             return d; | 
 |     } | 
 |     Py_UNREACHABLE(); | 
 | #endif | 
 | } | 
 |  | 
 | const 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_type < N_TOKENS) { | 
 |         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; | 
 |         } | 
 |     } | 
 |     else { | 
 |         Py_FatalError("invalid label"); | 
 |         return NULL; | 
 |     } | 
 | } |