]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Parser/firstsets.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Parser / firstsets.c
CommitLineData
4710c53d 1\r
2/* Computation of FIRST stets */\r
3\r
4#include "pgenheaders.h"\r
5#include "grammar.h"\r
6#include "token.h"\r
7\r
8extern int Py_DebugFlag;\r
9\r
10/* Forward */\r
11static void calcfirstset(grammar *, dfa *);\r
12\r
13void\r
14addfirstsets(grammar *g)\r
15{\r
16 int i;\r
17 dfa *d;\r
18\r
19 if (Py_DebugFlag)\r
20 printf("Adding FIRST sets ...\n");\r
21 for (i = 0; i < g->g_ndfas; i++) {\r
22 d = &g->g_dfa[i];\r
23 if (d->d_first == NULL)\r
24 calcfirstset(g, d);\r
25 }\r
26}\r
27\r
28static void\r
29calcfirstset(grammar *g, dfa *d)\r
30{\r
31 int i, j;\r
32 state *s;\r
33 arc *a;\r
34 int nsyms;\r
35 int *sym;\r
36 int nbits;\r
37 static bitset dummy;\r
38 bitset result;\r
39 int type;\r
40 dfa *d1;\r
41 label *l0;\r
42\r
43 if (Py_DebugFlag)\r
44 printf("Calculate FIRST set for '%s'\n", d->d_name);\r
45\r
46 if (dummy == NULL)\r
47 dummy = newbitset(1);\r
48 if (d->d_first == dummy) {\r
49 fprintf(stderr, "Left-recursion for '%s'\n", d->d_name);\r
50 return;\r
51 }\r
52 if (d->d_first != NULL) {\r
53 fprintf(stderr, "Re-calculating FIRST set for '%s' ???\n",\r
54 d->d_name);\r
55 }\r
56 d->d_first = dummy;\r
57\r
58 l0 = g->g_ll.ll_label;\r
59 nbits = g->g_ll.ll_nlabels;\r
60 result = newbitset(nbits);\r
61\r
62 sym = (int *)PyObject_MALLOC(sizeof(int));\r
63 if (sym == NULL)\r
64 Py_FatalError("no mem for new sym in calcfirstset");\r
65 nsyms = 1;\r
66 sym[0] = findlabel(&g->g_ll, d->d_type, (char *)NULL);\r
67\r
68 s = &d->d_state[d->d_initial];\r
69 for (i = 0; i < s->s_narcs; i++) {\r
70 a = &s->s_arc[i];\r
71 for (j = 0; j < nsyms; j++) {\r
72 if (sym[j] == a->a_lbl)\r
73 break;\r
74 }\r
75 if (j >= nsyms) { /* New label */\r
76 sym = (int *)PyObject_REALLOC(sym,\r
77 sizeof(int) * (nsyms + 1));\r
78 if (sym == NULL)\r
79 Py_FatalError(\r
80 "no mem to resize sym in calcfirstset");\r
81 sym[nsyms++] = a->a_lbl;\r
82 type = l0[a->a_lbl].lb_type;\r
83 if (ISNONTERMINAL(type)) {\r
84 d1 = PyGrammar_FindDFA(g, type);\r
85 if (d1->d_first == dummy) {\r
86 fprintf(stderr,\r
87 "Left-recursion below '%s'\n",\r
88 d->d_name);\r
89 }\r
90 else {\r
91 if (d1->d_first == NULL)\r
92 calcfirstset(g, d1);\r
93 mergebitset(result,\r
94 d1->d_first, nbits);\r
95 }\r
96 }\r
97 else if (ISTERMINAL(type)) {\r
98 addbit(result, a->a_lbl);\r
99 }\r
100 }\r
101 }\r
102 d->d_first = result;\r
103 if (Py_DebugFlag) {\r
104 printf("FIRST set for '%s': {", d->d_name);\r
105 for (i = 0; i < nbits; i++) {\r
106 if (testbit(result, i))\r
107 printf(" %s", PyGrammar_LabelRepr(&l0[i]));\r
108 }\r
109 printf(" }\n");\r
110 }\r
111\r
112 PyObject_FREE(sym);\r
113}\r