• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *
PyGrammar_FindDFA(grammar * g,int type)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 *
PyGrammar_LabelRepr(label * lb)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