grammar1.c 1.01 KB
Newer Older
1

Guido van Rossum's avatar
Guido van Rossum committed
2 3
/* Grammar subroutines needed by parser */

4
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
5
#include "pgenheaders.h"
Guido van Rossum's avatar
Guido van Rossum committed
6 7 8 9 10 11
#include "grammar.h"
#include "token.h"

/* Return the DFA for the given type */

dfa *
Thomas Wouters's avatar
Thomas Wouters committed
12
PyGrammar_FindDFA(grammar *g, register int type)
Guido van Rossum's avatar
Guido van Rossum committed
13 14
{
	register dfa *d;
15 16 17 18 19 20 21 22
#if 1
	/* Massive speed-up */
	d = &g->g_dfa[type - NT_OFFSET];
	assert(d->d_type == type);
	return d;
#else
	/* Old, slow version */
	register int i;
Guido van Rossum's avatar
Guido van Rossum committed
23 24 25 26 27 28 29
	
	for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
		if (d->d_type == type)
			return d;
	}
	assert(0);
	/* NOTREACHED */
30
#endif
Guido van Rossum's avatar
Guido van Rossum committed
31 32 33
}

char *
Thomas Wouters's avatar
Thomas Wouters committed
34
PyGrammar_LabelRepr(label *lb)
Guido van Rossum's avatar
Guido van Rossum committed
35 36 37 38 39 40 41
{
	static char buf[100];
	
	if (lb->lb_type == ENDMARKER)
		return "EMPTY";
	else if (ISNONTERMINAL(lb->lb_type)) {
		if (lb->lb_str == NULL) {
42
			PyOS_snprintf(buf, sizeof(buf), "NT%d", lb->lb_type);
Guido van Rossum's avatar
Guido van Rossum committed
43 44 45 46 47 48 49
			return buf;
		}
		else
			return lb->lb_str;
	}
	else {
		if (lb->lb_str == NULL)
50
			return _PyParser_TokenNames[lb->lb_type];
Guido van Rossum's avatar
Guido van Rossum committed
51
		else {
52
			PyOS_snprintf(buf, sizeof(buf), "%.32s(%.32s)",
53
				_PyParser_TokenNames[lb->lb_type], lb->lb_str);
Guido van Rossum's avatar
Guido van Rossum committed
54 55 56 57
			return buf;
		}
	}
}