/* Grammar subroutines needed by parser */ #include "Python.h" #include "grammar.h" #include "token.h" /* Return the DFA for the given type */ const dfa * PyGrammar_FindDFA(grammar *g, int type) { /* Massive speed-up */ const dfa *d = &g->g_dfa[type - NT_OFFSET]; assert(d->d_type == type); return d; } 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 grammar label"); return NULL; } }