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; } }
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; }
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); }
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; } }
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); } }
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); } }
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); } }
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); } }
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; }
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); } } }
CcObject_t * CcArrayList_First(CcArrayList_t * self, CcArrayListIter_t * iter) { iter->index = 0; return CcArrayList_Next(self, iter); }
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; }