ran out of another static list; made length dynamic
This commit is contained in:
parent
fec5feef77
commit
3ea06a4a2a
2 changed files with 24 additions and 14 deletions
|
@ -295,11 +295,11 @@ simpleproduction(p_gram *p; register int *conflres;)
|
|||
| C_AVOID { *conflres |= AVOIDING; }
|
||||
]?
|
||||
[ %persistent elem(&elem)
|
||||
{ if (p_rule - rule >= n_rule - 1) {
|
||||
{ if (p_rule - rule >= n_rule - 2) {
|
||||
rule = (p_gram) ralloc(
|
||||
(p_mem) rule,
|
||||
(n_rule+100)*sizeof(t_gram));
|
||||
p_rule = rule + n_rule - 1;
|
||||
p_rule = rule + n_rule - 2;
|
||||
n_rule += 100;
|
||||
}
|
||||
kind = FIXED;
|
||||
|
@ -323,11 +323,11 @@ simpleproduction(p_gram *p; register int *conflres;)
|
|||
g_gettype(q->t_rule) != EORULE) {
|
||||
while (g_gettype(q->t_rule) != EORULE) {
|
||||
*p_rule++ = *q->t_rule++;
|
||||
if (p_rule - rule >= n_rule - 1) {
|
||||
if (p_rule - rule >= n_rule - 2) {
|
||||
rule = (p_gram) ralloc(
|
||||
(p_mem) rule,
|
||||
(n_rule+100)*sizeof(t_gram));
|
||||
p_rule = rule + n_rule - 1;
|
||||
p_rule = rule + n_rule - 2;
|
||||
n_rule += 100;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ STATIC genincrdecr();
|
|||
|
||||
# define NOPOP -20000
|
||||
|
||||
p_mem alloc();
|
||||
p_mem alloc(), ralloc();
|
||||
|
||||
doclose(f)
|
||||
FILE *f;
|
||||
|
@ -393,16 +393,15 @@ rulecode(p,safety,mustscan,mustpop) register p_gram p; {
|
|||
register int toplevel = 1;
|
||||
register FILE *f;
|
||||
register int *ppu;
|
||||
int pushlist[100];
|
||||
int *pushlist;
|
||||
int *ppushlist;
|
||||
|
||||
/*
|
||||
* First generate code to push the contains sets of this rule
|
||||
* on a stack
|
||||
*/
|
||||
ppu = pushlist;
|
||||
ppushlist = dopush(p,safety,1,ppu);
|
||||
if (mustpop != NOPOP) for (; ppu < ppushlist; ppu++) {
|
||||
ppushlist = dopush(p,safety,1, &pushlist);
|
||||
if (mustpop != NOPOP) for (ppu = pushlist; ppu < ppushlist; ppu++) {
|
||||
if (*ppu == mustpop) {
|
||||
*ppu = mustpop = NOPOP;
|
||||
break;
|
||||
|
@ -413,6 +412,7 @@ rulecode(p,safety,mustscan,mustpop) register p_gram p; {
|
|||
mustpop = NOPOP;
|
||||
}
|
||||
for (ppu = pushlist; ppu < ppushlist; ppu++) genpush(*ppu);
|
||||
free((p_mem) pushlist);
|
||||
f = fpars;
|
||||
for (;;) {
|
||||
switch (g_gettype(p)) {
|
||||
|
@ -595,16 +595,26 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
|
|||
}
|
||||
|
||||
STATIC int *
|
||||
dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; {
|
||||
dopush(p,safety,toplevel,pp) register p_gram p; int **pp; {
|
||||
/*
|
||||
* The safety only matters if toplevel != 0
|
||||
*/
|
||||
unsigned int i = 100;
|
||||
register int *ip = (int *) alloc(100 * sizeof(int));
|
||||
|
||||
*pp = ip;
|
||||
|
||||
for (;;) {
|
||||
if (ip - *pp >= i) {
|
||||
*pp = (int *)
|
||||
ralloc((p_mem) (*pp), (i + 100) * sizeof(int));
|
||||
ip = *pp + i;
|
||||
i += 100;
|
||||
}
|
||||
switch(g_gettype(p)) {
|
||||
case EORULE :
|
||||
case ALTERNATION :
|
||||
return pp;
|
||||
return ip;
|
||||
case TERM : {
|
||||
register p_term q;
|
||||
int rep, cnt;
|
||||
|
@ -614,7 +624,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; {
|
|||
cnt = r_getnum(q);
|
||||
if (!(toplevel > 0 && safety <= SAFESCANDONE &&
|
||||
(rep == OPT || (rep == FIXED && cnt == 0)))) {
|
||||
*pp++ = findindex(q->t_contains);
|
||||
*ip++ = findindex(q->t_contains);
|
||||
}
|
||||
break; }
|
||||
case LITERAL :
|
||||
|
@ -625,7 +635,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; {
|
|||
safety = NOSCANDONE;
|
||||
continue;
|
||||
}
|
||||
if (toplevel == 0) *pp++ = -(g_getcont(p)+1);
|
||||
if (toplevel == 0) *ip++ = -(g_getcont(p)+1);
|
||||
break;
|
||||
case NONTERM : {
|
||||
register p_nont n;
|
||||
|
@ -634,7 +644,7 @@ dopush(p,safety,toplevel,pp) register p_gram p; register int *pp; {
|
|||
if (toplevel == 0 ||
|
||||
(g_gettype(n->n_rule) == ALTERNATION &&
|
||||
getntsafe(n) > SAFESCANDONE)) {
|
||||
*pp++ = findindex(n->n_contains);
|
||||
*ip++ = findindex(n->n_contains);
|
||||
}
|
||||
break; }
|
||||
case ACTION :
|
||||
|
|
Loading…
Reference in a new issue