static void SCSOS_GenCond(CcCSharpBaseOutputScheme_t * self, CcOutput_t * output, const char * prefix, const char * suffix, const CcBitArray_t * s, const CcNode_t * p) { const CcNodeRSLV_t * prslv; int n; CcArrayListIter_t iter; const CcSymbol_t * sym; const CcArrayList_t * terminals; if (p->base.type == node_rslv) { prslv = (CcNodeRSLV_t *)p; CcPrintfIL(output, "%s%s%s", prefix, prslv->pos->text, suffix); } else if ((n = CcBitArray_Elements(s)) == 0) { CcPrintfIL(output, "%s%s%s", prefix, "false", suffix); } else if (n <= maxTerm) { CcPrintfI(output, "%s", prefix); terminals = &self->base.globals->symtab.terminals; for (sym = (const CcSymbol_t *)CcArrayList_FirstC(terminals, &iter); sym; sym = (const CcSymbol_t *)CcArrayList_NextC(terminals, &iter)) if (CcBitArray_Get(s, sym->kind)) { CcPrintf(output, "la.kind == %d", sym->kind); if (--n > 0) CcPrintf(output, " || "); } CcPrintfL(output, "%s", suffix); } else { CcPrintfIL(output, "%sStartOf(%d)%s", prefix, CcSyntaxSymSet_New(&self->symSet, s), suffix); } }
static void ATest(FILE * fp, CcBitArray_t * ba0, CcBitArray_t * ba1) { CcBitArray_t ba2; int idx, cnt, numbits = CcBitArray_getCount(ba0); CcBitArray_Dump(ba0, fp, "BitArray 0: ", "\n"); CcBitArray_Dump(ba1, fp, "BitArray 1: ", "\n"); cnt = 0; for (idx = 0; idx < numbits; ++idx) if (CcBitArray_Get(ba0, idx) && CcBitArray_Get(ba1, idx)) cnt = 1; COCO_ASSERT((CcBitArray_Intersect(ba0, ba1) == cnt)); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); COCO_ASSERT((CcBitArray_Equal(ba0, &ba2))); cnt = 0; for (idx = 0; idx < numbits; ++idx) { COCO_ASSERT(CcBitArray_Get(ba0, idx) == CcBitArray_Get(&ba2, idx)); if (CcBitArray_Get(ba0, idx)) ++cnt; } COCO_ASSERT((CcBitArray_Elements(ba0) == cnt)); COCO_ASSERT((CcBitArray_Or(&ba2, ba1) == 0)); CcBitArray_Dump(&ba2, fp, "Or: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) || CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); CcBitArray_Destruct(&ba2); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); COCO_ASSERT((CcBitArray_And(&ba2, ba1) == 0)); CcBitArray_Dump(&ba2, fp, "And: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) && CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); CcBitArray_Destruct(&ba2); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); CcBitArray_Subtract(&ba2, ba1); CcBitArray_Dump(&ba2, fp, "Subtract: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) && !CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); COCO_ASSERT(!CcBitArray_Intersect(ba1, &ba2)); CcBitArray_Destruct(&ba2); fprintf(fp, "\n"); }
/* FIX ME */ static void CcSyntax_CheckAlts(CcSyntax_t * self, CcNode_t * p) { CcBitArray_t s1, s2; CcNode_t * q; CcSymbolTable_t * symtab = &self->globals->symtab; while (p != NULL) { if (p->base.type == node_alt) { q = p; CcBitArray(&s1, symtab->terminals.Count); while (q != NULL) { /* For all alternatives */ CcSyntax_Expected0(self, &s2, q->sub, self->curSy); CcSyntax_CheckOverlap(self, &s1, &s2, 1); CcBitArray_Or(&s1, &s2); CcSyntax_CheckAlts(self, q->sub); q = q->down; CcBitArray_Destruct(&s2); } CcBitArray_Destruct(&s1); } else if (p->base.type == node_opt || p->base.type == node_iter) { /* E.g. [[...]] */ if (CcNode_DelSubGraph(p->sub)) { CcSyntax_LL1Error(self, 4, NULL); } else { CcSyntax_Expected0(self, &s1, p->sub, self->curSy); CcSyntax_Expected(self, &s2, p->next, self->curSy); CcSyntax_CheckOverlap(self, &s1, &s2, 2); CcSyntax_CheckAlts(self, p->sub); CcBitArray_Destruct(&s1); CcBitArray_Destruct(&s2); } } else if (p->base.type == node_any) { /* E.g. {ANY} ANY or [ANY] ANY */ if (CcBitArray_Elements(((CcNodeANY_t *)p)->set) == 0) CcSyntax_LL1Error(self, 3, NULL); } if (p->up) break; p = p->next; } }