home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume19
/
wacco
/
part01
/
check.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-19
|
2KB
|
95 lines
// Copyright (c) 1991 by Parag Patel. All Rights Reserved.
static const char rcs_id[] = "$Header: check.C,v 1.6 91/02/22 16:07:20 hmgr Exp $";
#include "defs.h"
static void dostruct(symbol *sym)
{
if (sym->rettype == NULL)
return;
if (dargstyle)
{
sym->mkstruct = strpbrk(sym->rettype, ",;") != NULL;
return;
}
for (char *s = sym->rettype; *s != '\0'; s++)
if (*s == ',')
{
sym->mkstruct = TRUE;
*s = ';';
}
}
void check()
{
int i;
symbol *sym;
symnode *n;
Bitset curr(numsymbols());
Bitset set(numsymbols());
Bitset t(numsymbols());
if (!exportedname && !startsymbol->export)
startsymbol->export = TRUE;
for (i = 0; i < numnonterms(); i++)
{
sym = getnonterm(i);
if (sym->type != NONTERMINAL)
continue;
dostruct(sym);
if (sym->mkstruct && sym->export)
error("Non-simple type for exported non-terminal \"%s\"",
sym->name);
curr.clear();
for (n = sym->node; n != NULL; n = n->or)
{
set.clear();
boolean isfirst = TRUE;
for (symnode *s = n; s != NULL; s = s->next)
{
if (s->sym->type == CODE)
continue;
if (isfirst)
if (s->sym == sym)
if (sym->realname != NULL && sym->name != sym->realname)
error("Head recursion in grouped rules for \"%s\"",
sym->realname);
else
error("Head recursion in rules for \"%s\"",
sym->name);
isfirst = FALSE;
set |= *s->sym->first;
if (!s->sym->first->isin(EMPTY))
break;
}
t = curr;
t &= set;
if (t.size() == 0 || (t.size() == 1 && t.isin(EMPTY)))
curr |= set;
else if (sym->type == NONTERMINAL && sym->realname != NULL
&& sym->name != sym->realname)
error("Ambiguous [non-LL(1)] grouped rules in \"%s\"",
sym->realname);
else
error("Ambiguous [non-LL(1)] rules for \"%s\"", sym->name);
}
for (symnode *or = sym->node; or != NULL; or = or->or)
for (n = or; n != NULL; n = n->next)
if (n->sym->type == TERMINAL && n->alias != NULL)
if (sym->realname != NULL && sym->name != sym->realname)
error(
"Alias \"%s\" defined for terminal \"%s\" in grouped rules for \"%s\"",
n->alias, n->sym->name, sym->realname);
else
error(
"Alias \"%s\" defined for terminal \"%s\" in rules for \"%s\"",
n->alias, n->sym->name, sym->name);
}
}