Esempio n. 1
0
CcCharSet_t *
CcCharSet(void)
{
    CcCharSet_t * self = CcMalloc(sizeof(CcCharSet_t));
    self->head = NULL;
    return self;
}
Esempio n. 2
0
CcGraph_t *
CcGraph(void)
{
    CcGraph_t * self = CcMalloc(sizeof(CcGraph_t));
    self->head = self->r = NULL;
    return self;
}
Esempio n. 3
0
CcRange_t *
new_Range(int from, int to)
{
    CcRange_t * self = CcMalloc(sizeof(CcRange_t));
    self->from = from; self->to = to; self->next = NULL;
    return self;
}
Esempio n. 4
0
CcGraph_t *
CcGraphP(CcNode_t * p)
{
    CcGraph_t * self = CcMalloc(sizeof(CcGraph_t));
    self->head = self->r = p;
    return self;
}
Esempio n. 5
0
static CcXmlSpecData_t *
CcXmlSpec_GetSortedList(const CcArrayList_t * array, CcsBool_t useEnd,
			const CcGlobals_t * globals, size_t * retNum)
{
    CcXmlSpecData_t * retlist, * curret;
    const CcXmlData_t * data; CcArrayListIter_t iter;
    const CcSymbol_t * sym; char EndTag[128];
    const CcSymbolTable_t * symtab = &globals->symtab;

    *retNum = array->Count;
    if (array->Count == 0) return NULL;
    retlist = curret = CcMalloc(array->Count * sizeof(CcXmlSpecData_t));
    for (data = (const CcXmlData_t *)CcArrayList_FirstC(array, &iter);
	 data; data = (const CcXmlData_t *)CcArrayList_NextC(array, &iter)) {
	curret->name = CcStrdup(data->name);
	sym = CcSymbolTable_CheckTerminal(symtab, data->tokenName);
	CcsAssert(sym != NULL);
	curret->kind0 = sym->base.index;
	if (useEnd) {
	    snprintf(EndTag, sizeof(EndTag), "END_%s", data->tokenName);
	    sym = CcSymbolTable_CheckTerminal(symtab, EndTag);
	    CcsAssert(sym != NULL);
	    curret->kind1 = sym->base.index;
	}
	++curret;
    }
    CcsAssert(curret - retlist == array->Count);
    qsort(retlist, array->Count, sizeof(CcXmlSpecData_t), cmpXSData);
    return retlist;
}
static CcsBool_t
CSOS_InitSet(CcCSharpBaseOutputScheme_t * self, CcOutput_t * output)
{
    char * setstr; int setlen, index;
    const CcBitArray_t * cur;

    setlen = self->base.globals->symtab.terminals.Count;
    setstr = CcMalloc(setlen + 1); setstr[setlen] = 0;
    if (setlen > 4) {
	for (index = 0; index < setlen; ++index)
	    if (index == 0) setstr[index] = '*';
	    else setstr[index] = index % 5 == 0 ? '0' + index % 10 : ' ';
	CcPrintfIL(output, "/%s */", setstr);
    }
    for (cur = self->symSet.start; cur < self->symSet.used; ++cur) {
	CcsAssert(setlen == CcBitArray_getCount(cur));
	for (index = 0; index < setlen; ++index)
	    setstr[index] = CcBitArray_Get(cur, index) ? '*' : '.';
	CcPrintfIL(output, "\"%s.\"%c /* %d */", setstr,
		   cur < self->symSet.used - 1 ? ',' : ' ',
		   cur - self->symSet.start);
    }
    CcFree(setstr);
    return TRUE;
}
Esempio n. 7
0
CcArrayList_t *
CcArrayList(CcArrayList_t * self)
{
    self->Count = 0;
    self->Capacity = 16;
    self->Objects = CcMalloc(sizeof(void *) * self->Capacity);
    return self;
}
Esempio n. 8
0
CcCharSet_t *
CcCharSet_Clone(const CcCharSet_t * s)
{
    CcRange_t * prev, * curnew;
    const CcRange_t * cur1;
    CcCharSet_t * self = CcMalloc(sizeof(CcCharSet_t));
    self->head = NULL; prev = NULL;
    for (cur1 = s->head; cur1; cur1 = cur1->next) {
	curnew = new_Range(cur1->from, cur1->to);
	if (prev == NULL) self->head = curnew;
	else prev->next = curnew;
	prev = curnew;
    }
    return self;
}
Esempio n. 9
0
CcComment_t *
CcComment(const int * start, const int * stop, CcsBool_t nested)
{
    int * cur0; const int * cur1;
    CcComment_t * self = CcMalloc(sizeof(CcComment_t));
    cur0 = self->start; cur1 = start;
    while (*cur1) *cur0++ = *cur1++;
    *cur0 = 0;
    cur0 = self->stop; cur1 = stop;
    while (*cur1) *cur0++ = *cur1++;
    *cur0 = 0;
    self->nested = nested;
    self->next = NULL;
    return self;
}
Esempio n. 10
0
void
CcSyntaxSymSet(CcSyntaxSymSet_t * self)
{
    self->start = self->used = CcMalloc(sizeof(CcBitArray_t) * SZ_SYMSET);
    self->last = self->start + SZ_SYMSET;
}
Esempio n. 11
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;
}