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