Home | History | Annotate | Download | only in Parser
      1 
      2 /* Grammar subroutines needed by parser */
      3 
      4 #include "Python.h"
      5 #include "pgenheaders.h"
      6 #include "grammar.h"
      7 #include "token.h"
      8 
      9 /* Return the DFA for the given type */
     10 
     11 dfa *
     12 PyGrammar_FindDFA(grammar *g, int type)
     13 {
     14     dfa *d;
     15 #if 1
     16     /* Massive speed-up */
     17     d = &g->g_dfa[type - NT_OFFSET];
     18     assert(d->d_type == type);
     19     return d;
     20 #else
     21     /* Old, slow version */
     22     int i;
     23 
     24     for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
     25         if (d->d_type == type)
     26             return d;
     27     }
     28     assert(0);
     29     /* NOTREACHED */
     30 #endif
     31 }
     32 
     33 const char *
     34 PyGrammar_LabelRepr(label *lb)
     35 {
     36     static char buf[100];
     37 
     38     if (lb->lb_type == ENDMARKER)
     39         return "EMPTY";
     40     else if (ISNONTERMINAL(lb->lb_type)) {
     41         if (lb->lb_str == NULL) {
     42             PyOS_snprintf(buf, sizeof(buf), "NT%d", lb->lb_type);
     43             return buf;
     44         }
     45         else
     46             return lb->lb_str;
     47     }
     48     else if (lb->lb_type < N_TOKENS) {
     49         if (lb->lb_str == NULL)
     50             return _PyParser_TokenNames[lb->lb_type];
     51         else {
     52             PyOS_snprintf(buf, sizeof(buf), "%.32s(%.32s)",
     53                 _PyParser_TokenNames[lb->lb_type], lb->lb_str);
     54             return buf;
     55         }
     56     }
     57     else {
     58         Py_FatalError("invalid label");
     59         return NULL;
     60     }
     61 }
     62