示例#1
0
void
CcXmlSpec_MakeTerminals(const CcXmlSpec_t * self, CcGlobals_t * globals)
{
    char EndTag[128];
    CcArrayListIter_t iter; const CcXmlData_t * data;
    CcSymbolTable_t * symtab = &globals->symtab;

    for (data = (const CcXmlData_t *)CcArrayList_FirstC(&self->Tags, &iter);
	 data; data = (const CcXmlData_t *)CcArrayList_NextC(&self->Tags, &iter)) {
	if (!CcSymbolTable_NewTerminalWithCheck(symtab, data->tokenName, data->loc.line))
	    CcsErrorPool_Error(globals->errpool, &data->loc,
			       "Symbol %s is defined twice.\n", data->tokenName);
	snprintf(EndTag, sizeof(EndTag), "END_%s", data->tokenName);
	if (!CcSymbolTable_NewTerminalWithCheck(symtab, EndTag, data->loc.line))
	    CcsErrorPool_Error(globals->errpool, &data->loc,
			       "Symbol %s is defined twice.\n", EndTag);
    }

    for (data = (const CcXmlData_t *)CcArrayList_FirstC(&self->Attrs, &iter);
	 data; data = (const CcXmlData_t *)CcArrayList_NextC(&self->Attrs, &iter))
	if (!CcSymbolTable_NewTerminalWithCheck(symtab, data->tokenName, data->loc.line))
	    CcsErrorPool_Error(globals->errpool, &data->loc,
			       "Symbol %s is defined twice.\n", data->tokenName);
	
    for (data = (const CcXmlData_t *)CcArrayList_FirstC(&self->PInstructions, &iter);
	 data; data = (const CcXmlData_t *)CcArrayList_NextC(&self->PInstructions, &iter))
	if (!CcSymbolTable_NewTerminalWithCheck(symtab, data->tokenName, data->loc.line))
	    CcsErrorPool_Error(globals->errpool, &data->loc,
			       "Symbol %s is defined twice.\n", data->tokenName);
}
示例#2
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 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 CcsBool_t
CSOS_SynErrors(CcCSharpBaseOutputScheme_t * self, CcOutput_t * output)
{
    CcArrayListIter_t iter; char * str;
    const CcSyntaxError_t * synerr;
    const CcArrayList_t * errors = &self->base.globals->syntax.errors;
    for (synerr = (const CcSyntaxError_t *)CcArrayList_FirstC(errors, &iter);
	 synerr;
	 synerr = (const CcSyntaxError_t *)CcArrayList_NextC(errors, &iter)) {
	CcPrintfI(output, "case %d: s = \"", synerr->base.index);
	str = CcEscape(synerr->sym->name);
	switch (synerr->type) {
	case cet_t:
	    CcPrintf(output, "\\\"\" + %s + \"\\\" expected", str);
	    break;
	case cet_alt:
	    CcPrintf(output,
		     "this symbol not expected in \\\"\" + %s + \"\\\"", str);
	    break;
	case cet_sync:
	    CcPrintf(output, "invalid \\\"\" + %s + \"\\\"", str);
	    break;
	}
	CcFree(str);
	CcPrintfL(output, "\"; break;");
    }
    return TRUE;
}
static CcsBool_t
CSOS_Productions(CcCSharpBaseOutputScheme_t * self, CcOutput_t * output)
{
    CcBitArray_t isChecked;
    CcArrayListIter_t iter;
    const CcSymbolNT_t * sym;
    const CcArrayList_t * nonterminals =
	&self->base.globals->symtab.nonterminals;

    CcBitArray(&isChecked, self->base.globals->symtab.terminals.Count);
    for (sym = (const CcSymbolNT_t *)CcArrayList_FirstC(nonterminals, &iter);
	 sym;
	 sym = (const CcSymbolNT_t *)CcArrayList_NextC(nonterminals, &iter)) {
	self->curSy = (const CcSymbol_t *)sym;
	if (sym->attrPos == NULL) {
	    CcPrintfIL(output, "private void %s()", sym->base.name);
	} else {
	    CcPrintfIL(output, "private void %s(%s)",
		       sym->base.name, sym->attrPos->text);
	}
	CcPrintfIL(output, "{");
	output->indent += 4;
	if (sym->semPos) CcSource(output, sym->semPos);
	SCSOS_GenCode(self, output, sym->graph, &isChecked);
	output->indent -= 4;
	CcPrintfIL(output, "}");
	CcPrintfL(output, "");
    }
    CcBitArray_Destruct(&isChecked);
    return TRUE;
}
示例#6
0
const CcsPosition_t *
CcGlobals_GetSection(const CcGlobals_t * self, const char * secname)
{
    CcArrayListIter_t iter; const CcSection_t * section;

    for (section = (const CcSection_t *)CcArrayList_FirstC(&self->sections, &iter);
	 section;
	 section = (const CcSection_t *)CcArrayList_NextC(&self->sections, &iter))
	if (!strcmp(section->name, secname)) return section->pos;
    return NULL;
}
示例#7
0
static void
CcSyntax_Errors(CcSyntax_t * self)
{
    CcArrayListIter_t iter;
    const CcSymbol_t * sym;
    CcSyntaxError_t * error;
    const CcArrayList_t * terminals = &self->globals->symtab.terminals;
    for (sym = (const CcSymbol_t *)CcArrayList_FirstC(terminals, &iter);
	 sym; sym = (const CcSymbol_t *)CcArrayList_NextC(terminals, &iter)) {
	error = (CcSyntaxError_t *)
	    CcArrayList_New(&self->errors, CcObject(&CcSyntaxErrorType));
	error->type = cet_t;
	error->sym = sym;
    }
}
示例#8
0
void
CcEBNF_DumpNodes(const CcEBNF_t * self)
{
    CcArrayListIter_t iter;
    const CcNode_t * node;
    for (node = (const CcNode_t *)CcArrayList_FirstC(&self->nodes, &iter);
	 node; node = (const CcNode_t *)CcArrayList_NextC(&self->nodes, &iter)) {
	fprintf(stderr, "Node(%d):%16s %4d %4d %4d %5s\n",
		node->base.index, node->base.type->name,
		node->next ? node->next->base.index : -1,
		node->down ? node->down->base.index : -1,
		node->sub ? node->sub->base.index : -1,
		node->up ? "TRUE" : "FALSE");
    }
}
static CcsBool_t
CSOS_Pragmas(CcCSharpBaseOutputScheme_t * self, CcOutput_t * output)
{
    CcArrayListIter_t iter;
    const CcSymbolPR_t * sym, * sym1;
    const CcArrayList_t * pragmas = &self->base.globals->symtab.pragmas;

    for (sym = sym1 = (const CcSymbolPR_t *)CcArrayList_FirstC(pragmas, &iter);
	 sym; sym = (const CcSymbolPR_t *)CcArrayList_NextC(pragmas, &iter)) {
	CcPrintfIL(output, "%sif (la.kind == %d) {",
		   (sym == sym1) ? "" : "} else ", sym->base.kind);
	if (sym->semPos) {
	    output->indent += 4;
	    CcSource(output, sym->semPos);
	    output->indent -= 4;
	}
    }
    if (sym1) CcPrintfIL(output, "}");
    return TRUE;
}