Example #1
0
static void
CcSyntax_CompFollowSets(CcSyntax_t * self)
{
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * tarr = &symtab->terminals;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	sym->follow = CcBitArray(&sym->followSpace, tarr->Count);
	sym->nts = CcBitArray(&sym->ntsSpace, ntarr->Count);
    }
    CcBitArray_Set(((CcSymbolNT_t *)self->gramSy)->follow,
		   self->eofSy->kind, TRUE);

    self->visited = CcBitArray(&self->visitedSpace, self->base.nodes.Count);
    for (sym =(CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	self->curSy = (CcSymbol_t *)sym;
	CcSyntax_CompFollow(self, sym->graph);
    }
    CcBitArray_Destruct(self->visited); self->visited = NULL;

    for (sym =(CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	self->visited = CcBitArray(&self->visitedSpace, ntarr->Count);
	self->curSy = (CcSymbol_t *)sym;
	CcSyntax_Complete(self, sym);
	CcBitArray_Destruct(self->visited); self->visited = NULL;
    }
}
Example #2
0
static CcsBool_t
CcSyntax_AllNtToTerm(CcSyntax_t * self)
{
    CcBitArray_t mark;
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcsBool_t changed, ok = TRUE;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    CcBitArray(&mark, ntarr->Count);
    do {
	changed = FALSE;
	for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	     sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	    if (!CcBitArray_Get(&mark, sym->base.kind) &&
		CcSyntax_IsTerm(self, sym->graph, &mark)) {
		CcBitArray_Set(&mark, sym->base.kind, TRUE);
		changed = TRUE;
	    }
	}
    } while (changed);
    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	if (!CcBitArray_Get(&mark, sym->base.kind)) {
	    ok = FALSE;
	    CcsErrorPool_Error(self->globals->errpool, NULL,
			       " %s cannot be derived to terminals",
			       sym->base.name);
	}
    }
    CcBitArray_Destruct(&mark);
    return ok;
}
Example #3
0
static void
CcSyntax_CompAnySets(CcSyntax_t * self)
{
    CcArrayListIter_t iter; CcSymbolNT_t * sym;
    CcArrayList_t * nonterminals = &self->globals->symtab.nonterminals;

    for (sym = (CcSymbolNT_t *)CcArrayList_First(nonterminals, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(nonterminals, &iter))
	CcSyntax_FindAS(self, sym->graph);
}
Example #4
0
static void
CcSyntax_CompFirstSets(CcSyntax_t * self)
{
    CcBitArray_t fs;
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	sym->first = CcBitArray(&sym->firstSpace, symtab->terminals.Count);
	sym->firstReady = FALSE;
    }
    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	CcSyntax_First(self, &fs, sym->graph);
	CcBitArray_Destruct(sym->first);
	memcpy(sym->first, &fs, sizeof(fs));
	sym->firstReady = TRUE;
    }
}
Example #5
0
static void
CcSyntax_CheckLL1(CcSyntax_t * self)
{
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	self->curSy = (CcSymbol_t *)sym;
	CcSyntax_CheckAlts(self, sym->graph);
    }
}
Example #6
0
static void
CcSyntax_CheckOverlap(CcSyntax_t * self, CcBitArray_t * s1, CcBitArray_t * s2,
		      int cond)
{
    CcSymbolT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * tarr = &symtab->terminals;

    for (sym = (CcSymbolT_t *)CcArrayList_First(tarr, &iter);
	 sym; sym = (CcSymbolT_t *)CcArrayList_Next(tarr, &iter)) {
	if (CcBitArray_Get(s1, sym->base.kind)
	    && CcBitArray_Get(s2, sym->base.kind))
	    CcSyntax_LL1Error(self, cond, (CcSymbol_t *)sym);
    }
}
Example #7
0
static void
CcSyntax_CompDeletableSymbols(CcSyntax_t * self)
{
    CcsBool_t changed;
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;
    do {
	changed = FALSE;
	for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	     sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	    if (!sym->deletable && sym->graph != NULL &&
		CcNode_DelGraph(sym->graph)) {
		sym->deletable = TRUE; changed = TRUE;
	    }
	}
    } while (changed);
    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	if (sym->deletable) 
	    CcsErrorPool_Warning(self->globals->errpool, NULL,
				 " %s deletable", sym->base.name);
    }
}
Example #8
0
void
CcSyntax_SetupAnys(CcSyntax_t * self)
{
    CcNode_t * p; CcNodeANY_t * pany; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;

    for (p = (CcNode_t *)CcArrayList_First(&self->base.nodes, &iter);
	 p; p = (CcNode_t *)CcArrayList_Next(&self->base.nodes, &iter)) {
	if (p->base.type != node_any) continue;
	pany = (CcNodeANY_t *)p;
	pany->set = &pany->setSpace;
	CcBitArray1(pany->set, symtab->terminals.Count);
	CcBitArray_Set(pany->set, self->eofSy->kind, FALSE);
    }
}
Example #9
0
static void
CcSyntax_CompSyncSets(CcSyntax_t * self)
{
    CcSymbolNT_t * sym; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    self->allSyncSets = CcBitArray(&self->allSyncSetsSpace,
				   symtab->terminals.Count);
    CcBitArray_Set(self->allSyncSets, self->eofSy->kind, TRUE);
    self->visited = CcBitArray(&self->visitedSpace, self->base.nodes.Count);
    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	self->curSy = (CcSymbol_t *)sym;
	CcSyntax_CompSync(self, sym->graph);
    }
    CcBitArray_Destruct(self->visited); self->visited = NULL;
}
Example #10
0
static void
CcSyntax_Complete(CcSyntax_t * self, CcSymbolNT_t * sym)
{
    CcSymbolNT_t * s; CcArrayListIter_t iter;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    if (CcBitArray_Get(self->visited, sym->base.kind)) return;
    CcBitArray_Set(self->visited, sym->base.kind, TRUE);
    for (s = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 s; s = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	if (CcBitArray_Get(sym->nts, s->base.kind)) {
	    CcSyntax_Complete(self, s);
	    CcBitArray_Or(sym->follow, s->follow);
	    if ((CcSymbol_t *)sym == self->curSy)
		CcBitArray_Set(sym->nts, s->base.kind, FALSE);
	}
    }
}
Example #11
0
CcObject_t *
CcArrayList_First(CcArrayList_t * self, CcArrayListIter_t * iter)
{
    iter->index = 0;
    return CcArrayList_Next(self, iter);
}
Example #12
0
static CcsBool_t
CcSyntax_NoCircularProductions(CcSyntax_t * self)
{
    CcBitArray_t singles;
    SymbolPair_t * firstPair, * prevPair, * curPair, * curPair0;
    CcSymbolNT_t * sym; CcArrayListIter_t iter; int index;
    CcsBool_t ok, changed, onLeftSide, onRightSide;
    CcSymbol_t * leftsym, * rightsym;
    CcSymbolTable_t * symtab = &self->globals->symtab;
    CcArrayList_t * ntarr = &symtab->nonterminals;

    firstPair = NULL;
    CcBitArray(&singles, ntarr->Count);
    for (sym = (CcSymbolNT_t *)CcArrayList_First(ntarr, &iter);
	 sym; sym = (CcSymbolNT_t *)CcArrayList_Next(ntarr, &iter)) {
	CcBitArray_SetAll(&singles, FALSE);
	/* Get nonterminals s such that sym-->s */
	GetSingles(&singles, sym->graph);
	for (index = 0; index < ntarr->Count; ++index) {
	    if (!CcBitArray_Get(&singles, index)) continue;
	    curPair = CcMalloc(sizeof(SymbolPair_t));
	    curPair->left = sym->base.kind;
	    curPair->right = index;
	    curPair->next = firstPair;
	    firstPair = curPair;
	}
    }
    CcBitArray_Destruct(&singles);

    do {
	changed = FALSE;
	prevPair = NULL; curPair = firstPair;
	while (curPair) {
	    onLeftSide = FALSE; onRightSide = FALSE;
	    for (curPair0 = curPair; curPair0; curPair0 = curPair0->next) {
		if (curPair->left == curPair0->right) onRightSide = TRUE;
		if (curPair->right == curPair0->left) onLeftSide = TRUE;
	    }
	    if (onLeftSide && onRightSide) { /* Circular Production found. */
		prevPair = curPair; curPair = curPair->next;
	    } else { /* Remove non-circular nonterminal symbol pair. */
		curPair0 = curPair->next;
		if (prevPair == NULL)  firstPair = curPair0;
		else  prevPair->next = curPair0;
		CcFree(curPair);
		curPair = curPair0;
		changed = TRUE;
	    }
	}
    } while (changed);

    ok = TRUE;
    for (curPair = firstPair; curPair; curPair = curPair0) {
	ok = FALSE;
	leftsym = (CcSymbol_t *)CcArrayList_Get(ntarr, curPair->left);
	rightsym = (CcSymbol_t *)CcArrayList_Get(ntarr, curPair->right);
	CcsErrorPool_Error(self->globals->errpool, NULL, " '%s' --> '%s'",
			   leftsym->name, rightsym->name);
	curPair0 = curPair->next;
	CcFree(curPair);
    }
    return ok;
}