8bb395b147
Use C89 size_t for sizes from sizeof() or to malloc() or realloc().
Remove obsolete (unsigned) casts. Sizes were unsigned int in
traditional C but are size_t in C89.
Silence some clang warnings. Add the second pair of round brackets in
`while ((ff = ff->ff_next))` to silence -Wparentheses. Change
`if (nc_first(...))/*nothing*/;` to `(void)nc_first(...);` to silence
-Wempty-body. The code in compute.c nc_first() had the form
`if (x) if (y) s; else t;`. The old indentation (before 10717cc
)
suggests that the "else" belongs to the 2nd "if", so add braces like
`if (x) { if (y) s; else t; }` to silence -Wdangling-else.
Shuffle extern function declarations. Add missing declaration for
LLparse(). Stop declaring RENAME(); it doesn't exist. Move some
declarations from main.c to extern.h, so the C compiler may check that
the declarations are compatible with the function definitions.
Assume that standard C89 remove() is available and doesn't need the
UNLINK() wrapper.
In lib/incl, don't need to include <stdio.h> nor <stdlib.h> to use
assert().
Remove alloc.h. If you don't clean your build, then an outdated
BUILDDIR/obj/util/LLgen/headers/alloc.h will survive but should not
cause harm, because nothing includes it. Don't need to remove alloc.h
from util/LLgen/distr.sh, because it isn't there.
Run the bootstrap to rebuild LLgen.c, Lpars.c, tokens.c.
1324 lines
24 KiB
C
1324 lines
24 KiB
C
/* LLgen generated code from source LLgen.g */
|
|
#include "Lpars.h"
|
|
#define LL_LEXI scanner
|
|
#define LLNOFIRSTS
|
|
#define LL_LEXI scanner
|
|
/* $Id$ */
|
|
#ifdef LL_DEBUG
|
|
#include <assert.h>
|
|
#define LL_assert(x) assert(x)
|
|
#else
|
|
#define LL_assert(x) /* nothing */
|
|
#endif
|
|
|
|
extern int LLsymb;
|
|
|
|
#define LL_SAFE(x) /* Nothing */
|
|
#define LL_SSCANDONE(x) if (LLsymb != x) LLsafeerror(x)
|
|
#define LL_SCANDONE(x) if (LLsymb != x) LLerror(x)
|
|
#define LL_NOSCANDONE(x) LLscan(x)
|
|
#ifdef LL_FASTER
|
|
#define LLscan(x) if ((LLsymb = LL_LEXI()) != x) LLerror(x)
|
|
#endif
|
|
|
|
extern unsigned int LLscnt[];
|
|
extern unsigned int LLtcnt[];
|
|
extern int LLcsymb;
|
|
|
|
#if LL_NON_CORR
|
|
extern int LLstartsymb;
|
|
#endif
|
|
|
|
#define LLsdecr(d) {LL_assert(LLscnt[d] > 0); LLscnt[d]--;}
|
|
#define LLtdecr(d) {LL_assert(LLtcnt[d] > 0); LLtcnt[d]--;}
|
|
#define LLsincr(d) LLscnt[d]++
|
|
#define LLtincr(d) LLtcnt[d]++
|
|
|
|
extern int LL_LEXI(void);
|
|
extern void LLread(void);
|
|
extern int LLskip(void);
|
|
extern int LLnext(int);
|
|
extern void LLerror(int);
|
|
extern void LLsafeerror(int);
|
|
extern void LLnewlevel(unsigned int *);
|
|
extern void LLoldlevel(unsigned int *);
|
|
#ifndef LL_FASTER
|
|
extern void LLscan(int);
|
|
#endif
|
|
#ifndef LLNOFIRSTS
|
|
extern int LLfirst(int, int);
|
|
#endif
|
|
#if LL_NON_CORR
|
|
extern void LLnc_recover(void);
|
|
#endif
|
|
# line 20 "LLgen.g"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "types.h"
|
|
#include "io.h"
|
|
#include "extern.h"
|
|
#include "assert.h"
|
|
#include "cclass.h"
|
|
|
|
# ifndef NORCSID
|
|
static string rcsid = "$Id$";
|
|
# endif
|
|
p_mem alloc(), ralloc();
|
|
string store();
|
|
p_gram search();
|
|
long ftell();
|
|
|
|
static int acount; /* count #of global actions */
|
|
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 void newnorder(int index);
|
|
STATIC void newtorder(int index);
|
|
STATIC void mkalt(p_gram prod, int condition,int lc,register p_gram res);
|
|
STATIC void mkterm(p_gram prod, int flags,int lc,register p_gram result);
|
|
STATIC p_gram copyrule(register p_gram p,int length);
|
|
/* and of course LLparse() */
|
|
|
|
STATIC void newnorder(int index) {
|
|
static int porder;
|
|
|
|
if (norder != -1) {
|
|
nonterms[porder].n_next = index;
|
|
}
|
|
else norder = index;
|
|
porder = index;
|
|
nonterms[porder].n_next = -1;
|
|
}
|
|
|
|
STATIC void newtorder(int index) {
|
|
static int porder;
|
|
|
|
if (torder != -1) {
|
|
tokens[porder].t_next = index;
|
|
}
|
|
else torder = index;
|
|
porder = index;
|
|
tokens[porder].t_next = -1;
|
|
}
|
|
|
|
void p_init(void)
|
|
{
|
|
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;
|
|
}
|
|
|
|
static void LL1_def(void);
|
|
static void LL2_rule(void);
|
|
static void LL3_listel(void);
|
|
static void LL4_firsts(void);
|
|
static void LL5_productions(
|
|
# line 244 "LLgen.g"
|
|
p_gram *p) ;
|
|
static void LL6_simpleproduction(
|
|
# line 330 "LLgen.g"
|
|
p_gram *p ,register int *conflres) ;
|
|
static void LL7_elem(
|
|
# line 478 "LLgen.g"
|
|
register p_gram pres) ;
|
|
static void LL8_repeats(
|
|
# line 600 "LLgen.g"
|
|
int *kind ,int *cnt) ;
|
|
static void LL9_number(
|
|
# line 617 "LLgen.g"
|
|
int *t) ;
|
|
void
|
|
LL0_spec(
|
|
void
|
|
) {
|
|
LLsincr(0);
|
|
# line 94 "LLgen.g"
|
|
{ acount = 0; p_init(); }
|
|
for (;;) {
|
|
goto L_1;
|
|
L_1 : {switch(LLcsymb) {
|
|
case /* EOFILE */ 0 : ;
|
|
break;
|
|
default:{int LL_1=LLnext(0);
|
|
;if (!LL_1) {
|
|
break;
|
|
}
|
|
else if (LL_1 & 1) goto L_1;}
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_TOKEN */ 8 : ;
|
|
case /* C_START */ 9 : ;
|
|
case /* C_FIRST */ 13 : ;
|
|
case /* C_LEXICAL */ 14 : ;
|
|
case /* C_PREFIX */ 15 : ;
|
|
case /* C_ONERROR */ 16 : ;
|
|
LL1_def();
|
|
LLread();
|
|
continue;
|
|
}
|
|
}
|
|
LLsdecr(0);
|
|
break;
|
|
}
|
|
# line 96 "LLgen.g"
|
|
{ /*
|
|
* Put an endmarker in temporary file
|
|
*/
|
|
putc('\0', fact);
|
|
putc('\0', fact);
|
|
free((p_mem) rule_table);
|
|
free((p_mem) alt_table);
|
|
}
|
|
}
|
|
static
|
|
void
|
|
LL1_def(
|
|
void
|
|
) {
|
|
# line 106 "LLgen.g"
|
|
register string p;
|
|
switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
LL2_rule();
|
|
break;
|
|
case /* C_TOKEN */ 8 : ;
|
|
LLtincr(23);
|
|
LLtincr(24);
|
|
LL_SAFE(C_TOKEN);
|
|
LL3_listel();
|
|
LLread();
|
|
for (;;) {
|
|
goto L_4;
|
|
L_4 : {switch(LLcsymb) {
|
|
case /* ';' */ 24 : ;
|
|
break;
|
|
default:{int LL_2=LLnext(44);
|
|
;if (!LL_2) {
|
|
break;
|
|
}
|
|
else if (LL_2 & 1) goto L_4;}
|
|
case /* ',' */ 23 : ;
|
|
LL_SAFE(',');
|
|
LL3_listel();
|
|
LLread();
|
|
continue;
|
|
}
|
|
}
|
|
LLtdecr(23);
|
|
break;
|
|
}
|
|
LLtdecr(24);
|
|
LL_SSCANDONE(';');
|
|
break;
|
|
case /* C_START */ 9 : ;
|
|
LLtincr(23);
|
|
LLtincr(2);
|
|
LLtincr(24);
|
|
LL_SAFE(C_START);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 116 "LLgen.g"
|
|
{ p = store(lextoken.t_string); }
|
|
LLtdecr(23);
|
|
LL_NOSCANDONE(',');
|
|
LLtdecr(2);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 121 "LLgen.g"
|
|
{ /*
|
|
* Put the declaration in the list
|
|
* of start symbols
|
|
*/
|
|
register p_gram temp;
|
|
register p_start ff;
|
|
|
|
temp = search(NONTERM,lextoken.t_string,BOTH);
|
|
ff = (p_start) alloc(sizeof(t_start));
|
|
ff->ff_nont = g_getcont(temp);
|
|
ff->ff_name = p;
|
|
ff->ff_next = start;
|
|
start = ff;
|
|
while ((ff = ff->ff_next)) {
|
|
if (! strcmp(p, ff->ff_name)) {
|
|
error(linecount, "\"%s\" already used in a %%start", p);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
LLtdecr(24);
|
|
LL_NOSCANDONE(';');
|
|
break;
|
|
case /* C_LEXICAL */ 14 : ;
|
|
LLtincr(24);
|
|
LL_SAFE(C_LEXICAL);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 147 "LLgen.g"
|
|
{ if (!lexical) {
|
|
lexical = store(lextoken.t_string);
|
|
}
|
|
else error(linecount,"Duplicate %%lexical", NULL);
|
|
}
|
|
LLtdecr(24);
|
|
LL_NOSCANDONE(';');
|
|
break;
|
|
case /* C_PREFIX */ 15 : ;
|
|
LLtincr(24);
|
|
LL_SAFE(C_PREFIX);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 157 "LLgen.g"
|
|
{ if (!prefix) {
|
|
prefix = store(lextoken.t_string);
|
|
if (strlen(prefix) > 6) {
|
|
error(linecount,
|
|
"%%prefix too long",NULL);
|
|
prefix[6] = 0;
|
|
}
|
|
}
|
|
else error(linecount,"Duplicate %%prefix", NULL);
|
|
}
|
|
LLtdecr(24);
|
|
LL_NOSCANDONE(';');
|
|
break;
|
|
case /* C_ONERROR */ 16 : ;
|
|
LLtincr(24);
|
|
LL_SAFE(C_ONERROR);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 169 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
if (non_corr) {
|
|
warning(linecount, "%%onerror conflicts with -n option", NULL);
|
|
}
|
|
else
|
|
#endif
|
|
if (! onerror) {
|
|
onerror = store(lextoken.t_string);
|
|
}
|
|
else error(linecount,"Duplicate %%onerror", NULL);
|
|
}
|
|
LLtdecr(24);
|
|
LL_NOSCANDONE(';');
|
|
break;
|
|
default:
|
|
LL_SSCANDONE(C_ACTION);
|
|
# line 182 "LLgen.g"
|
|
{ acount++; }
|
|
break;
|
|
case /* C_FIRST */ 13 : ;
|
|
LL4_firsts();
|
|
break;
|
|
}
|
|
}
|
|
static
|
|
void
|
|
LL3_listel(
|
|
void
|
|
) {
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 192 "LLgen.g"
|
|
{ p_gram temp = search(TERMINAL,lextoken.t_string,ENTERING);
|
|
newtorder(g_getcont(temp));
|
|
tokens[g_getcont(temp)].t_lineno = linecount;
|
|
}
|
|
}
|
|
static
|
|
void
|
|
LL2_rule(
|
|
void
|
|
) {
|
|
# line 198 "LLgen.g"
|
|
register p_nont p;
|
|
p_gram rr;
|
|
register p_gram temp;
|
|
|
|
LLtincr(6);
|
|
LLtincr(7);
|
|
LLtincr(25);
|
|
LLsincr(1);
|
|
LLtincr(24);
|
|
LL_SAFE(C_IDENT);
|
|
# line 205 "LLgen.g"
|
|
{ temp = search(NONTERM,lextoken.t_string,BOTH);
|
|
p = &nonterms[g_getcont(temp)];
|
|
if (p->n_rule) {
|
|
error(linecount,
|
|
"Nonterminal %s already defined", lextoken.t_string);
|
|
}
|
|
/*
|
|
* Remember the order in which the nonterminals
|
|
* were defined. Code must be generated in that
|
|
* order to keep track with the actions on the
|
|
* temporary file
|
|
*/
|
|
newnorder(p - nonterms);
|
|
p->n_count = acount;
|
|
acount = 0;
|
|
p->n_lineno = linecount;
|
|
p->n_off = ftell(fact);
|
|
}
|
|
LLread();
|
|
goto L_1;
|
|
L_1 : {switch(LLcsymb) {
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* ':' */ 25 : ;
|
|
LLtdecr(6);
|
|
break;
|
|
default:{int LL_3=LLnext(262);
|
|
;if (!LL_3) {
|
|
LLtdecr(6);
|
|
break;
|
|
}
|
|
else if (LL_3 & 1) goto L_1;}
|
|
case /* C_PARAMS */ 6 : ;
|
|
LLtdecr(6);
|
|
LL_SAFE(C_PARAMS);
|
|
# line 223 "LLgen.g"
|
|
{ if (lextoken.t_num > 0) {
|
|
p->n_flags |= PARAMS;
|
|
if (lextoken.t_num > 15) {
|
|
error(linecount,"Too many parameters", NULL);
|
|
}
|
|
else setntparams(p,lextoken.t_num);
|
|
}
|
|
}
|
|
LLread();
|
|
}
|
|
}
|
|
goto L_2;
|
|
L_2 : {switch(LLcsymb) {
|
|
case /* ':' */ 25 : ;
|
|
LLtdecr(7);
|
|
break;
|
|
default:{int LL_4=LLnext(263);
|
|
;if (!LL_4) {
|
|
LLtdecr(7);
|
|
break;
|
|
}
|
|
else if (LL_4 & 1) goto L_2;}
|
|
case /* C_ACTION */ 7 : ;
|
|
LLtdecr(7);
|
|
LL_SAFE(C_ACTION);
|
|
# line 232 "LLgen.g"
|
|
{ p->n_flags |= LOCALS; }
|
|
LLread();
|
|
}
|
|
}
|
|
LLtdecr(25);
|
|
LL_SCANDONE(':');
|
|
# line 234 "LLgen.g"
|
|
{ in_production = 1; }
|
|
LLread();
|
|
LLsdecr(1);
|
|
LL5_productions(
|
|
# line 235 "LLgen.g"
|
|
&rr);
|
|
LLtdecr(24);
|
|
LL_SCANDONE(';');
|
|
# line 236 "LLgen.g"
|
|
{ in_production = 0; }
|
|
# line 241 "LLgen.g"
|
|
{ nonterms[g_getcont(temp)].n_rule = rr;}
|
|
}
|
|
static
|
|
void
|
|
LL5_productions(
|
|
# line 244 "LLgen.g"
|
|
p_gram *p)
|
|
{
|
|
# line 248 "LLgen.g"
|
|
p_gram prod;
|
|
int conflres = 0;
|
|
int t = 0;
|
|
int haddefault = 0;
|
|
int altcnt = 0;
|
|
int o_lc, n_lc;
|
|
|
|
LLtincr(26);
|
|
# line 255 "LLgen.g"
|
|
{ o_lc = linecount; }
|
|
LL6_simpleproduction(
|
|
# line 256 "LLgen.g"
|
|
p,&conflres);
|
|
# line 257 "LLgen.g"
|
|
{ if (conflres & DEF) haddefault = 1; }
|
|
goto L_2; /* so that the label is used for certain */
|
|
L_2: ;
|
|
switch(LLcsymb) {
|
|
case /* '|' */ 26 : ;
|
|
LLtdecr(26);
|
|
LLsincr(1);
|
|
LLsdecr(1);
|
|
LLtincr(26);
|
|
for (;;) {
|
|
LL_SAFE('|');
|
|
# line 259 "LLgen.g"
|
|
{ n_lc = linecount; }
|
|
LLread();
|
|
LL6_simpleproduction(
|
|
# line 260 "LLgen.g"
|
|
&prod,&t);
|
|
# line 261 "LLgen.g"
|
|
{ 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,
|
|
"More than one %%default in alternation", NULL);
|
|
}
|
|
haddefault = 1;
|
|
}
|
|
mkalt(*p,conflres,o_lc,&alt_table[n_alts++]);
|
|
altcnt++;
|
|
o_lc = n_lc;
|
|
conflres = t;
|
|
t = 0;
|
|
*p = prod;
|
|
}
|
|
goto L_4;
|
|
L_4 : {switch(LLcsymb) {
|
|
case /* ';' */ 24 : ;
|
|
case /* ']' */ 28 : ;
|
|
break;
|
|
default:{int LL_5=LLnext(124);
|
|
;if (!LL_5) {
|
|
break;
|
|
}
|
|
else if (LL_5 & 1) goto L_4;}
|
|
case /* '|' */ 26 : ;
|
|
continue;
|
|
}
|
|
}
|
|
LLtdecr(26);
|
|
break;
|
|
}
|
|
# line 280 "LLgen.g"
|
|
{ if (conflres & (COND|PREFERING|AVOIDING)) {
|
|
error(n_lc,
|
|
"Resolver on last alternative not allowed", NULL);
|
|
}
|
|
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);
|
|
}
|
|
break;
|
|
case /* ';' */ 24 : ;
|
|
case /* ']' */ 28 : ;
|
|
goto L_3;
|
|
L_3: ;
|
|
LLtdecr(26);
|
|
# line 290 "LLgen.g"
|
|
{ if (conflres & (COND|PREFERING|AVOIDING)) {
|
|
error(o_lc,
|
|
"No alternation conflict resolver allowed here", NULL);
|
|
}
|
|
/*
|
|
if (conflres & DEF) {
|
|
error(o_lc,
|
|
"No %%default allowed here", NULL);
|
|
}
|
|
*/
|
|
}
|
|
break;
|
|
default: if (LLskip()) goto L_2;
|
|
goto L_3;
|
|
}
|
|
# line 302 "LLgen.g"
|
|
{ n_alts -= altcnt; }
|
|
}
|
|
# line 304 "LLgen.g"
|
|
|
|
|
|
STATIC void mkalt(p_gram prod, int condition,int lc,register p_gram res)
|
|
{
|
|
/*
|
|
* Create an alternation and initialise it.
|
|
*/
|
|
register p_link l;
|
|
static p_link list;
|
|
static int cnt;
|
|
|
|
if (! cnt) {
|
|
cnt = 50;
|
|
list = (p_link) alloc(50 * sizeof(t_link));
|
|
}
|
|
cnt--;
|
|
l = list++;
|
|
l->l_rule = prod;
|
|
l->l_flag = condition;
|
|
g_setlink(res,l);
|
|
g_settype(res,ALTERNATION);
|
|
res->g_lineno = lc;
|
|
nalts++;
|
|
}
|
|
static
|
|
void
|
|
LL6_simpleproduction(
|
|
# line 330 "LLgen.g"
|
|
p_gram *p ,register int *conflres)
|
|
{
|
|
# line 331 "LLgen.g"
|
|
t_gram elem;
|
|
int elmcnt = 0;
|
|
int cnt, kind;
|
|
int termdeleted = 0;
|
|
|
|
LLtincr(19);
|
|
LLsincr(2);
|
|
LLtincr(22);
|
|
LLsincr(3);
|
|
goto L_1;
|
|
L_1 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_IF */ 10 : ;
|
|
case /* C_AVOID */ 17 : ;
|
|
case /* C_PREFER */ 18 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* C_ILLEGAL */ 22 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLtdecr(19);
|
|
break;
|
|
default:{int LL_6=LLnext(275);
|
|
;if (!LL_6) {
|
|
LLtdecr(19);
|
|
break;
|
|
}
|
|
else if (LL_6 & 1) goto L_1;}
|
|
case /* C_DEFAULT */ 19 : ;
|
|
LLtdecr(19);
|
|
LL_SAFE(C_DEFAULT);
|
|
# line 336 "LLgen.g"
|
|
{ *conflres |= DEF; }
|
|
LLread();
|
|
}
|
|
}
|
|
goto L_2;
|
|
L_2 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* C_ILLEGAL */ 22 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLsdecr(2);
|
|
break;
|
|
default:{int LL_7=LLnext(-8);
|
|
;if (!LL_7) {
|
|
LLsdecr(2);
|
|
break;
|
|
}
|
|
else if (LL_7 & 1) goto L_2;}
|
|
case /* C_IF */ 10 : ;
|
|
case /* C_AVOID */ 17 : ;
|
|
case /* C_PREFER */ 18 : ;
|
|
LLsdecr(2);
|
|
switch(LLcsymb) {
|
|
case /* C_IF */ 10 : ;
|
|
LL_SAFE(C_IF);
|
|
LL_NOSCANDONE(C_EXPR);
|
|
# line 342 "LLgen.g"
|
|
{ *conflres |= COND; }
|
|
break;
|
|
default:
|
|
LL_SAFE(C_PREFER);
|
|
# line 343 "LLgen.g"
|
|
{ *conflres |= PREFERING; }
|
|
break;
|
|
case /* C_AVOID */ 17 : ;
|
|
LL_SAFE(C_AVOID);
|
|
# line 344 "LLgen.g"
|
|
{ *conflres |= AVOIDING; }
|
|
break;
|
|
}
|
|
LLread();
|
|
}
|
|
}
|
|
goto L_6;
|
|
L_6 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLtdecr(22);
|
|
break;
|
|
default:{int LL_8=LLnext(278);
|
|
;if (!LL_8) {
|
|
LLtdecr(22);
|
|
break;
|
|
}
|
|
else if (LL_8 & 1) goto L_6;}
|
|
case /* C_ILLEGAL */ 22 : ;
|
|
LLtdecr(22);
|
|
LL_SAFE(C_ILLEGAL);
|
|
# line 346 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
if (n_rules >= max_rules-2) {
|
|
rule_table = (p_gram) ralloc(
|
|
(p_mem) rule_table,
|
|
(max_rules+=RULEINCR)*sizeof(t_gram));
|
|
}
|
|
elmcnt++;
|
|
rule_table[n_rules++] =
|
|
*search(TERMINAL, "LLILLEGAL", BOTH);
|
|
if (*conflres & DEF) {
|
|
error(linecount, "%%illegal not allowed in %%default rule", NULL);
|
|
}
|
|
#endif
|
|
}
|
|
LLread();
|
|
}
|
|
}
|
|
for (;;) {
|
|
goto L_7;
|
|
L_7 : {switch(LLcsymb) {
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* ']' */ 28 : ;
|
|
break;
|
|
default:{int LL_9=LLnext(-12);
|
|
;if (!LL_9) {
|
|
break;
|
|
}
|
|
else if (LL_9 & 1) goto L_7;}
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_NUMBER */ 3 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* '?' */ 29 : ;
|
|
case /* '*' */ 30 : ;
|
|
case /* '+' */ 31 : ;
|
|
LLsincr(4);
|
|
LL7_elem(
|
|
# line 362 "LLgen.g"
|
|
&elem);
|
|
# line 363 "LLgen.g"
|
|
{ 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;
|
|
}
|
|
goto L_9; /* so that the label is used for certain */
|
|
L_9: ;
|
|
switch(LLcsymb) {
|
|
case /* C_NUMBER */ 3 : ;
|
|
case /* '?' */ 29 : ;
|
|
case /* '*' */ 30 : ;
|
|
case /* '+' */ 31 : ;
|
|
LLsdecr(4);
|
|
LL8_repeats(
|
|
# line 371 "LLgen.g"
|
|
&kind, &cnt);
|
|
# line 372 "LLgen.g"
|
|
{ if (g_gettype(&elem) != TERM) {
|
|
rule_table[n_rules] = elem;
|
|
g_settype((&rule_table[n_rules+1]),EORULE);
|
|
mkterm(copyrule(&rule_table[n_rules],2),
|
|
0,
|
|
elem.g_lineno,
|
|
&elem);
|
|
}
|
|
}
|
|
break;
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
goto L_10;
|
|
L_10: ;
|
|
LLsdecr(4);
|
|
# line 382 "LLgen.g"
|
|
{ if (g_gettype(&elem) == TERM) {
|
|
register p_term q = g_getterm(&elem);
|
|
|
|
if (! (q->t_flags & RESOLVER) &&
|
|
g_gettype(q->t_rule) != ALTERNATION &&
|
|
g_gettype(q->t_rule) != EORULE) {
|
|
while (g_gettype(q->t_rule) != EORULE) {
|
|
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);
|
|
n_rules--;
|
|
elmcnt--;
|
|
if (q == t_list - 1) {
|
|
t_list--;
|
|
nterms--;
|
|
t_cnt++;
|
|
}
|
|
termdeleted = 1;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default: if (LLskip()) goto L_9;
|
|
goto L_10;
|
|
}
|
|
# line 409 "LLgen.g"
|
|
{ if (!termdeleted && g_gettype(&elem) == TERM) {
|
|
register p_term q;
|
|
|
|
q = g_getterm(&elem);
|
|
r_setkind(q,kind);
|
|
r_setnum(q,cnt);
|
|
if ((q->t_flags & RESOLVER) &&
|
|
(kind == PLUS || kind == FIXED)) {
|
|
error(linecount,
|
|
"%%while not allowed in this term", NULL);
|
|
}
|
|
/*
|
|
* A persistent fixed term is the same
|
|
* as a non-persistent fixed term.
|
|
* Should we complain?
|
|
if ((q->t_flags & PERSISTENT) &&
|
|
kind == FIXED) {
|
|
error(linecount,
|
|
"Illegal %%persistent", NULL);
|
|
}
|
|
*/
|
|
}
|
|
termdeleted = 0;
|
|
elmcnt++;
|
|
rule_table[n_rules++] = elem;
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
LLsdecr(3);
|
|
break;
|
|
}
|
|
# line 435 "LLgen.g"
|
|
{ register p_term q;
|
|
|
|
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);
|
|
}
|
|
}
|
|
# line 452 "LLgen.g"
|
|
|
|
|
|
STATIC void mkterm(p_gram prod, int flags,int lc,register p_gram result)
|
|
{
|
|
/*
|
|
* Create a term, initialise it and return
|
|
* a grammar element containing it
|
|
*/
|
|
register p_term q;
|
|
|
|
if (! t_cnt) {
|
|
t_cnt = 50;
|
|
t_list = (p_term) alloc(50 * sizeof(t_term));
|
|
}
|
|
t_cnt--;
|
|
q = t_list++;
|
|
q->t_rule = prod;
|
|
q->t_contains = 0;
|
|
q->t_flags = flags;
|
|
g_settype(result,TERM);
|
|
g_setterm(result,q);
|
|
result->g_lineno = lc;
|
|
nterms++;
|
|
}
|
|
static
|
|
void
|
|
LL7_elem(
|
|
# line 478 "LLgen.g"
|
|
register p_gram pres)
|
|
{
|
|
# line 479 "LLgen.g"
|
|
register int t = 0;
|
|
p_gram p1;
|
|
int ln;
|
|
p_gram pe;
|
|
#ifdef NON_CORRECTING
|
|
int erroneous = 0;
|
|
#endif
|
|
|
|
switch(LLcsymb) {
|
|
case /* '[' */ 27 : ;
|
|
LLtincr(11);
|
|
LLtincr(12);
|
|
LLsincr(1);
|
|
LLtincr(28);
|
|
LL_SAFE('[');
|
|
# line 487 "LLgen.g"
|
|
{ ln = linecount; }
|
|
LLread();
|
|
goto L_4;
|
|
L_4 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_IF */ 10 : ;
|
|
case /* C_PERSISTENT */ 12 : ;
|
|
case /* C_AVOID */ 17 : ;
|
|
case /* C_PREFER */ 18 : ;
|
|
case /* C_DEFAULT */ 19 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* C_ILLEGAL */ 22 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLtdecr(11);
|
|
break;
|
|
default:{int LL_10=LLnext(267);
|
|
;if (!LL_10) {
|
|
LLtdecr(11);
|
|
break;
|
|
}
|
|
else if (LL_10 & 1) goto L_4;}
|
|
case /* C_WHILE */ 11 : ;
|
|
LLtdecr(11);
|
|
LL_SAFE(C_WHILE);
|
|
LL_NOSCANDONE(C_EXPR);
|
|
# line 488 "LLgen.g"
|
|
{ t |= RESOLVER; }
|
|
LLread();
|
|
}
|
|
}
|
|
goto L_5;
|
|
L_5 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_IF */ 10 : ;
|
|
case /* C_AVOID */ 17 : ;
|
|
case /* C_PREFER */ 18 : ;
|
|
case /* C_DEFAULT */ 19 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* C_ILLEGAL */ 22 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLtdecr(12);
|
|
break;
|
|
default:{int LL_11=LLnext(268);
|
|
;if (!LL_11) {
|
|
LLtdecr(12);
|
|
break;
|
|
}
|
|
else if (LL_11 & 1) goto L_5;}
|
|
case /* C_PERSISTENT */ 12 : ;
|
|
LLtdecr(12);
|
|
LL_SAFE(C_PERSISTENT);
|
|
# line 490 "LLgen.g"
|
|
{ t |= PERSISTENT; }
|
|
LLread();
|
|
}
|
|
}
|
|
LLsdecr(1);
|
|
LL5_productions(
|
|
# line 492 "LLgen.g"
|
|
&p1);
|
|
LLtdecr(28);
|
|
LL_SCANDONE(']');
|
|
# line 493 "LLgen.g"
|
|
{
|
|
mkterm(p1,t,ln,pres);
|
|
}
|
|
LLread();
|
|
break;
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
LLsincr(5);
|
|
goto L_6;
|
|
L_6 : {switch(LLcsymb) {
|
|
default:
|
|
break;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
LL_SAFE(C_ERRONEOUS);
|
|
# line 497 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
erroneous = 1;
|
|
#endif
|
|
}
|
|
LLread();
|
|
}
|
|
}
|
|
goto L_8; /* so that the label is used for certain */
|
|
L_8: ;
|
|
switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
goto L_9;
|
|
L_9: ;
|
|
LLsdecr(5);
|
|
LLtincr(6);
|
|
LL_SSCANDONE(C_IDENT);
|
|
# line 505 "LLgen.g"
|
|
{ pe = search(UNKNOWN,lextoken.t_string,BOTH);
|
|
*pres = *pe;
|
|
#ifdef NON_CORRECTING
|
|
if (erroneous) {
|
|
if (g_gettype(pres) != TERMINAL){
|
|
warning(linecount,
|
|
"Erroneous only allowed on terminal", NULL);
|
|
erroneous = 0;
|
|
}
|
|
else
|
|
pres->g_erroneous = 1;
|
|
}
|
|
#endif
|
|
|
|
}
|
|
LLread();
|
|
goto L_10;
|
|
L_10 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_NUMBER */ 3 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
case /* '?' */ 29 : ;
|
|
case /* '*' */ 30 : ;
|
|
case /* '+' */ 31 : ;
|
|
LLtdecr(6);
|
|
break;
|
|
default:{int LL_12=LLnext(262);
|
|
;if (!LL_12) {
|
|
LLtdecr(6);
|
|
break;
|
|
}
|
|
else if (LL_12 & 1) goto L_10;}
|
|
case /* C_PARAMS */ 6 : ;
|
|
LLtdecr(6);
|
|
LL_SAFE(C_PARAMS);
|
|
# line 520 "LLgen.g"
|
|
{ if (lextoken.t_num > 15) {
|
|
error(linecount,"Too many parameters", NULL);
|
|
} else g_setnpar(pres,lextoken.t_num);
|
|
if (g_gettype(pres) == TERMINAL) {
|
|
error(linecount,
|
|
"Terminal with parameters", NULL);
|
|
}
|
|
}
|
|
LLread();
|
|
}
|
|
}
|
|
break;
|
|
default: if (LLskip()) goto L_8;
|
|
goto L_9;
|
|
case /* C_LITERAL */ 4 : ;
|
|
LLsdecr(5);
|
|
LL_SAFE(C_LITERAL);
|
|
# line 529 "LLgen.g"
|
|
{ pe = search(LITERAL,lextoken.t_string,BOTH);
|
|
*pres = *pe;
|
|
#ifdef NON_CORRECTING
|
|
if (erroneous)
|
|
pres->g_erroneous = 1;
|
|
#endif
|
|
}
|
|
LLread();
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
LLtincr(7);
|
|
# line 537 "LLgen.g"
|
|
{ g_settype(pres,ACTION);
|
|
pres->g_lineno = linecount;
|
|
#ifdef NON_CORRECTING
|
|
g_setsubparse(pres, (p_start) 0);
|
|
#endif
|
|
}
|
|
goto L_11;
|
|
L_11 : {switch(LLcsymb) {
|
|
default:
|
|
break;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
LLtincr(23);
|
|
LLtincr(24);
|
|
LL_SAFE(C_SUBSTART);
|
|
# line 546 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
nsubstarts++;
|
|
#endif
|
|
}
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 553 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
register p_gram temp;
|
|
register p_start subp;
|
|
|
|
temp = search(NONTERM,lextoken.t_string,BOTH);
|
|
subp = (p_start) alloc (sizeof(t_start));
|
|
|
|
subp->ff_nont = g_getcont(temp);
|
|
subp->ff_name = (string) 0;
|
|
subp->ff_next = (p_start) 0;
|
|
g_setsubparse(pres, subp);
|
|
#endif
|
|
}
|
|
LLread();
|
|
for (;;) {
|
|
goto L_12;
|
|
L_12 : {switch(LLcsymb) {
|
|
case /* ';' */ 24 : ;
|
|
break;
|
|
default:{int LL_13=LLnext(44);
|
|
;if (!LL_13) {
|
|
break;
|
|
}
|
|
else if (LL_13 & 1) goto L_12;}
|
|
case /* ',' */ 23 : ;
|
|
LL_SAFE(',');
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 569 "LLgen.g"
|
|
{
|
|
#ifdef NON_CORRECTING
|
|
register p_gram temp;
|
|
register p_start ff;
|
|
|
|
temp = search(NONTERM,lextoken.t_string,BOTH);
|
|
|
|
ff = g_getsubparse(pres);
|
|
while (ff) {
|
|
if (ff->ff_nont == g_getcont(temp)) {
|
|
warning(linecount, "\"%s\" used twice in %%substart", lextoken.t_string);
|
|
break;
|
|
}
|
|
ff = ff->ff_next;
|
|
|
|
}
|
|
|
|
ff = (p_start) alloc(sizeof(t_start));
|
|
ff->ff_nont = g_getcont(temp);
|
|
ff->ff_name = (string) 0;
|
|
ff->ff_next = g_getsubparse(pres);
|
|
g_setsubparse(pres, ff);
|
|
#endif
|
|
}
|
|
LLread();
|
|
continue;
|
|
}
|
|
}
|
|
LLtdecr(23);
|
|
break;
|
|
}
|
|
LLtdecr(24);
|
|
LL_SSCANDONE(';');
|
|
LLread();
|
|
}
|
|
}
|
|
LLtdecr(7);
|
|
LL_SCANDONE(C_ACTION);
|
|
LLread();
|
|
break;
|
|
}
|
|
}
|
|
static
|
|
void
|
|
LL8_repeats(
|
|
# line 600 "LLgen.g"
|
|
int *kind ,int *cnt)
|
|
{
|
|
# line 600 "LLgen.g"
|
|
int t1 = 0;
|
|
switch(LLcsymb) {
|
|
default:
|
|
LL_SAFE('?');
|
|
# line 602 "LLgen.g"
|
|
{ *kind = OPT; }
|
|
LLread();
|
|
break;
|
|
case /* '*' */ 30 : ;
|
|
case /* '+' */ 31 : ;
|
|
LLtincr(3);
|
|
switch(LLcsymb) {
|
|
default:
|
|
LL_SAFE('*');
|
|
# line 603 "LLgen.g"
|
|
{ *kind = STAR; }
|
|
break;
|
|
case /* '+' */ 31 : ;
|
|
LL_SAFE('+');
|
|
# line 604 "LLgen.g"
|
|
{ *kind = PLUS; }
|
|
break;
|
|
}
|
|
LLread();
|
|
goto L_7;
|
|
L_7 : {switch(LLcsymb) {
|
|
case /* C_IDENT */ 2 : ;
|
|
case /* C_LITERAL */ 4 : ;
|
|
case /* C_ACTION */ 7 : ;
|
|
case /* C_SUBSTART */ 20 : ;
|
|
case /* C_ERRONEOUS */ 21 : ;
|
|
case /* ';' */ 24 : ;
|
|
case /* '|' */ 26 : ;
|
|
case /* '[' */ 27 : ;
|
|
case /* ']' */ 28 : ;
|
|
LLtdecr(3);
|
|
break;
|
|
default:{int LL_14=LLnext(259);
|
|
;if (!LL_14) {
|
|
LLtdecr(3);
|
|
break;
|
|
}
|
|
else if (LL_14 & 1) goto L_7;}
|
|
case /* C_NUMBER */ 3 : ;
|
|
LLtdecr(3);
|
|
LL9_number(
|
|
# line 606 "LLgen.g"
|
|
&t1);
|
|
LLread();
|
|
}
|
|
}
|
|
# line 607 "LLgen.g"
|
|
{ if (t1 == 1) {
|
|
t1 = 0;
|
|
if (*kind == STAR) *kind = OPT;
|
|
if (*kind == PLUS) *kind = FIXED;
|
|
}
|
|
}
|
|
break;
|
|
case /* C_NUMBER */ 3 : ;
|
|
LL9_number(
|
|
# line 613 "LLgen.g"
|
|
&t1);
|
|
LLread();
|
|
break;
|
|
}
|
|
# line 614 "LLgen.g"
|
|
{ *cnt = t1; }
|
|
}
|
|
static
|
|
void
|
|
LL9_number(
|
|
# line 617 "LLgen.g"
|
|
int *t)
|
|
{
|
|
LL_SAFE(C_NUMBER);
|
|
# line 619 "LLgen.g"
|
|
{ *t = lextoken.t_num;
|
|
if (*t <= 0 || *t >= 8192) {
|
|
error(linecount,"Illegal number", NULL);
|
|
}
|
|
}
|
|
}
|
|
static
|
|
void
|
|
LL4_firsts(
|
|
void
|
|
) {
|
|
# line 626 "LLgen.g"
|
|
register string p;
|
|
LLtincr(23);
|
|
LLtincr(2);
|
|
LLtincr(24);
|
|
LL_SAFE(C_FIRST);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
# line 628 "LLgen.g"
|
|
{ p = store(lextoken.t_string); }
|
|
LLtdecr(23);
|
|
LL_NOSCANDONE(',');
|
|
LLtdecr(2);
|
|
LL_NOSCANDONE(C_IDENT);
|
|
LLtdecr(24);
|
|
LL_NOSCANDONE(';');
|
|
# line 630 "LLgen.g"
|
|
{ /*
|
|
* Store this %first in the list belonging
|
|
* to this input file
|
|
*/
|
|
p_gram temp;
|
|
register p_first ff;
|
|
|
|
temp = search(NONTERM,lextoken.t_string,BOTH);
|
|
ff = (p_first) alloc(sizeof(t_first));
|
|
ff->ff_nont = g_getcont(temp);
|
|
ff->ff_name = p;
|
|
ff->ff_next = pfile->f_firsts;
|
|
pfile->f_firsts = ff;
|
|
}
|
|
}
|
|
|
|
# line 645 "LLgen.g"
|
|
|
|
|
|
STATIC p_gram copyrule(register p_gram p,int length)
|
|
{
|
|
/*
|
|
* Returns a pointer to a grammar rule that was created in
|
|
* p. The space pointed to by p can now be reused
|
|
*/
|
|
register p_gram t;
|
|
p_gram rule;
|
|
|
|
t = (p_gram) alloc(length * sizeof(t_gram));
|
|
rule = t;
|
|
while (length--) {
|
|
*t++ = *p++;
|
|
}
|
|
return rule;
|
|
}
|
|
|