summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
Diffstat (limited to 'Parser')
-rw-r--r--Parser/grammar.c28
-rw-r--r--Parser/metagrammar.c6
-rw-r--r--Parser/pgen.c5
3 files changed, 34 insertions, 5 deletions
diff --git a/Parser/grammar.c b/Parser/grammar.c
index 2cc15b58..1f01562 100644
--- a/Parser/grammar.c
+++ b/Parser/grammar.c
@@ -38,7 +38,7 @@ adddfa(grammar *g, int type, char *name)
Py_FatalError("no mem to resize dfa in adddfa");
d = &g->g_dfa[g->g_ndfas++];
d->d_type = type;
- d->d_name = name;
+ d->d_name = strdup(name);
d->d_nstates = 0;
d->d_state = NULL;
d->d_initial = -1;
@@ -98,7 +98,10 @@ addlabel(labellist *ll, int type, char *str)
Py_FatalError("no mem to resize labellist in addlabel");
lb = &ll->ll_label[ll->ll_nlabels++];
lb->lb_type = type;
- lb->lb_str = str; /* XXX strdup(str) ??? */
+ lb->lb_str = strdup(str);
+ if (Py_DebugFlag)
+ printf("Label @ %08x, %d: %s\n", (unsigned)ll, ll->ll_nlabels,
+ PyGrammar_LabelRepr(lb));
return lb - ll->ll_label;
}
@@ -152,6 +155,7 @@ translabel(grammar *g, label *lb)
lb->lb_str,
g->g_dfa[i].d_type);
lb->lb_type = g->g_dfa[i].d_type;
+ free(lb->lb_str);
lb->lb_str = NULL;
return;
}
@@ -162,6 +166,7 @@ translabel(grammar *g, label *lb)
printf("Label %s is terminal %d.\n",
lb->lb_str, i);
lb->lb_type = i;
+ free(lb->lb_str);
lb->lb_str = NULL;
return;
}
@@ -173,18 +178,29 @@ translabel(grammar *g, label *lb)
if (lb->lb_type == STRING) {
if (isalpha((int)(lb->lb_str[1])) || lb->lb_str[1] == '_') {
char *p;
+ char *src;
+ char *dest;
+ size_t name_len;
if (Py_DebugFlag)
printf("Label %s is a keyword\n", lb->lb_str);
lb->lb_type = NAME;
- lb->lb_str++;
- p = strchr(lb->lb_str, '\'');
+ src = lb->lb_str + 1;
+ p = strchr(src, '\'');
if (p)
- *p = '\0';
+ name_len = p - src;
+ else
+ name_len = strlen(src);
+ dest = malloc(name_len + 1);
+ strncpy(dest, src, name_len);
+ dest[name_len] = '\0';
+ free(lb->lb_str);
+ lb->lb_str = dest;
}
else if (lb->lb_str[2] == lb->lb_str[0]) {
int type = (int) PyToken_OneChar(lb->lb_str[1]);
if (type != OP) {
lb->lb_type = type;
+ free(lb->lb_str);
lb->lb_str = NULL;
}
else
@@ -196,6 +212,7 @@ translabel(grammar *g, label *lb)
lb->lb_str[2]);
if (type != OP) {
lb->lb_type = type;
+ free(lb->lb_str);
lb->lb_str = NULL;
}
else
@@ -208,6 +225,7 @@ translabel(grammar *g, label *lb)
lb->lb_str[3]);
if (type != OP) {
lb->lb_type = type;
+ free(lb->lb_str);
lb->lb_str = NULL;
}
else
diff --git a/Parser/metagrammar.c b/Parser/metagrammar.c
index ae67eb1..b61bc6d 100644
--- a/Parser/metagrammar.c
+++ b/Parser/metagrammar.c
@@ -151,3 +151,9 @@ meta_grammar(void)
{
return &_PyParser_Grammar;
}
+
+grammar *
+Py_meta_grammar(void)
+{
+ return meta_grammar();
+}
diff --git a/Parser/pgen.c b/Parser/pgen.c
index f3fdb46..453deb4 100644
--- a/Parser/pgen.c
+++ b/Parser/pgen.c
@@ -669,6 +669,11 @@ pgen(node *n)
return g;
}
+grammar *
+Py_pgen(node *n)
+{
+ return pgen(n);
+}
/*