資源描述:
《簡單c編譯器教學(xué)ppt課件》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、簡單C編譯器聲明這里所討論的相關(guān)技術(shù)僅針對簡單C編譯器而言,實際的C編譯器要比這復(fù)雜得多。2語法圖(1)基于語法圖進(jìn)行編譯(2)有哪些語言成份,見語法圖3一個簡單的例子//main函數(shù)intmain(){inta=300,b=a-200;printf(a,b);}SetBx100Jmp002Init43000//單元4存放臨時變量300Mov340//變量a在單元3Init52000//單元5存放臨時變量200,單元4分給bSub355//單元3減去單元5,結(jié)果存在單元5Mov450//把單元5的內(nèi)容復(fù)制到單元4Out300Out400Ret0004詞法分析//符號表表項ty
2、pedefstruct{inttype;//類型FUN或VARintaddress;//地址全局為非正局部為正charlexeme[MaxIdLen+1];//詞素,變量名或函數(shù)名intparamCount;//函數(shù)的參數(shù)個數(shù)}SymbolEntry;//符號表structSymbolTable{SymbolEntry*entries;//各表項intindex;//符號表當(dāng)前表尾的下標(biāo),表中第0項不用};5符號表staticSymbolEntryglobalEntries[MaxGSize+1];staticSymbolEntrylocalEntries[MaxLSize+
3、1];SymbolTableglobalTable={globalEntries,0};//全局符號表SymbolTablelocalTable={localEntries,0};//局部符號表6全局符號表存放全局變量、函數(shù)名的相關(guān)信息局部符號表在分析函數(shù)時,存放局部變量的相關(guān)信息,暫不支持在程序塊中定義的局部變量。分析完一個函數(shù)后,要分析下一個時,只要先把局部符號表清空即可。所以系統(tǒng)只要一個全局符號表和一個局部符號表。編譯函數(shù)時,如果在局部符號表查不到某個標(biāo)志符的定義,則可在全局符號表里查找。7語法分析根據(jù)語法圖進(jìn)行自上而下的分析分析方法:(1)語法圖的方框部分調(diào)用一個對應(yīng)
4、的函數(shù)來處理(2)語法圖中的圓形部分和橢圓部分則代表一個語法分析的終結(jié)符8語法分析例:由語法圖進(jìn)行“參數(shù)聲明”的翻譯intparamDeclare(){if(token==INT){intcount=1;processOneDeclare();//識別一個聲明intidentwhile(token==COMMA){getToken();processOneDeclare();count++;}returncount;}}9語法分析staticvoidprocessOneDeclare(){if(token==INT){getToken();if(token==ID){inti
5、ndex=lookup(&localTable,VAR,id);if(index==0)index=enter(&localTable,VAR,id);elsesyntaxError("reclaredparamname.");getToken();}else{syntaxError("paramnamemissed.");}}}10中間代碼的格式采用四元式//四元式typedefstruct{intoptr;//運算符intarg1;//左操作數(shù)intarg2;//右操作數(shù)intresult;//存放結(jié)果}Instruction;//有些指令并未完全使用上述4個域虛擬機(jī)的引
6、入:假設(shè)有一臺機(jī)器,它的機(jī)器指令正好是我們定義的四元式,即這臺機(jī)器能識別我們的四元式。11中間代碼的格式例1Mov1170把內(nèi)存7號單元的內(nèi)容傳送到11號單元最后一個(結(jié)果)操作數(shù)在此指令中無意義虛擬機(jī)(virtualMachine.cpp)對此中間代碼的解釋caseInsMov:arg1=getAddress(cs[pc].arg1);arg2=getAddress(cs[pc].arg2);ds[arg1]=ds[arg2];pc++;break;//其中cs為一個四元式數(shù)組,ds實際上是個整型數(shù)組//(cs,ds定義于c.cpp中,cs起到代碼段的作用,存放各條四元式形
7、式的中間代碼ds充當(dāng)數(shù)據(jù)段和棧段,用于存放程序運行時的全局變量和各函數(shù)對應(yīng)的活動記錄,函數(shù)的活動記錄存放了函數(shù)的局部變量和相關(guān)控制信息)//pc為程序計數(shù)器,指向下一條要執(zhí)行的四元式指令12例2Add565把內(nèi)存5號單元的內(nèi)容加上到6號單元的內(nèi)容,結(jié)果送到5號單元虛擬機(jī)(virtualMachine.cpp)對此中間代碼的解釋caseInsAdd:arg1=getAddress(cs[pc].arg1);arg2=getAddress(cs[pc].arg2);result=getAddress(cs[