예제 #1
0
int CG_main(TreeNode* pnode,char * ffname){
	int paraSize;
	char buf[10000];

	codename = fopen("code_part.asm", "w");
	dataname = fopen("data_part.asm", "w");

	EMITDATA(".INOUT_I:\n");
	EMITDATA("\t.string \"%i\"\n");
	EMITDATA(".OUTPUT_I_N:\n");
	EMITDATA("\t.string \"%i\\n\"\n");

	EMITDATA(".INOUT_C:\n");
	EMITDATA("\t.string \"%c\"\n");
	EMITDATA(".OUTPUT_C_N:\n");
	EMITDATA("\t.string \"%c\\n\"\n");

	EMITDATA(".INOUT_F:\n");
	EMITDATA("\t.string \"%f\"\n");
	EMITDATA(".OUTPUT_F_N:\n");
	EMITDATA("\t.string \"%f\\n\"\n");

	EMITDATA(".INOUT_S:\n");
	EMITDATA("\t.string \"%s\"\n");
	EMITDATA(".OUTPUT_S_N:\n");
	EMITDATA("\t.string \"%s\\n\"\n");

	EMITCODE(".text\n");	
	
	initScope();
	pnode->attr.name="main";
	GenCode(pnode);

	paraSize=leaveScope();  
	sprintf(tmp, "addl $%d, %%esp\n", paraSize);
  	EMITCODE(tmp);	
  	EMITCODE("leave\n");
  	EMITCODE("ret\n");
	fclose(codename);
	fclose(dataname);
	
	if (!COMPILE_ERROR){
		ff = fopen(ffname, "w");
		codename = fopen("code_part.asm", "r");
		dataname = fopen("data_part.asm", "r");	
		while(fgets(buf,BUFSIZ,dataname)!=NULL){
			fputs(buf,ff);
		}
		while(fgets(buf,BUFSIZ,codename)!=NULL){
			fputs(buf,ff);
		}	
		fclose(codename);
		fclose(dataname);
		fclose(ff);
	}
}
예제 #2
0
int main() {
    symboltable *table;
    initTypeDescList();
    initPredefinedSymboltable();
    initScope();
    printSymbolTable(predefinedIdTable);
    
    printf("type %d\n", getType("integer"));
    
    entryAttr attr;
    scope *curScope = getCurScope();
    table = getCurSymboltable();
    registerSymbol(table, "a", NULL);
    registerSymbol(table, "test", NULL);
    
    printf("scopeid: %d \n", curScope->scopeId);
    printSymbolTable(getCurSymboltable());
    printf("\n");
    
    int addr = getSymbolEntry(getCurSymboltable(), "a");
    if(getType("integer") >= 0) {
        setSymbolTypeAttrDirec(getCurSymboltable(), addr, "integer", attr);
    }
    printf("scopeid: %d \n", curScope->scopeId);
    printSymbolTable(getCurSymboltable());

    printf("error: %d\n", setSymbolTypeAttrDirec(getCurSymboltable(), addr, "string", attr));
    
    attr.arrayInfo.boundLow = 1;
    attr.arrayInfo.boundUp = 10;
    attr.arrayInfo.typeEntry = 23;
    registerSymbol(getCurSymboltable(), "b", "array");
    printSymbolTable(getCurSymboltable());
    setSymbolTypeAttrDirec(getCurSymboltable(), getSymbolEntry(getCurSymboltable(), "b"), "array", attr);
    
    printSymbolTable(getCurSymboltable());
    
    attr.funcInfo.paramQty = 2;
    attr.funcInfo.retTypeEntry = 23;
    registerSymbol(getCurSymboltable(), "func1", "function");
    setSymbolTypeAttrDirec(getCurSymboltable(), getSymbolEntry(getCurSymboltable(), "func1"), "function", attr);
    
    newScopeAndPush(getSymbolEntry(getCurSymboltable(), "func1"));
    
    registerSymbol(getCurSymboltable(), "a", "integer");
    
    popScopeStack();
    
    registerSymbol(getCurSymboltable(), "var1", "string");
    
    printf("\n");
    printAllSymbolTable();
    return 0;
}
예제 #3
0
void Ast2SrcVisitor::printBlock(BlockNode* node) {
    initScope(node->scope());

    std::string indent(_indent, ' ');
    for (uint32_t i = 0; i != node->nodes(); ++i)
    {
        _out << indent;
        node->nodeAt(i)->visit(this);
        if (!node->nodeAt(i)->isIfNode() &&
            !node->nodeAt(i)->isForNode() &&
            !node->nodeAt(i)->isWhileNode() && 
            !node->nodeAt(i)->isBlockNode())
            _out << ";";
        _out << std::endl;
    }
}