夏彥 一周工作總結
大連汽車廣場有限公司
工作總結
在這一周主要工作是進行系統(tǒng)測試,其次是應對領導的檢查。
每天早上在早會要對前一天發(fā)現的問題進行總結,并匯報前一天的紀律情況;隨后需要對交易大廳進行清潔打掃,保證大廳地面的干凈;其次每天在測試前需要拿KEY,檢查維護端的數據是否需要重新導入,如果需要導入要檢查當前競拍的車輛是否都是流拍或是成交,KEY不可以有插在電腦上的情況,保證數據成功導入;維持每天測試的紀律,保證每天都能夠檢查出BUG,下午下班之前及時將問題交給梁楠楠。在周三對財政王主管進行了維護端的講解。在周四我們對交易大廳進行了一次徹底的清掃,來迎接大連電視臺的來訪。以上就是本周工作的主要內容。
擴展閱讀:課程設計 夏彥
編譯原理設計說明
衡陽師范學院
計算機科學與技術專業(yè)
課程設計
題目:PL/X編譯程序改進及擴展指導教師:徐雨明老師年級班別:08級1班學號:08190123學生姓名:夏彥時間:201*年6月16日
1編譯原理設計說明
目錄
1介紹..................................................31.1前言................................................32編譯器................................................42.1PL/X編譯器結構概述.................................42.2語法元素............................................62.3語法圖..............................................72.4判斷是否符合兩條限制規(guī)則...........................152.5語法出錯表定義.....................................183虛擬機...............................................193.1虛擬機組織結構.....................................193.2虛擬機指令格式.....................................204程序設計.............................................234.1全局變量、全局常量.................................234.2函數接口...........................................305程序測試.............................................396課程設計總結.........................................407參考文獻.............................................41
2編譯原理設計說明
1介紹
1.1前言
根據課程設計要求制作PL/X語言的編譯器,完成詞法分析、語法分析、語義分析及代碼生成、出錯處理和解釋運行程序,并添加一定的擴展,最終實現一個PL/X的編譯器。
所完成擴展點說明:1)支持三種注釋a)單行注釋b)/*---*/多行注釋c)(*---*)多行注釋
2)支持read語句,因此可從終端獲取輸入3)支持write語句,因此可從終端輸出4)支持for語句5)支持do…while語句6)call過程7)求余運算%8)整數的奇偶odd
3編譯原理設計說明
9)冪運行**10)求階乘!11)求和$
關于出錯處理:分為詞法分析錯誤、句法分析錯誤、運行時錯誤(如除數為0)
允許變量名或函數名重復,但訪問的時候以最后一次聲明的為有效
2編譯器
2.1PL/X編譯器結構概述
圖1PL/X編譯程序的結構圖
圖2PL/X的解釋執(zhí)行結構
4編譯原理設計說明
圖3PL/X編譯程序總體流程圖
語法分析過程PROG是整個編譯過程的核心,是指開始由主程序調用GETSYM取一個單詞,再調用語法分析過程PROG,PROG由當前單詞根據語法規(guī)則再調用其它過程,如說明處理、代碼生成或出錯處理等過程進行分析,當分析完一個單詞后,PROG再調用GETSYM取下一個單詞,一直重復到當前單詞為結束符"."表明源程序已分析結束。若未取到結束符".",而源程序已沒有輸入符號,這時表明源程序有錯誤,無法再繼續(xù)分析。
5編譯原理設計說明
圖4PL/X過程調用相關示意圖
2.2語法元素關鍵字:
"and","begin","call","case","constant","do","else","end","false","for","if","integer","logical","not","or",“odd”,"procedure","program","read","repeat","switch","then","true","until","while","write"
6編譯原理設計說明
操作符:
".",";","**","++",“--","+","-","*","/","%","=","=","==","!","+=","-=","*=","/="2.3語法圖
程序
程序體
程序體.const,;var,ident=numberident;procedureident;;程序體語句編譯原理
語句序列語句條件
設計說明
語句;ident:=表達式callidentbegin語句序列endif條件then語句while條件do語句odd表達式表達式=<>=表達式編譯原理
表達式項因子
設計說明
+項-+-項因子*/**%因子++--identnumber(表達式)編譯原理
設計說明
1)prog="program"ds{proc}"begin"ss"end""."
2)proc="procedure"aident[ds]"begin"ss"end"
3)ds=d{";"d}
4)d="integer"aident{","aident}|
"logical"bident{","bident}|
"constant"aident"="number{","aident"="number}
10編譯原理設計說明
5)ss=s{;s}
6)s=aident":="ae|bident":="be|
"if"be"then"ss["else"ss]"end"|"while"be"do"ss"end"|"repeat"ss"until"be|"write"ae."read"aident|bident"for"s;be;s"do"ss"end"
11編譯原理設計說明
"call"procedure
"do"ss".""while"be"end"
7)ae=["-"]at{("-"|"+")at}
8)at=af1{("*"|"/")af1}.
編譯原理設計說明
9)af1=af{("%"|"**")af}.//擴展的求余運算
10)af=aident|number|"("ae")"|constant
11)be=bt{"or"bt}
編譯原理設計說明
12)bt=bf{"and"bf}
13)bf=bident|"true"|"false"|"not"bf|"("be")"|re1
14)re1=oddre
編譯原理設計說明
15)re=(aident|number)("="|">"|">="|"編譯原理設計說明
Follow(B1)={“begin”};B3={";"d}First(B3)={“;”};
Follow(B3)={“procedure”,“begin”};B4={","aident}First(B4)={“,”};
Follow(B4)={“;”,“procedure”,“begin”};B5={","bident}First(B5)={“,”};
Follow(B5)={“;”,“procedure”,“begin”};B6={","aident"="number}First(B6)={“,”};
Follow(B6)={“;”,“procedure”,“begin”};B7={;s}First(B7)={“;”};
Follow(B7)={“end”,“until”,“else”};B8=["else"ss]First(B8)={“else”};Follow(B8)={“end”};B9=["-"]First(B9)={“-”};
Follow(B9)={“(”,“aident”,“number”,“constant”};
16編譯原理設計說明
B10={("-"|"+")at}First(B10)={“-”,“+”};
Follow(B10)={“end”,“until”,“else”,“)”,“and”,“or”};B11={"or"bt}First(B11)={“or”};
Follow(B11)={“then”,“do”,“;”,“)”,“end”,“until”,“else”};B12={("*"|"/")af}First(B12)={"*","/"};
Follow(B12)={“+”,“-“,“end”,“until”,“else”,“)”,“and”,“or”};B13={"and"bf}First(B13)={"and”};
Follow(B13)={“or”,“then”,“do”,“;”,“)”,“end”,“until”,“else”};
2).判斷是否符合兩條限制規(guī)則
規(guī)則1:找出圖中每一個分支點,考察每個分支點的各個分支的頭符號是否相異
規(guī)則2:找出圖中每一個結構,考察每個結構的頭符號集合與其跟隨符號是否相異非終結符名分程序
開始符號集合constvarprocedureidentifcall17
后繼符號集合.;編譯原理設計說明
beginwhilereadwrite語句條件identnumber+-(表達式identnumberropendthendo.;)項identnumber(rop+-endthendo.;+因子identnumber(-*/end","p":{"h":22.449,"w":40.982,"x":595.23,"y":編譯原理設計說明
3虛擬機
3.1虛擬機組織結構
程序存儲器指令存儲器數據存儲區(qū)
程序地址寄存器基本地址寄存器地址寄存器
1)程序存儲器指令類型enumfct{lit,opr,};指令
typedefstructinstruction{fctf;intl;inta;Int,jmp,jpc
lod,
sto,cal,
}Instruction;指令數組
Instructioncode[InMax];
19編譯原理設計說明
2)指令寄存器inti;3)數據存儲器intstack[StMax]4)程序地址寄存器intp;
5)基本地址寄存器intb;6)地址寄存器intt;
3.2虛擬機指令格式
編譯程序所產生的目標代碼是一個假想棧式計算機的匯編語言,可稱為類PCODE指令代碼,它不依賴任何具體計算機,其指令集極為簡單,指令格式也很單純,其格式如下:
fla其中f代表功能碼,l表示層次差,也就是變量或過程被引用的分程序與說明該變量或過程的分程序之間的層次差。a的含意對不同的指令有所區(qū)別,對存取指令表示位移量,而對其它的指令則分別有不同的含義,見下面對每條指令的解釋說明。
20編譯原理設計說明
目標指令有8條:
①LIT:將常量值取到運行棧頂。a域為常數值。
②LOD:將變量放到棧頂。a域為變量在所說明層中的相對位置,l為調用層與說明層的層差值。
③STO:將棧頂的內容送入某變量單元中。a,l域的含意同LOD指令。
④CAL:調用過程的指令。a為被調用過程的目標程序入口地址,l為層差。
⑤INT:為被調用的過程(或主程序)在運行棧中開辟數據區(qū)。a域為開辟的單元個數。
⑥JMP:無條件轉移指令,a為轉向地址。
⑦JPC:條件轉移指令,當棧頂的布爾值為非真時,轉向a域的地址,否則順序執(zhí)行。
⑧OPR:關系運算和算術運算指令。將棧頂和次棧頂的內容進行運算,結果存放在次棧頂,此外還可以是讀寫等特殊功能的指令,具體操作由a域值給出。(詳見解釋執(zhí)行程序)。
指令功能表LIT0aLODlaSTOla將常數值取到棧頂,a為常數值將變量值取到棧頂,a為偏移量,l為層差將棧頂內容送入某變量單元中,a為偏移量,l為層差
編譯原理設計說明
CALlaINT0aJMP0aJPC0a調用過程,a為過程地址,l為層差在運行棧中為被調用的過程開辟a個單元的數據區(qū)無條件跳轉至a地址條件跳轉,當棧頂布爾值非真則跳轉至a地址,否則順序執(zhí)行OPR00OPR01OPR02OPR03OPR04OPR05過程調用結束后,返回調用點并退棧棧頂元素取反次棧頂與棧頂相加,退兩個棧元素,結果值進棧次棧頂減去棧頂,退兩個棧元素,結果值進棧次棧頂乘以棧頂,退兩個棧元素,結果值進棧次棧頂除以棧頂,退兩個棧元素,結果值進棧增加了除數為0的判斷OPR06OPR07OPR08OPR09OPR010OPR011OPR012OPR013OPR014
棧頂元素的奇偶判斷,結果值在棧頂次棧頂與棧頂是否相等,退兩個棧元素,結果值進棧次棧頂與棧頂是否不等,退兩個棧元素,結果值進棧次棧頂是否小于棧頂,退兩個棧元素,結果值進棧次棧頂是否大于等于棧頂,退兩個棧元素,結果值進棧次棧頂是否大于棧頂,退兩個棧元素,結果值進棧次棧頂是否小于等于棧頂,退兩個棧元素,結果值進棧棧頂值輸出至屏幕22
編譯原理設計說明
OPR015屏幕輸出換行OPR016OPR017OPR018
從命令行讀入一個輸入置于棧頂擴展求余擴展求冪4程序設計
4.1全局變量、全局常量
#defineNumber26//保留字的個數#defineTXMAX100//標識符表的長度#defineInMax200//指令最多條數#defineLeMax3//過程最大嵌套層次#defineStMax500//最大棧長#defineIMax10//標識符最長長度#defineDMax14//數字允許的最長位數v#defineAddMax2048//最大地址
charch;//最近一次從程序中讀出的字符charsym[IMax];//最近讀出的符號charid[IMax];//最近讀出的標識符intnum;//最近讀出的數值intcc;//行緩沖區(qū)指針
23編譯原理設計說明
intll;//行緩沖區(qū)長度intkk;//提高性能charline[100];//行緩沖區(qū)
chara[IMax];//存放當前正在分析的詞intlineno;//當前分析的行號inttx=0;//符號表序號intindex;//指令索引
charssym[13][IMax];//符號對應的符號表charfsym[33][IMax];//用于出錯處理interr;//記錄錯誤數量intstack[StMax];
FILE*file;//指向要編譯的源文件
charword[Number][IMax]={//保留字"and","begin","call","case","constant","do","else","end",
24編譯原理設計說明
"false","for","if","integer","logical","not","or","odd","procedure","program","read","repeat","switch","then","true","until","while","write"};
charwsym[Number][IMax]={//保留字對應的符號表"andsym",
25編譯原理設計說明
"beginsym","callsym","casesym","constsym","dosym","elsesym","endsym","falsesym","forsym","ifsym","intesym","logisym","notsym","orsym","oddsym","procsym","progsym","readsym","repeasym","switcsym","thensym","truesym",
26編譯原理設計說明
"untilsym","whilesym","writesym"};
charD_first[4][IMax]={//聲明語句頭符號集"intesym","logisym","constant","over"};
charD_follow[3][IMax]={//聲明語句跟隨符號集"beginsym","procsym","over"};
charS_first[11][IMax]={//語句的頭符號集"adient",
27編譯原理設計說明
"ifsym","whilesym","repeasym","writesym","forsym","callsym","readsym","dosym","switcsym","over"};
charS_follow[7][IMax]={//語句的跟隨符號集"endsym","elsesym","untilsym","dosym","period","over"};
28編譯原理設計說明
enumfct{//指令類型lit,opr,lod,sto,cal,Int,jmp,jpc};
enumobjekt{//標識符類型integer,logical,procedure,constant};
typedefstructinstruction{fctf;intl;inta;
29編譯原理設計說明
}Instruction;
Instructioncode[InMax];//指令數組
typedefstructTable{//符號表定義charname[IMax];objektkind;intadr;intlevel;intsize;}Table;
Tabletable[TXMAX];//符號表
4.2函數接口函數原型參數描述函數描述返回值函數原型
voidgetch()從源文件中讀取字符voidgetsym()30
編譯原理設計說明
參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述從源文件中取出字符串voidinit()初始化ssymvoidError(char*s1)s1:出錯信息打印錯誤voidenter(objekttype,int*pdx,intlev)type:符號類型pdx:當前層次偏移量lev:符號層次函數描述返回值
符號記入符號表函數原型參數描述編譯原理函數描述函數原型返回值參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述intposition(char*id)id:所查詢的符號設計說明在符號表中查詢符號boolIsIn(chars1[][IMax])id在符號表中序號,返回-1表示不存在s1符號字符串數組檢查當前符號是否在期望符號集合中true::在false:不在boolss(intlev)lev:當前層次ss=s{;s}voidUnion(chars1[][IMax],chars2[][IMax])S1,s2為要合并的字符串數組用于出錯處理:合并開始符與跟隨符集合voidtest(chars1[][AL],chars2[][AL],char*err)S1:此程序段的跟隨符集合S2:此程序段的開始符集合err:錯誤信息
編譯原理設計說明
函數描述當前符號是否在期望符號集中,否則報錯并跳過返回值函數原型參數描述voidgen(fctx,inty,intz)x:指令名y,z:指令對應參數函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值
生成指令boolprog()prog="program"ds{proc}"begin"ss"end""."boolproc(intlev)lev:此過程層次proc="procedure"aident[ds]"begin"ss"end"編譯原理設計說明
函數原型參數描述boolds(int*pdx,intlev)pdx:當前層次偏移量lev:當前層次函數描述返回值函數原型參數描述boold(int*pdx,intlev)pdx:當前層次偏移量lev:當前層次函數描述d="integer"aident{","aident}|"logical"bident{","bident}|"constant"aident"="number{","aident"="number}返回值
ds=d{";"d}
編譯原理設計說明
函數原型參數描述函數描述bools(intlev)lev:當前層次aident":="ae|bident":="be|"if"be"then"ss["else"ss]"end"|"while"be"do"ss"end"|"repeat"ss"until"be|"write"ae."read"aident|bident"for"s;be;s"do"ss"end""call"aident"do"ss".""while"be"end"返回值函數原型參數描述函數描述返回值函數原型參數描述
boolae(intlev)lev:當前層次ae=["-"]at{("-"|"+")at}boolat(intlev)lev:當前層次35
編譯原理設計說明
函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述at=af1{("*"|"/")af1}boolaf1(intlev)lev:當前層次af1=af{("**"|"%")af}boolaf(intlev)lev:當前層次af=aident|number|"("ae")"|constantboolbe(intlev)lev:當前層次bt{"or"bt}boolbt(intlev)lev:當前層次bt=bf{"and"bf}
編譯原理設計說明
返回值函數原型參數描述函數描述boolbf(intlev)lev:當前層次bf=bident|"true"|"false"|"not"bf|"("be")"|re1返回值函數原型參數描述函數描述返回值函數原型參數描述函數描述boolre1(intlev)lev:當前層次re1=oddreboolre(intlev)lev:當前層次re=(aident|number)("="|">"|">="|"編譯原理設計說明
函數原型參數描述函數描述返回值函數原型參數描述函數描述返回值函數原型參數描述voidlistall()顯示所有的指令voidinterpret()解釋程序intbase(intl,intb)l:當前層次b:當前基址函數描述返回值
尋找符號所在層次基址編譯原理設計說明
5程序測試
1)右移
在詞法分析的voidgetsym()函數中添加:strcpy(sym,"shr");getch();}elsestrcpy(sym,"gtr");//檢測>符號在語法和語義分析的boolaf(intlev)函數中添加:if(strcmp(sym,"shr")==0){getsym();gen(lit,0,num);gen(opr,0,23);//shroperatinggetsym();}
在解釋程序中添加:case23://shrt--;stack[t]=(stack[t]>>stack[t+1]);BreakTest1:取余運算測試目標測試用例的plx源程序語法分析代碼生成解釋程序右移運算//shrprogramintegerj,rbeginj:=257;writej;r:=j>>5;writerend.測編譯此程序試查看輸出步驟
編譯原理
測試結果設計說明
6課程設計總結
通過這次課程設計,我終于明白了做一個編譯器的是多么的不容易。每一條語句都需要那么多的考慮,每執(zhí)行一條語句需要做的是很多的指令。我做這個程序的時候遇到了很多困難,是我以前沒有遇到過的。
在自己的思考及老師,同學的幫助下擴充了右移運算的功能,
因水平和時間有限,目前也只能擴充這一個功能了。
40編譯原理設計說明
7參考文獻
[1]嚴蔚敏,吳偉國.數據結構.北京:清華大學出版社,201*
[2]陳火旺,劉春林等.程序設計語言編譯原理(第3版).北京:國防工業(yè)出版社,201*[3]網絡資料
友情提示:本文中關于《夏彥 一周工作總結》給出的范例僅供您參考拓展思維使用,夏彥 一周工作總結:該篇文章建議您自主創(chuàng)作。
來源:網絡整理 免責聲明:本文僅限學習分享,如產生版權問題,請聯系我們及時刪除。