maxorder;
static p_term t_list;
static int t_cnt;
+static p_gram alt_table;
+static int n_alts;
+static int max_alts;
+#define ALTINCR 32
+
+static p_gram rule_table;
+static int n_rules;
+static int max_rules;
+#define RULEINCR 32
/* Here are defined : */
STATIC p_order neworder();
else sorder = po;
return po;
}
+
+p_init()
+{
+ alt_table = (p_gram )alloc(ALTINCR*sizeof(t_gram));
+ n_alts = 0;
+ max_alts = ALTINCR;
+ rule_table = (p_gram )alloc(RULEINCR*sizeof(t_gram));
+ n_rules = 0;
+ max_rules = RULEINCR;
+}
+
}
%start LLparse, spec;
-spec : { acount = 0; }
+spec : { acount = 0; p_init(); }
[ %persistent def ]*
{ /*
* Put an endmarker in temporary file
*/
putc('\0', fact);
putc('\0', fact);
+ free((p_mem) rule_table);
+ free((p_mem) alt_table);
}
;
int conflres = 0;
int t = 0;
int haddefault = 0;
- p_gram alts = (p_gram) alloc(200 * sizeof(t_gram));
- register p_gram p_alts = alts;
- unsigned n_alts = 200;
+ int altcnt = 0;
int o_lc, n_lc;
} :
{ o_lc = linecount; }
[
[ '|' { n_lc = linecount; }
simpleproduction(&prod,&t)
- { if (p_alts - alts == n_alts) {
- alts = (p_gram) ralloc(
- (p_mem) alts,
- (n_alts+100)*sizeof(t_gram));
- p_alts = alts + n_alts;
- n_alts += 100;
- }
+ { if (n_alts >= max_alts-2) {
+ alt_table = (p_gram ) ralloc(
+ (p_mem) alt_table,
+ (max_alts+=ALTINCR)*sizeof(t_gram));
+ }
if (t & DEF) {
if (haddefault) {
error(n_lc,
}
haddefault = 1;
}
- mkalt(*p,conflres,o_lc,p_alts++);
+ mkalt(*p,conflres,o_lc,&alt_table[n_alts++]);
+ altcnt++;
o_lc = n_lc;
conflres = t;
t = 0;
error(n_lc,
"Resolver on last alternative not allowed");
}
- mkalt(*p,conflres,n_lc,p_alts++);
- g_settype(p_alts,EORULE);
- *p = copyrule(alts,p_alts+1-alts);
+ mkalt(*p,conflres,n_lc,&alt_table[n_alts++]);
+ altcnt++;
+ g_settype((&alt_table[n_alts]),EORULE);
+ *p = copyrule(&alt_table[n_alts-altcnt],altcnt+1);
}
|
{ if (conflres & ~DEF) {
*/
}
]
- { free((p_mem) alts); }
+ { n_alts -= altcnt; }
;
{
}
simpleproduction(p_gram *p; register int *conflres;)
- { p_gram rule = (p_gram) alloc(200 * sizeof(t_gram));
- unsigned n_rule = 200;
- t_gram elem;
- register p_gram p_rule = rule;
+ { t_gram elem;
+ int elmcnt = 0;
int cnt, kind;
int termdeleted = 0;
} :
| C_AVOID { *conflres |= AVOIDING; }
]?
[ %persistent elem(&elem)
- { 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 - 2;
- n_rule += 100;
+ { if (n_rules >= max_rules-2) {
+ rule_table = (p_gram) ralloc(
+ (p_mem) rule_table,
+ (max_rules+=RULEINCR)*sizeof(t_gram));
}
kind = FIXED;
cnt = 0;
}
[ repeats(&kind, &cnt)
{ if (g_gettype(&elem) != TERM) {
- *p_rule = elem;
- g_settype(p_rule+1,EORULE);
- mkterm(copyrule(p_rule,2),
+ rule_table[n_rules] = elem;
+ g_settype((&rule_table[n_rules+1]),EORULE);
+ mkterm(copyrule(&rule_table[n_rules],2),
0,
- p_rule->g_lineno,
+ elem.g_lineno,
&elem);
}
}
g_gettype(q->t_rule) != ALTERNATION &&
g_gettype(q->t_rule) != EORULE) {
while (g_gettype(q->t_rule) != EORULE) {
- *p_rule++ = *q->t_rule++;
- 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 - 2;
- n_rule += 100;
- }
+ rule_table[n_rules++] = *q->t_rule++;
+ elmcnt++;
+ if (n_rules >= max_rules-2) {
+ rule_table = (p_gram) ralloc(
+ (p_mem) rule_table,
+ (max_rules+=RULEINCR)*sizeof(t_gram));
+ }
}
elem = *--(q->t_rule);
- p_rule--;
+ n_rules--;
+ elmcnt--;
if (q == t_list - 1) {
t_list--;
nterms--;
*/
}
termdeleted = 0;
- *p_rule++ = elem;
+ elmcnt++;
+ rule_table[n_rules++] = elem;
}
]* { register p_term q;
- g_settype(p_rule,EORULE);
- *p = 0;
- if (g_gettype(&rule[0]) == TERM &&
- p_rule-rule == 1) {
- q = g_getterm(&rule[0]);
- if (r_getkind(q) == FIXED &&
- r_getnum(q) == 0) {
- *p = q->t_rule;
- }
- }
- if (!*p) *p = copyrule(rule,p_rule-rule+1);
- free((p_mem) rule);
+ g_settype((&rule_table[n_rules]),EORULE);
+ *p = 0;
+ n_rules -= elmcnt;
+ if (g_gettype(&rule_table[n_rules]) == TERM &&
+ elmcnt == 1) {
+ q = g_getterm(&rule_table[n_rules]);
+ if (r_getkind(q) == FIXED &&
+ r_getnum(q) == 0) {
+ *p = q->t_rule;
+ }
+ }
+ if (!*p) *p = copyrule(&rule_table[n_rules],
+ elmcnt+1);
}
;
{