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