2 /* Computation of FIRST stets */
4 #include "pgenheaders.h"
8 extern int Py_DebugFlag
;
11 static void calcfirstset(grammar
*, dfa
*);
14 addfirstsets(grammar
*g
)
19 printf("Adding FIRST sets ...\n");
20 for (i
= 0; i
< g
->g_ndfas
; i
++) {
22 if (d
->d_first
== NULL
)
28 calcfirstset(grammar
*g
, dfa
*d
)
43 printf("Calculate FIRST set for '%s'\n", d
->d_name
);
47 if (d
->d_first
== dummy
) {
48 fprintf(stderr
, "Left-recursion for '%s'\n", d
->d_name
);
51 if (d
->d_first
!= NULL
) {
52 fprintf(stderr
, "Re-calculating FIRST set for '%s' ???\n",
57 l0
= g
->g_ll
.ll_label
;
58 nbits
= g
->g_ll
.ll_nlabels
;
59 result
= newbitset(nbits
);
61 sym
= PyMem_NEW(int, 1);
63 Py_FatalError("no mem for new sym in calcfirstset");
65 sym
[0] = findlabel(&g
->g_ll
, d
->d_type
, (char *)NULL
);
67 s
= &d
->d_state
[d
->d_initial
];
68 for (i
= 0; i
< s
->s_narcs
; i
++) {
70 for (j
= 0; j
< nsyms
; j
++) {
71 if (sym
[j
] == a
->a_lbl
)
74 if (j
>= nsyms
) { /* New label */
75 PyMem_RESIZE(sym
, int, nsyms
+ 1);
78 "no mem to resize sym in calcfirstset");
79 sym
[nsyms
++] = a
->a_lbl
;
80 type
= l0
[a
->a_lbl
].lb_type
;
81 if (ISNONTERMINAL(type
)) {
82 d1
= PyGrammar_FindDFA(g
, type
);
83 if (d1
->d_first
== dummy
) {
85 "Left-recursion below '%s'\n",
89 if (d1
->d_first
== NULL
)
95 else if (ISTERMINAL(type
)) {
96 addbit(result
, a
->a_lbl
);
102 printf("FIRST set for '%s': {", d
->d_name
);
103 for (i
= 0; i
< nbits
; i
++) {
104 if (testbit(result
, i
))
105 printf(" %s", PyGrammar_LabelRepr(&l0
[i
]));