c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...
前面花了兩篇文章來介紹詞法分析和語法分析,接下來才是比較有意思的部分——一個(gè)小型類C編譯器的設(shè)計(jì)和實(shí)現(xiàn)(其實(shí)是編譯原理的課程設(shè)計(jì)啦!~)我用的是python2.7.13+PyQt來做的。。。事實(shí)上,正是從編譯原理課程設(shè)計(jì)開始,我開始轉(zhuǎn)戰(zhàn)python,這也算是用python寫的第一個(gè)程序吧^_^局限性肯定是存在的,只要大家從中能get到一點(diǎn)點(diǎn)于自己而言有用的東西我就灰常開森了O(∩_∩)O哈哈~最后,歡迎大家批評(píng)指正!THX~
一、 實(shí)驗(yàn)?zāi)繕?biāo)
二、開發(fā)前提
1.開發(fā)語言
選取python作為本次類C編譯器的開發(fā)語言,解釋器為python2.7.13。(不同版本語法有一定的差異)與C++相比如下所示:
1.1 優(yōu)點(diǎn)
1.2 缺點(diǎn)
2、開發(fā)環(huán)境
- pycharm2016 professional+Aconoad2(解釋器為python2.7.13)
- UI界面使用PyQt4(引入工具包)
- 其余使用到的庫均為python的標(biāo)準(zhǔn)庫,主要如下:
3. C語言語法規(guī)則
該部分將從目標(biāo)語言的詞法規(guī)則,語法規(guī)則入手,介紹對(duì)對(duì)文法的預(yù)處理過程,為后來代碼的編寫打好了基礎(chǔ)。(PS:這里的目標(biāo)語言就是課程設(shè)計(jì)中所要求的簡易類C語言)
3.1 詞法規(guī)則
關(guān)鍵字:int | void | if | else | while | return
標(biāo)識(shí)符: 字母(字母|數(shù)字)* (注:不與關(guān)鍵字相同)
數(shù)值:數(shù)字(數(shù)字)*
賦值號(hào): =
算符: + | - | * | / | = | == | > | >= | < | <= | !=
界符: ;
分隔符: ,
注釋號(hào): /* */ | //
左括號(hào): (
右括號(hào): )
左大括號(hào): {
右大括號(hào): }
字母:| a |....| z | A |....| Z |
數(shù)字:0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
結(jié)束符:#
3.2 語法規(guī)則
選擇了包含過程調(diào)用的文法1來進(jìn)行本次編譯器的開發(fā),文法1的詳細(xì)內(nèi)容詳見實(shí)驗(yàn)要求(PS:為了方便我還是貼過來好了),在此主要通過原始文法與處理后文法的對(duì)照,來簡要介紹對(duì)文法1的處理(詳見功能模塊中文法處理部分)
【文法1_包含過程調(diào)用】 (說明: { }中的項(xiàng)表示可重復(fù)若干次) Program ::= <聲明串> <聲明串> ::=<聲明>{<聲明>} <聲明> ::=int <ID> <聲明類型> | void <ID> <函數(shù)聲明> #記下變量類型 <聲明類型>::=<變量聲明> | <函數(shù)聲明> #填入變量表 聲明語句處理模塊 <變量聲明> ::= ; <函數(shù)聲明> ::=’ (‘<形參>’) ‘<語句塊> <形參>::= <參數(shù)列表> | void #新建一張變量表,存儲(chǔ)形參和局部變量 <參數(shù)列表> ::= <參數(shù)> {, <參數(shù)>} <參數(shù)> ::= int <ID> #填入形參和局部變量類型表 定義函數(shù)類(名字,形參,內(nèi)變) <語句塊> ::= ‘{‘<內(nèi)部聲明> <語句串>’}’ <內(nèi)部聲明> ::= 空 | <內(nèi)部變量聲明>{; <內(nèi)部變量聲明>}#內(nèi)變填入剛剛新生成的函數(shù)類 <內(nèi)部變量聲明>::=int <ID> <語句串> ::= <語句>{ <語句> } <語句> ::= <if語句> |< while語句> | <return語句> | <賦值語句> <賦值語句> ::= <ID> =<表達(dá)式>; <return語句> ::= return [ <表達(dá)式> ] (注:[ ]中的項(xiàng)表示可選) <while語句> ::= while ‘( ‘<表達(dá)式> ‘)’ <語句塊> <if語句> ::= if ‘(‘<表達(dá)式>’)’ <語句塊> [ else <語句塊> ](注:[ ]中的項(xiàng)表示可選) <表達(dá)式>::=<加法表達(dá)式>{ relop <加法表達(dá)式> } (注:relop-> <|<=|>|>=|==|!=) <加法表達(dá)式> ::= <項(xiàng)> {+ <項(xiàng)> | -<項(xiàng)>} <項(xiàng)> ::= <因子> {* <因子> | /<因子>} <因子> ::=num | ‘(‘<表達(dá)式>’)’ |<ID> FTYPE FTYPE ::= <call> | 空 <call> ::=’(’<實(shí)參列表> ’) ’ <實(shí)參> ::=<實(shí)參列表> | 空 <實(shí)參列表> ::= <表達(dá)式>{, <表達(dá)式>} <ID>::=字母(字母|d數(shù)字)* 【程序?qū)嵗?int a; int b; int program(int a,int b,int c) {int i;int j;i=0; if(a>(b+c)){j=a+(b*c+1);}else{j=a;}while(i<=100){i=j*2;}return i; }int demo(int a) {a=a+2;return a*2; }void main(void) {int a;int b;int c;a=3;b=4;c=2;a=program(a,b,demo(c))return; }4、8086匯編語言語法規(guī)則
8086匯編語言屬于CISC指令集,指令集比較龐大,實(shí)現(xiàn)的功能較多,但指令長短不一。該部分將從8086匯編的代碼結(jié)構(gòu)和語法簡介兩方面來介紹目標(biāo)代碼的語法規(guī)則。
4.1 代碼結(jié)構(gòu)
【數(shù)據(jù)段】 DATA SEGMENT //該段需要聲明程序中所用到的數(shù)據(jù) //嚴(yán)格遵循先定義,后使用,除非采用內(nèi)存分配方式 DATA ENDS【代碼段】 CODE SEGMENTASSUME CS:CODE,DS:DATA // 固定語句,完成代碼段和數(shù)據(jù)段的加載工作PPOCEDURE PROC NEAR //調(diào)用子函數(shù)的代碼段 PPOCEDURE ENDP START: MOV AX,DATA //主函數(shù)段MOV DS,AXEND START CODE ENDS //代碼段結(jié)束標(biāo)志4.2 語法簡介
8086語言基本指令解釋以及針對(duì)本次實(shí)驗(yàn)的文法所用到的指令和基本語法解釋如下:
(1)內(nèi)存操作指令
MOV OP1,OP2 PO1<---OP2
寄存器,存儲(chǔ)器,累加器<---寄存器,存儲(chǔ)器,累加器,立即數(shù)
(兼有LOAD和STORE指令的功能)
(2)臨時(shí)變量存儲(chǔ)指令
PUSH 壓棧
POP 出棧
(3)加減運(yùn)算指令
寄存器<---寄存器,存儲(chǔ)器
ADD OP1,OP2 OP1<--OP1+OP2
SUB OP1,OP2 OP1<--OP1-OP2
(4)乘除運(yùn)算指令
MUL OPRD EDX:EAX<--EAX*OPRD
DIV OPRD EDX:EAX/OPRD = 商EAX,余數(shù)EDX
(5)條件跳轉(zhuǎn)指令
CMP OP1,OP2 OP1-OP2
JZ 等于0跳轉(zhuǎn)
JNZ 非0跳轉(zhuǎn)
JG 大于跳轉(zhuǎn)
JGE 大于等于0跳轉(zhuǎn)
JL 小于0跳轉(zhuǎn)
JLE 小于等于0跳轉(zhuǎn)
二、總體設(shè)計(jì)
該部分設(shè)計(jì)主要描述了編譯器的總體架構(gòu),首先從編譯器的原理和功能模塊兩部分闡述了整個(gè)設(shè)計(jì),具體如下所示:
1、實(shí)驗(yàn)原理
實(shí)驗(yàn)中實(shí)現(xiàn)的指定文法的類C編譯器,故首先需要了解編譯程序的流程,并對(duì)整個(gè)編譯器代碼框架作出布局,具體如下所示:
1.1 編譯程序
編譯程序的流程如下圖所示:
多次提到這個(gè)流程,前邊也有——by hallucination1.2 文法處理
整個(gè)編譯程序執(zhí)行之前,需要對(duì)給定的文法進(jìn)行處理,轉(zhuǎn)化為便于計(jì)算機(jī)識(shí)別的形式。此外,還需要將轉(zhuǎn)化后的文法變?yōu)榉螸L(1)的文法,具體處理后的文法如下所示:
- 文法名對(duì)照(肯定要先把推導(dǎo)公式里的漢字轉(zhuǎn)變成英文表示嘛~)
Program:Prog 聲明串:Dstr 聲明:Decl 聲明類型:Type
變量聲明:Vari 函數(shù)聲明:Func 形參:Vpam 參數(shù)列表:Pist
語句塊:Bloc 內(nèi)部聲明:Kdec 內(nèi)部變量聲明:Kdev
語句串:Lstr 賦值語句:Asla 語句:Lang return語句:Rela
表達(dá)式:Expr while語句:Whla if語句:Ifla 加法表達(dá)式:Aexp
FTYPE:FTYP 因子:Fact 項(xiàng):Item Call:Call
實(shí)參:Rpam 實(shí)參列表:Rist ID:ID
中間變量:Stem/Ptem/Ltem/Rtem/Atem/Itmp/Ftem/Rltm
- 處理后的文法
注:左邊漢字表示的是未處理的文法,右邊帶標(biāo)號(hào)的字符串表示編譯器處理時(shí)采用的文法。
1.3 功能劃分
按照編譯程序的執(zhí)行流程,將整個(gè)編譯器劃分為如下幾個(gè)部分來實(shí)現(xiàn):
- 類的定義:ClassType.py
- 詞法分析:LEX.py
- 語法分析:SynAly.py
- 語義分析:SemAly.py
- 目標(biāo)代碼生成:CodeGen.py
- 界面生成:compiler.py
其中語法分析模塊調(diào)用詞法分析的結(jié)果,并在執(zhí)行到相應(yīng)的語義動(dòng)作時(shí)調(diào)用語義分析模塊,語義分析模塊在基本塊完成時(shí)調(diào)用目標(biāo)代碼生成模塊生成目標(biāo)代碼。
2.功能模塊
在對(duì)整個(gè)編譯器的原理進(jìn)行分析并完成了文法的處理后,開始詳細(xì)分析整個(gè)編譯器的執(zhí)行流程,并附加上每個(gè)模塊的數(shù)據(jù)流,繪制出系統(tǒng)的功能流程圖如下所示(實(shí)際上也對(duì)系統(tǒng)的開發(fā)模塊做了規(guī)劃):
整個(gè)編譯器的工作流程圖——by hallucination內(nèi)容略多。。。。所以,功能設(shè)計(jì)部分就放在下一回再說啦~感謝大家持續(xù)關(guān)注??ヽ(°▽°)ノ?
總結(jié)
以上是生活随笔為你收集整理的c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海韵机箱磁吸风扇 MagFlow 黑色套
- 下一篇: c++ 多重背包状态转移方程_【考前再叮