blob: 781485d507b1eb6cda3c25b3e49a889298849caf [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumb9f8d6e1995-01-04 19:08:09 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017/* Grammar subroutines needed by parser */
18
Guido van Rossum3f5da241990-12-20 15:06:42 +000019#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020#include "assert.h"
21#include "grammar.h"
22#include "token.h"
23
24/* Return the DFA for the given type */
25
26dfa *
Guido van Rossum86bea461997-04-29 21:03:06 +000027PyGrammar_FindDFA(g, type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 grammar *g;
29 register int type;
30{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031 register dfa *d;
Guido van Rossum6522eb01994-09-09 11:11:39 +000032#if 1
33 /* Massive speed-up */
34 d = &g->g_dfa[type - NT_OFFSET];
35 assert(d->d_type == type);
36 return d;
37#else
38 /* Old, slow version */
39 register int i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040
41 for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
42 if (d->d_type == type)
43 return d;
44 }
45 assert(0);
46 /* NOTREACHED */
Guido van Rossum6522eb01994-09-09 11:11:39 +000047#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048}
49
50char *
Guido van Rossum86bea461997-04-29 21:03:06 +000051PyGrammar_LabelRepr(lb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 label *lb;
53{
54 static char buf[100];
55
56 if (lb->lb_type == ENDMARKER)
57 return "EMPTY";
58 else if (ISNONTERMINAL(lb->lb_type)) {
59 if (lb->lb_str == NULL) {
60 sprintf(buf, "NT%d", lb->lb_type);
61 return buf;
62 }
63 else
64 return lb->lb_str;
65 }
66 else {
67 if (lb->lb_str == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000068 return _PyParser_TokenNames[lb->lb_type];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 else {
70 sprintf(buf, "%.32s(%.32s)",
Guido van Rossum86bea461997-04-29 21:03:06 +000071 _PyParser_TokenNames[lb->lb_type], lb->lb_str);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 return buf;
73 }
74 }
75}