Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Include/grammar.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ typedef struct {
} grammar;

/* FUNCTIONS */
dfa *PyGrammar_FindDFA(grammar *g, int type);
const dfa *PyGrammar_FindDFA(grammar *g, int type);
const char *PyGrammar_LabelRepr(label *lb);
void PyGrammar_AddAccelerators(grammar *g);
void PyGrammar_RemoveAccelerators(grammar *);
Expand Down
3 changes: 1 addition & 2 deletions Modules/parsermodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,6 @@ validate_node(node *tree)
{
int type = TYPE(tree);
int nch = NCH(tree);
dfa *nt_dfa;
state *dfa_state;
int pos, arc;

Expand All @@ -654,7 +653,7 @@ validate_node(node *tree)
PyErr_Format(parser_error, "Unrecognized node type %d.", TYPE(tree));
return 0;
}
nt_dfa = &_PyParser_Grammar.g_dfa[type];
const dfa *nt_dfa = &_PyParser_Grammar.g_dfa[type];
REQ(tree, nt_dfa->d_type);

/* Run the DFA for this nonterminal. */
Expand Down
16 changes: 7 additions & 9 deletions Parser/acceler.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,14 @@
#include "parser.h"

/* Forward references */
static void fixdfa(grammar *, dfa *);
static void fixdfa(grammar *, const dfa *);
static void fixstate(grammar *, state *);

void
PyGrammar_AddAccelerators(grammar *g)
{
dfa *d;
int i;
d = g->g_dfa;
const dfa *d = g->g_dfa;
for (i = g->g_ndfas; --i >= 0; d++)
fixdfa(g, d);
g->g_accel = 1;
Expand All @@ -34,10 +33,9 @@ PyGrammar_AddAccelerators(grammar *g)
void
PyGrammar_RemoveAccelerators(grammar *g)
{
dfa *d;
int i;
g->g_accel = 0;
d = g->g_dfa;
const dfa *d = g->g_dfa;
for (i = g->g_ndfas; --i >= 0; d++) {
state *s;
int j;
Expand All @@ -51,7 +49,7 @@ PyGrammar_RemoveAccelerators(grammar *g)
}

static void
fixdfa(grammar *g, dfa *d)
fixdfa(grammar *g, const dfa *d)
{
state *s;
int j;
Expand All @@ -63,7 +61,7 @@ fixdfa(grammar *g, dfa *d)
static void
fixstate(grammar *g, state *s)
{
arc *a;
const arc *a;
int k;
int *accel;
int nl = g->g_ll.ll_nlabels;
Expand All @@ -78,14 +76,14 @@ fixstate(grammar *g, state *s)
a = s->s_arc;
for (k = s->s_narcs; --k >= 0; a++) {
int lbl = a->a_lbl;
label *l = &g->g_ll.ll_label[lbl];
const label *l = &g->g_ll.ll_label[lbl];
int type = l->lb_type;
if (a->a_arrow >= (1 << 7)) {
printf("XXX too many states!\n");
continue;
}
if (ISNONTERMINAL(type)) {
dfa *d1 = PyGrammar_FindDFA(g, type);
const dfa *d1 = PyGrammar_FindDFA(g, type);
int ibit;
if (type - NT_OFFSET >= (1 << 7)) {
printf("XXX too high nonterminal number!\n");
Expand Down
5 changes: 2 additions & 3 deletions Parser/grammar1.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@

/* Return the DFA for the given type */

dfa *
const dfa *
PyGrammar_FindDFA(grammar *g, int type)
{
dfa *d;
/* Massive speed-up */
d = &g->g_dfa[type - NT_OFFSET];
const dfa *d = &g->g_dfa[type - NT_OFFSET];
assert(d->d_type == type);
return d;
}
Expand Down
13 changes: 6 additions & 7 deletions Parser/parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ s_reset(stack *s)
#define s_empty(s) ((s)->s_top == &(s)->s_base[MAXSTACK])

static int
s_push(stack *s, dfa *d, node *parent)
s_push(stack *s, const dfa *d, node *parent)
{
stackentry *top;
if (s->s_top == s->s_base) {
Expand Down Expand Up @@ -119,7 +119,7 @@ shift(stack *s, int type, char *str, int newstate, int lineno, int col_offset,
}

static int
push(stack *s, int type, dfa *d, int newstate, int lineno, int col_offset,
push(stack *s, int type, const dfa *d, int newstate, int lineno, int col_offset,
int end_lineno, int end_col_offset)
{
int err;
Expand All @@ -144,7 +144,7 @@ classify(parser_state *ps, int type, const char *str)
int n = g->g_ll.ll_nlabels;

if (type == NAME) {
label *l = g->g_ll.ll_label;
const label *l = g->g_ll.ll_label;
int i;
for (i = n; i > 0; i--, l++) {
if (l->lb_type != NAME || l->lb_str == NULL ||
Expand All @@ -168,7 +168,7 @@ classify(parser_state *ps, int type, const char *str)
}

{
label *l = g->g_ll.ll_label;
const label *l = g->g_ll.ll_label;
int i;
for (i = n; i > 0; i--, l++) {
if (l->lb_type == type && l->lb_str == NULL) {
Expand Down Expand Up @@ -246,7 +246,7 @@ PyParser_AddToken(parser_state *ps, int type, char *str,
/* Loop until the token is shifted or an error occurred */
for (;;) {
/* Fetch the current dfa and state */
dfa *d = ps->p_stack.s_top->s_dfa;
const dfa *d = ps->p_stack.s_top->s_dfa;
state *s = &d->d_state[ps->p_stack.s_top->s_state];

D(printf(" DFA '%s', state %d:",
Expand All @@ -260,15 +260,14 @@ PyParser_AddToken(parser_state *ps, int type, char *str,
/* Push non-terminal */
int nt = (x >> 8) + NT_OFFSET;
int arrow = x & ((1<<7)-1);
dfa *d1;
if (nt == func_body_suite && !(ps->p_flags & PyCF_TYPE_COMMENTS)) {
/* When parsing type comments is not requested,
we can provide better errors about bad indentation
by using 'suite' for the body of a funcdef */
D(printf(" [switch func_body_suite to suite]"));
nt = suite;
}
d1 = PyGrammar_FindDFA(
const dfa *d1 = PyGrammar_FindDFA(
ps->p_grammar, nt);
if ((err = push(&ps->p_stack, nt, d1,
arrow, lineno, col_offset,
Expand Down
2 changes: 1 addition & 1 deletion Parser/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ extern "C" {

typedef struct {
int s_state; /* State in current DFA */
dfa *s_dfa; /* Current DFA */
const dfa *s_dfa; /* Current DFA */
struct _node *s_parent; /* Where to add next node */
} stackentry;

Expand Down