コード例 #1
0
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);
    }
}
コード例 #2
0
ファイル: TestBitArray.c プロジェクト: dcsouthwick/cocoxml
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");
}
コード例 #3
0
ファイル: Syntax.c プロジェクト: charlesw1234/cocoxml
/* 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;
    }
}