diff options
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/grammar.c | 28 | ||||
-rw-r--r-- | Parser/metagrammar.c | 6 | ||||
-rw-r--r-- | Parser/pgen.c | 5 |
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); +} /* |