+++ /dev/null
-\r
-/* Grammar implementation */\r
-\r
-#include "Python.h"\r
-#include "pgenheaders.h"\r
-\r
-#include <ctype.h>\r
-\r
-#include "token.h"\r
-#include "grammar.h"\r
-\r
-#ifdef RISCOS\r
-#include <unixlib.h>\r
-#endif\r
-\r
-extern int Py_DebugFlag;\r
-\r
-grammar *\r
-newgrammar(int start)\r
-{\r
- grammar *g;\r
-\r
- g = (grammar *)PyObject_MALLOC(sizeof(grammar));\r
- if (g == NULL)\r
- Py_FatalError("no mem for new grammar");\r
- g->g_ndfas = 0;\r
- g->g_dfa = NULL;\r
- g->g_start = start;\r
- g->g_ll.ll_nlabels = 0;\r
- g->g_ll.ll_label = NULL;\r
- g->g_accel = 0;\r
- return g;\r
-}\r
-\r
-dfa *\r
-adddfa(grammar *g, int type, char *name)\r
-{\r
- dfa *d;\r
-\r
- g->g_dfa = (dfa *)PyObject_REALLOC(g->g_dfa,\r
- sizeof(dfa) * (g->g_ndfas + 1));\r
- if (g->g_dfa == NULL)\r
- Py_FatalError("no mem to resize dfa in adddfa");\r
- d = &g->g_dfa[g->g_ndfas++];\r
- d->d_type = type;\r
- d->d_name = strdup(name);\r
- d->d_nstates = 0;\r
- d->d_state = NULL;\r
- d->d_initial = -1;\r
- d->d_first = NULL;\r
- return d; /* Only use while fresh! */\r
-}\r
-\r
-int\r
-addstate(dfa *d)\r
-{\r
- state *s;\r
-\r
- d->d_state = (state *)PyObject_REALLOC(d->d_state,\r
- sizeof(state) * (d->d_nstates + 1));\r
- if (d->d_state == NULL)\r
- Py_FatalError("no mem to resize state in addstate");\r
- s = &d->d_state[d->d_nstates++];\r
- s->s_narcs = 0;\r
- s->s_arc = NULL;\r
- s->s_lower = 0;\r
- s->s_upper = 0;\r
- s->s_accel = NULL;\r
- s->s_accept = 0;\r
- return s - d->d_state;\r
-}\r
-\r
-void\r
-addarc(dfa *d, int from, int to, int lbl)\r
-{\r
- state *s;\r
- arc *a;\r
-\r
- assert(0 <= from && from < d->d_nstates);\r
- assert(0 <= to && to < d->d_nstates);\r
-\r
- s = &d->d_state[from];\r
- s->s_arc = (arc *)PyObject_REALLOC(s->s_arc, sizeof(arc) * (s->s_narcs + 1));\r
- if (s->s_arc == NULL)\r
- Py_FatalError("no mem to resize arc list in addarc");\r
- a = &s->s_arc[s->s_narcs++];\r
- a->a_lbl = lbl;\r
- a->a_arrow = to;\r
-}\r
-\r
-int\r
-addlabel(labellist *ll, int type, char *str)\r
-{\r
- int i;\r
- label *lb;\r
-\r
- for (i = 0; i < ll->ll_nlabels; i++) {\r
- if (ll->ll_label[i].lb_type == type &&\r
- strcmp(ll->ll_label[i].lb_str, str) == 0)\r
- return i;\r
- }\r
- ll->ll_label = (label *)PyObject_REALLOC(ll->ll_label,\r
- sizeof(label) * (ll->ll_nlabels + 1));\r
- if (ll->ll_label == NULL)\r
- Py_FatalError("no mem to resize labellist in addlabel");\r
- lb = &ll->ll_label[ll->ll_nlabels++];\r
- lb->lb_type = type;\r
- lb->lb_str = strdup(str);\r
- if (Py_DebugFlag)\r
- printf("Label @ %8p, %d: %s\n", ll, ll->ll_nlabels,\r
- PyGrammar_LabelRepr(lb));\r
- return lb - ll->ll_label;\r
-}\r
-\r
-/* Same, but rather dies than adds */\r
-\r
-int\r
-findlabel(labellist *ll, int type, char *str)\r
-{\r
- int i;\r
-\r
- for (i = 0; i < ll->ll_nlabels; i++) {\r
- if (ll->ll_label[i].lb_type == type /*&&\r
- strcmp(ll->ll_label[i].lb_str, str) == 0*/)\r
- return i;\r
- }\r
- fprintf(stderr, "Label %d/'%s' not found\n", type, str);\r
- Py_FatalError("grammar.c:findlabel()");\r
- return 0; /* Make gcc -Wall happy */\r
-}\r
-\r
-/* Forward */\r
-static void translabel(grammar *, label *);\r
-\r
-void\r
-translatelabels(grammar *g)\r
-{\r
- int i;\r
-\r
-#ifdef Py_DEBUG\r
- printf("Translating labels ...\n");\r
-#endif\r
- /* Don't translate EMPTY */\r
- for (i = EMPTY+1; i < g->g_ll.ll_nlabels; i++)\r
- translabel(g, &g->g_ll.ll_label[i]);\r
-}\r
-\r
-static void\r
-translabel(grammar *g, label *lb)\r
-{\r
- int i;\r
-\r
- if (Py_DebugFlag)\r
- printf("Translating label %s ...\n", PyGrammar_LabelRepr(lb));\r
-\r
- if (lb->lb_type == NAME) {\r
- for (i = 0; i < g->g_ndfas; i++) {\r
- if (strcmp(lb->lb_str, g->g_dfa[i].d_name) == 0) {\r
- if (Py_DebugFlag)\r
- printf(\r
- "Label %s is non-terminal %d.\n",\r
- lb->lb_str,\r
- g->g_dfa[i].d_type);\r
- lb->lb_type = g->g_dfa[i].d_type;\r
- free(lb->lb_str);\r
- lb->lb_str = NULL;\r
- return;\r
- }\r
- }\r
- for (i = 0; i < (int)N_TOKENS; i++) {\r
- if (strcmp(lb->lb_str, _PyParser_TokenNames[i]) == 0) {\r
- if (Py_DebugFlag)\r
- printf("Label %s is terminal %d.\n",\r
- lb->lb_str, i);\r
- lb->lb_type = i;\r
- free(lb->lb_str);\r
- lb->lb_str = NULL;\r
- return;\r
- }\r
- }\r
- printf("Can't translate NAME label '%s'\n", lb->lb_str);\r
- return;\r
- }\r
-\r
- if (lb->lb_type == STRING) {\r
- if (isalpha(Py_CHARMASK(lb->lb_str[1])) ||\r
- lb->lb_str[1] == '_') {\r
- char *p;\r
- char *src;\r
- char *dest;\r
- size_t name_len;\r
- if (Py_DebugFlag)\r
- printf("Label %s is a keyword\n", lb->lb_str);\r
- lb->lb_type = NAME;\r
- src = lb->lb_str + 1;\r
- p = strchr(src, '\'');\r
- if (p)\r
- name_len = p - src;\r
- else\r
- name_len = strlen(src);\r
- dest = (char *)malloc(name_len + 1);\r
- if (!dest) {\r
- printf("Can't alloc dest '%s'\n", src);\r
- return;\r
- }\r
- strncpy(dest, src, name_len);\r
- dest[name_len] = '\0';\r
- free(lb->lb_str);\r
- lb->lb_str = dest;\r
- }\r
- else if (lb->lb_str[2] == lb->lb_str[0]) {\r
- int type = (int) PyToken_OneChar(lb->lb_str[1]);\r
- if (type != OP) {\r
- lb->lb_type = type;\r
- free(lb->lb_str);\r
- lb->lb_str = NULL;\r
- }\r
- else\r
- printf("Unknown OP label %s\n",\r
- lb->lb_str);\r
- }\r
- else if (lb->lb_str[2] && lb->lb_str[3] == lb->lb_str[0]) {\r
- int type = (int) PyToken_TwoChars(lb->lb_str[1],\r
- lb->lb_str[2]);\r
- if (type != OP) {\r
- lb->lb_type = type;\r
- free(lb->lb_str);\r
- lb->lb_str = NULL;\r
- }\r
- else\r
- printf("Unknown OP label %s\n",\r
- lb->lb_str);\r
- }\r
- else if (lb->lb_str[2] && lb->lb_str[3] && lb->lb_str[4] == lb->lb_str[0]) {\r
- int type = (int) PyToken_ThreeChars(lb->lb_str[1],\r
- lb->lb_str[2],\r
- lb->lb_str[3]);\r
- if (type != OP) {\r
- lb->lb_type = type;\r
- free(lb->lb_str);\r
- lb->lb_str = NULL;\r
- }\r
- else\r
- printf("Unknown OP label %s\n",\r
- lb->lb_str);\r
- }\r
- else\r
- printf("Can't translate STRING label %s\n",\r
- lb->lb_str);\r
- }\r
- else\r
- printf("Can't translate label '%s'\n",\r
- PyGrammar_LabelRepr(lb));\r
-}\r