blob: f9a24c00f7bb9326c8817f7568d10daf1a2bf385 [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 *
Guido van Rossum86bea461997-04-29 21:03:06 +000021PyGrammar_FindDFA(g, type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022 grammar *g;
23 register int type;
24{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025 register dfa *d;
Guido van Rossum6522eb01994-09-09 11:11:39 +000026#if 1
27 /* Massive speed-up */
28 d = &g->g_dfa[type - NT_OFFSET];
29 assert(d->d_type == type);
30 return d;
31#else
32 /* Old, slow version */
33 register int i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034
35 for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
36 if (d->d_type == type)
37 return d;
38 }
39 assert(0);
40 /* NOTREACHED */
Guido van Rossum6522eb01994-09-09 11:11:39 +000041#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042}
43
44char *
Guido van Rossum86bea461997-04-29 21:03:06 +000045PyGrammar_LabelRepr(lb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 label *lb;
47{
48 static char buf[100];
49
50 if (lb->lb_type == ENDMARKER)
51 return "EMPTY";
52 else if (ISNONTERMINAL(lb->lb_type)) {
53 if (lb->lb_str == NULL) {
54 sprintf(buf, "NT%d", lb->lb_type);
55 return buf;
56 }
57 else
58 return lb->lb_str;
59 }
60 else {
61 if (lb->lb_str == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000062 return _PyParser_TokenNames[lb->lb_type];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 else {
64 sprintf(buf, "%.32s(%.32s)",
Guido van Rossum86bea461997-04-29 21:03:06 +000065 _PyParser_TokenNames[lb->lb_type], lb->lb_str);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return buf;
67 }
68 }
69}