| /* 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; | |
| } | |
| } | |
| } |