home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Parser / grammar1.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  1001 b   |  58 lines

  1.  
  2. /* Grammar subroutines needed by parser */
  3.  
  4. #include "pgenheaders.h"
  5. #include "assert.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, register int type)
  13. {
  14.     register 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.     register 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. 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.             sprintf(buf, "NT%d", lb->lb_type);
  43.             return buf;
  44.         }
  45.         else
  46.             return lb->lb_str;
  47.     }
  48.     else {
  49.         if (lb->lb_str == NULL)
  50.             return _PyParser_TokenNames[lb->lb_type];
  51.         else {
  52.             sprintf(buf, "%.32s(%.32s)",
  53.                 _PyParser_TokenNames[lb->lb_type], lb->lb_str);
  54.             return buf;
  55.         }
  56.     }
  57. }
  58.