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); } }
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; }
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; } }