blob: 16821f4639ac68f427be1d2a457516edc89b7de0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Grammar subroutines needed by parser */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "assert.h"
15#include "grammar.h"
16#include "token.h"
17
18/* Return the DFA for the given type */
19
20dfa *
Thomas Wouters23c9e002000-07-22 19:20:54 +000021PyGrammar_FindDFA(grammar *g, register int type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 register dfa *d;
Guido van Rossum6522eb01994-09-09 11:11:39 +000024#if 1
25 /* Massive speed-up */
26 d = &g->g_dfa[type - NT_OFFSET];
27 assert(d->d_type == type);
28 return d;
29#else
30 /* Old, slow version */
31 register int i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032
33 for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
34 if (d->d_type == type)
35 return d;
36 }
37 assert(0);
38 /* NOTREACHED */
Guido van Rossum6522eb01994-09-09 11:11:39 +000039#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040}
41
42char *
Thomas Wouters23c9e002000-07-22 19:20:54 +000043PyGrammar_LabelRepr(label *lb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044{
45 static char buf[100];
46
47 if (lb->lb_type == ENDMARKER)
48 return "EMPTY";
49 else if (ISNONTERMINAL(lb->lb_type)) {
50 if (lb->lb_str == NULL) {
51 sprintf(buf, "NT%d", lb->lb_type);
52 return buf;
53 }
54 else
55 return lb->lb_str;
56 }
57 else {
58 if (lb->lb_str == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000059 return _PyParser_TokenNames[lb->lb_type];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 else {
61 sprintf(buf, "%.32s(%.32s)",
Guido van Rossum86bea461997-04-29 21:03:06 +000062 _PyParser_TokenNames[lb->lb_type], lb->lb_str);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 return buf;
64 }
65 }
66}