+++ /dev/null
-\r
-/* Computation of FIRST stets */\r
-\r
-#include "pgenheaders.h"\r
-#include "grammar.h"\r
-#include "token.h"\r
-\r
-extern int Py_DebugFlag;\r
-\r
-/* Forward */\r
-static void calcfirstset(grammar *, dfa *);\r
-\r
-void\r
-addfirstsets(grammar *g)\r
-{\r
- int i;\r
- dfa *d;\r
-\r
- if (Py_DebugFlag)\r
- printf("Adding FIRST sets ...\n");\r
- for (i = 0; i < g->g_ndfas; i++) {\r
- d = &g->g_dfa[i];\r
- if (d->d_first == NULL)\r
- calcfirstset(g, d);\r
- }\r
-}\r
-\r
-static void\r
-calcfirstset(grammar *g, dfa *d)\r
-{\r
- int i, j;\r
- state *s;\r
- arc *a;\r
- int nsyms;\r
- int *sym;\r
- int nbits;\r
- static bitset dummy;\r
- bitset result;\r
- int type;\r
- dfa *d1;\r
- label *l0;\r
-\r
- if (Py_DebugFlag)\r
- printf("Calculate FIRST set for '%s'\n", d->d_name);\r
-\r
- if (dummy == NULL)\r
- dummy = newbitset(1);\r
- if (d->d_first == dummy) {\r
- fprintf(stderr, "Left-recursion for '%s'\n", d->d_name);\r
- return;\r
- }\r
- if (d->d_first != NULL) {\r
- fprintf(stderr, "Re-calculating FIRST set for '%s' ???\n",\r
- d->d_name);\r
- }\r
- d->d_first = dummy;\r
-\r
- l0 = g->g_ll.ll_label;\r
- nbits = g->g_ll.ll_nlabels;\r
- result = newbitset(nbits);\r
-\r
- sym = (int *)PyObject_MALLOC(sizeof(int));\r
- if (sym == NULL)\r
- Py_FatalError("no mem for new sym in calcfirstset");\r
- nsyms = 1;\r
- sym[0] = findlabel(&g->g_ll, d->d_type, (char *)NULL);\r
-\r
- s = &d->d_state[d->d_initial];\r
- for (i = 0; i < s->s_narcs; i++) {\r
- a = &s->s_arc[i];\r
- for (j = 0; j < nsyms; j++) {\r
- if (sym[j] == a->a_lbl)\r
- break;\r
- }\r
- if (j >= nsyms) { /* New label */\r
- sym = (int *)PyObject_REALLOC(sym,\r
- sizeof(int) * (nsyms + 1));\r
- if (sym == NULL)\r
- Py_FatalError(\r
- "no mem to resize sym in calcfirstset");\r
- sym[nsyms++] = a->a_lbl;\r
- type = l0[a->a_lbl].lb_type;\r
- if (ISNONTERMINAL(type)) {\r
- d1 = PyGrammar_FindDFA(g, type);\r
- if (d1->d_first == dummy) {\r
- fprintf(stderr,\r
- "Left-recursion below '%s'\n",\r
- d->d_name);\r
- }\r
- else {\r
- if (d1->d_first == NULL)\r
- calcfirstset(g, d1);\r
- mergebitset(result,\r
- d1->d_first, nbits);\r
- }\r
- }\r
- else if (ISTERMINAL(type)) {\r
- addbit(result, a->a_lbl);\r
- }\r
- }\r
- }\r
- d->d_first = result;\r
- if (Py_DebugFlag) {\r
- printf("FIRST set for '%s': {", d->d_name);\r
- for (i = 0; i < nbits; i++) {\r
- if (testbit(result, i))\r
- printf(" %s", PyGrammar_LabelRepr(&l0[i]));\r
- }\r
- printf(" }\n");\r
- }\r
-\r
- PyObject_FREE(sym);\r
-}\r