Beispiel #1
0
static void
CcSyntax_FindAS(CcSyntax_t * self, CcNode_t * p)
{
    CcNode_t * a, * q;
    CcBitArray_t s0, s1;
    CcSymbolTable_t * symtab = &self->globals->symtab;

    while (p != NULL) {
	if (p->base.type == node_opt || p->base.type == node_iter) {
	    CcSyntax_FindAS(self, p->sub);
	    a = CcSyntax_LeadingAny(self, p->sub);
	    if (a != NULL) {
		CcSyntax_First(self, &s0, p->next);
		CcBitArray_Subtract(((CcNodeANY_t *)a)->set, &s0);
		CcBitArray_Destruct(&s0);
	    }
	} else if (p->base.type == node_alt) {
	    CcBitArray(&s1, symtab->terminals.Count);
	    q = p;
	    while (q != NULL) {
		CcSyntax_FindAS(self, q->sub);
		a = CcSyntax_LeadingAny(self, q->sub);
		if (a != NULL) {
		    CcSyntax_First(self, &s0, q->down);
		    CcBitArray_Or(&s0, &s1);
		    CcBitArray_Subtract(((CcNodeANY_t *)a)->set, &s0);
		    CcBitArray_Destruct(&s0);
		} else {
		    CcSyntax_First(self, &s0, q->sub);
		    CcBitArray_Or(&s1, &s0);
		    CcBitArray_Destruct(&s0);
		}
		q = q->down;
	    }
	    CcBitArray_Destruct(&s1);
	}
	if (p->up) break;
	p = p->next;
    }
}
Beispiel #2
0
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");
}
Beispiel #3
0
void
TestBitArray(FILE * fp)
{
    int idx, numbits;
    CcBitArray_t ba0, ba1, ba2;

    for (numbits = 0; numbits < 32; ++numbits) {
	COCO_ASSERT((CcBitArray(&ba0, numbits)));
	COCO_ASSERT((CcBitArray(&ba1, numbits)));
	ATest(fp, &ba0, &ba1);
	CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1);

	COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_SetAll(&ba0, 1);
	COCO_ASSERT((CcBitArray(&ba1, numbits)));
	ATest(fp, &ba0, &ba1);
	CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1);

	COCO_ASSERT((CcBitArray(&ba0, numbits)));
	COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_SetAll(&ba1, 1);
	ATest(fp, &ba0, &ba1);
	CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1);

	COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_SetAll(&ba0, 1);
	COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_SetAll(&ba1, 1);
	ATest(fp, &ba0, &ba1);
	CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1);

	for (idx = 0; idx < 128; ++idx) {
	    COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_RandomSet(&ba0);
	    COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_RandomSet(&ba1);
	    ATest(fp, &ba0, &ba1);

	    COCO_ASSERT((CcBitArray_Clone(&ba2, &ba0)));
	    CcBitArray_Subtract(&ba2, &ba1);

	    ATest(fp, &ba0, &ba2);
	    ATest(fp, &ba2, &ba0);
	    ATest(fp, &ba1, &ba2);
	    ATest(fp, &ba2, &ba1);

	    CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); CcBitArray_Destruct(&ba2);
	}
    }
}