版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PL/0語(yǔ)言是Pascal語(yǔ)言的一個(gè)子集,我們這里分析的PL/0的編譯程序包括了對(duì)PL/0PL/0語(yǔ)言編譯程序接受以語(yǔ)法分析為核心、一遍掃描的編譯方法。詞法分析和代碼生成作為獨(dú)立的子程序供語(yǔ)法分析程序調(diào)用。語(yǔ)法分析的同時(shí),供應(yīng)了出錯(cuò)報(bào)告和出錯(cuò)恢復(fù)的功能。在源程序沒(méi)有錯(cuò)誤編譯通過(guò)的狀況下,調(diào)用類(lèi)PCODE解釋程序解釋執(zhí)行生成的類(lèi)詞法分析子程序名為getsym,功能是從源程序中讀出一個(gè)單詞符號(hào)〔token〕,把它的信息放入全局變量sym.id和num中,語(yǔ)法分析器需要單詞時(shí),直接從這三個(gè)變量中(留意!語(yǔ)法分析器每次用完這三個(gè)變量的值就馬上調(diào)用getsym子程序獵取新的單詞供下一次使用。而不是在需要新單詞時(shí)才調(diào)用getsymiS程?!砱etsym過(guò)程通過(guò)反復(fù)調(diào)用getch子過(guò)程從源程序過(guò)獵取字符,并把它們拼成單詞。getch過(guò)程中使用了行緩沖區(qū)技術(shù)以提詞法分析器的分析過(guò)程:調(diào)用getsym時(shí),它通過(guò)getch過(guò)程從源程序中獲得一個(gè)字符。假如這個(gè)字符是字母,那么連續(xù)獵取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保存字表,假如查到為保存字,那么把sym變量賦成相應(yīng)的保存字類(lèi)型值;假如沒(méi)有查到,那么這個(gè)單詞應(yīng)是一個(gè)用戶(hù)自定義的標(biāo)識(shí)符(可能是變量名、常量名或是過(guò)程的名字),把sym置為ident,把這個(gè)單詞存入id變量。查保存字表時(shí)使用了二分法查找以提高效率。假如getch獲得的字符是數(shù)字,那么連續(xù)用getch獵取數(shù)字,并把它們拼成一個(gè)整數(shù),然后把sym置為number,并把拼成的數(shù)值放入num變量。假如識(shí)別出其它合法的符號(hào)(比方:賦值號(hào)、大于號(hào)、小于等于號(hào)等),那么把sym那么成相應(yīng)的類(lèi)型。假如遇到不合法的字符,把sym置成nul。語(yǔ)法分析子程序接受了自頂向下的遞歸子程序法,語(yǔ)法分析同時(shí)也依據(jù)程序的語(yǔ)意生成相應(yīng)的代碼,并供應(yīng)了出錯(cuò)處理的機(jī)制。語(yǔ)法分析主要山分程序分析過(guò)程(block)>常量定義分析過(guò)程(constdeclaration)>變量定義分析過(guò)程(vardeclaration)>語(yǔ)句分析過(guò)程(statement)>表達(dá)式處理過(guò)程(expression)>項(xiàng)處理過(guò)程(term)>因子處理過(guò)程(factor)和條件處理過(guò)程(condition)構(gòu)成。這些過(guò)程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。除此之外,還有出錯(cuò)報(bào)告過(guò)程(error)、代碼生成過(guò)程(gen)>測(cè)試單詞合法性及出錯(cuò)恢復(fù)過(guò)程(test)、登錄名字表過(guò)程本編譯程序在運(yùn)行的時(shí)候,通過(guò)主程序中調(diào)用分程序處理過(guò)程block來(lái)分析分程序局部(分程序分析過(guò)程中還可能會(huì)遞歸調(diào)用block過(guò)程),然后,推斷最終讀入的符號(hào)是否為句號(hào)。假如是句號(hào)且分程序分析中未出錯(cuò),那么是一個(gè)合法的PL/0程序,可以運(yùn)行生成的代碼,否那么就說(shuō)明源PL/0程序是不合法的,輸出出錯(cuò)提示即下面按各語(yǔ)法單元分析PL/0編譯程序的運(yùn)行機(jī)制。語(yǔ)法分析開(kāi)頭后,首先調(diào)用分程序處理過(guò)程(block)處理分程序。過(guò)程入口參數(shù)置為:0層、符號(hào)表位置0、出錯(cuò)恢復(fù)單詞集合為句號(hào)、聲明符或語(yǔ)句開(kāi)頭符。進(jìn)入block過(guò)程后,首先把局部數(shù)據(jù)段安排指針設(shè)為3,預(yù)備安排3個(gè)單元供運(yùn)行期存放靜態(tài)鏈SL、動(dòng)態(tài)鏈DL和返回地址RA。然后用tx0生一條jmp指令,預(yù)備跳轉(zhuǎn)到主程序的開(kāi)頭位置,由于當(dāng)前還沒(méi)有知到主程序到底在何處開(kāi)頭,所以jmp的LI標(biāo)臨時(shí)填為0,稍后再改。同時(shí)在符號(hào)表的當(dāng)前位置記錄下這個(gè)jmp指令在代碼段中的位置。在推斷了嵌套層數(shù)沒(méi)有超過(guò)規(guī)定的層數(shù)后,開(kāi)始分析源程序。首先推斷是否遇到了常量聲明,假如遇到那么開(kāi)頭常量定義,把常量存入符號(hào)表。接下去用同樣的方法分析變量聲明,變量定義過(guò)程中會(huì)用dx變量記錄下局部數(shù)據(jù)段安排的空間個(gè)數(shù)。然后假如遇到procedure保存字那么進(jìn)行過(guò)程聲明和定義,聲明的方法是把過(guò)程的名字和所在的層次記入符號(hào)表,過(guò)程定義的方法就是通過(guò)遞歸調(diào)用block過(guò)程,由于每個(gè)過(guò)程都是一個(gè)分程序。由于這是分程序中的分程序,因此調(diào)用block時(shí)需把當(dāng)前的層次號(hào)lev加一傳遞給block過(guò)程。分程序聲明局部完成后,即將進(jìn)入語(yǔ)句的處理,這時(shí)的代碼安排指針ex的值正好指向語(yǔ)句的開(kāi)頭位置,這個(gè)位置正是前面的jmp指令需要跳轉(zhuǎn)到的位置。于是通過(guò)前面記錄下來(lái)的地址值,把這個(gè)jmp指令的跳轉(zhuǎn)位置改成當(dāng)前ex的位置。并在符號(hào)表中記錄下當(dāng)前的代碼段安排地址和局部數(shù)據(jù)段要安排的大小〔dx的值〕。生成一條int指令,安排dx個(gè)空間,作為這個(gè)分程序段的第一條指令。下面就調(diào)用語(yǔ)句處理過(guò)程statement分析語(yǔ)句。分析完成后,生成操作數(shù)為0的opr指令,用于從分程序返回(對(duì)于0層的主程序來(lái)說(shuō),就是程序運(yùn)行完成,退出)。通過(guò)循環(huán),反復(fù)獲得標(biāo)識(shí)符和對(duì)應(yīng)的值,存入符號(hào)表標(biāo)識(shí)符的名字、它所在的層及它在所在層中的偏移地址。語(yǔ)句處理過(guò)程是一個(gè)嵌套子程序,通過(guò)調(diào)用表達(dá)式處理、項(xiàng)處理、因子處理等過(guò)程及遞歸調(diào)用自己來(lái)實(shí)現(xiàn)對(duì)語(yǔ)句的分析。語(yǔ)句處理過(guò)程可以識(shí)別的語(yǔ)句包括賦值語(yǔ)句、read語(yǔ)句、write語(yǔ)句、call語(yǔ)句、過(guò)語(yǔ)句、while語(yǔ)句。當(dāng)遇到begin/end語(yǔ)首先獵取賦值號(hào)左邊的標(biāo)識(shí)符,從符號(hào)表中找到它的信息,并確認(rèn)這個(gè)標(biāo)識(shí)符確為變量名。然后通過(guò)調(diào)用表達(dá)式處理過(guò)程算得賦值號(hào)右部的表達(dá)式的值并生成相應(yīng)的指令保證這個(gè)值放在運(yùn)行期的數(shù)據(jù)棧頂。最終通過(guò)前面查到的左部變量的位置信息,生成相應(yīng)的sto指令,把棧頂值存入指定的變量的空間,實(shí)現(xiàn)了賦值操作。確定read語(yǔ)句語(yǔ)法合理的前提下(否那么報(bào)錯(cuò)),生成相應(yīng)的指令:第一條是的opr指令,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)整數(shù)值,放在數(shù)據(jù)棧頂。其次條是sto指令,把棧頂?shù)闹荡嫒雛ead語(yǔ)句括號(hào)中的變量所在的單元。與read語(yǔ)句相像。在語(yǔ)法正確的前提下,生成指令:通過(guò)循環(huán)調(diào)用表達(dá)式處理過(guò)程分析write語(yǔ)句括號(hào)中的每一個(gè)表達(dá)式,生成相應(yīng)指令保證把表達(dá)式的值算出并放到數(shù)據(jù)棧頂并生成14號(hào)操作的opr指令,輸出表達(dá)式的值。最終生成15號(hào)操?gòu)姆?hào)表中找到call語(yǔ)句右部的標(biāo)識(shí)符,獲得其所在層次和偏移地址。然后生成相應(yīng)的cal指令。至于調(diào)用子過(guò)程所需的愛(ài)護(hù)現(xiàn)場(chǎng)等工作是111類(lèi)PCODE解釋程按if語(yǔ)句的語(yǔ)法,首先調(diào)用規(guī)律表達(dá)式處理過(guò)程處理過(guò)語(yǔ)句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。接下去記錄下代碼段安排位置(即下面生成的jpc指令的位置),然后生成條件轉(zhuǎn)移jpc指令〔遇0或遇假轉(zhuǎn)移〕,轉(zhuǎn)移地址未知臨時(shí)填0o然后調(diào)用語(yǔ)句處理過(guò)程處理then語(yǔ)句后面的語(yǔ)句或語(yǔ)句塊。then后的語(yǔ)句處理完后,當(dāng)前代碼段安排指針的位置就應(yīng)當(dāng)是上面的jpc指令的轉(zhuǎn)移位置。通過(guò)前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置。通過(guò)循環(huán)遍歷begin/end語(yǔ)句塊中的每一個(gè)語(yǔ)句,通過(guò)遞歸調(diào)用語(yǔ)句分析過(guò)程首先用cxl變量登記當(dāng)前代碼段安排位置,作為循環(huán)的開(kāi)頭位置。然后處理while語(yǔ)句中的條件表達(dá)式生成相應(yīng)代碼把結(jié)果放在數(shù)據(jù)棧頂,再用cx2變量登記當(dāng)前位置,生成條件轉(zhuǎn)移指令,轉(zhuǎn)移位置未知,填0。通過(guò)遞歸調(diào)用語(yǔ)句分析過(guò)程分析do語(yǔ)句后的語(yǔ)句或語(yǔ)句塊并生成相應(yīng)代碼。最終生成一條無(wú)條件跳轉(zhuǎn)指令jmp,跳轉(zhuǎn)到cxl所指位置,并把cx2所指的條件跳轉(zhuǎn)指令的跳轉(zhuǎn)位置改成當(dāng)前代碼段安排位置。依據(jù)PL/0語(yǔ)法可知,表達(dá)式應(yīng)當(dāng)是山正負(fù)號(hào)或無(wú)符號(hào)開(kāi)頭、由假設(shè)干個(gè)項(xiàng)以加減號(hào)連接而成。而項(xiàng)是山假設(shè)干個(gè)因子以乘除號(hào)連接而成,因子那么可能是一個(gè)標(biāo)識(shí)符或一個(gè)數(shù)字,或是一個(gè)以括號(hào)括起來(lái)的子表達(dá)式。依據(jù)這樣的結(jié)構(gòu),構(gòu)造出相應(yīng)的過(guò)程,遞歸調(diào)用就完成了表達(dá)式的處理。把項(xiàng)和因子獨(dú)立開(kāi)處理解決了加減號(hào)與乘除號(hào)的優(yōu)先級(jí)問(wèn)題。在這兒個(gè)過(guò)程的反復(fù)調(diào)用中,始終傳遞fsys變量的值,保證可以在出錯(cuò)的狀況下跳過(guò)出錯(cuò)的符號(hào),使分析過(guò)程得以進(jìn)行下去。首先推斷是否為一元規(guī)律表達(dá)式:判奇偶。過(guò)程分析計(jì)算表達(dá)式的值,然后生成判奇指令。假如不是,那么確定是二元規(guī)律運(yùn)算處理過(guò)程依次分析運(yùn)算符左右兩局部的值,放在棧頂?shù)膬蓚€(gè)空間中,然后依不同的規(guī)律運(yùn)算符,生成相應(yīng)的規(guī)律推斷指令,放入代碼段。推斷單詞合法性與出錯(cuò)恢復(fù)過(guò)程分析:測(cè)試當(dāng)前符號(hào)(即sym變量中的值)是否在si集合中,假如不在,就通過(guò)調(diào)用出錯(cuò)報(bào)告過(guò)程輸出出錯(cuò)代碼n,并放棄當(dāng)前符號(hào),通過(guò)詞法分析過(guò)程獵取一下單詞,直到這個(gè)單詞消滅在si或s2集合中為止。這個(gè)過(guò)程在實(shí)際使用中很機(jī)敏,主要有兩個(gè)用法:在進(jìn)入某個(gè)語(yǔ)法單位時(shí),調(diào)用本過(guò)程,檢查當(dāng)前符號(hào)是否屬于該語(yǔ)法單位的開(kāi)始符號(hào)集合。假設(shè)不屬于,那么濾去開(kāi)頭符號(hào)和后繼符號(hào)集合外的全部符號(hào)。在語(yǔ)法單位分析結(jié)束時(shí),調(diào)用本過(guò)程,檢查當(dāng)前符號(hào)是否屬于調(diào)用該語(yǔ)法單位時(shí)應(yīng)有的后繼符號(hào)集合。假設(shè)不屬于,那么濾去后繼符號(hào)和開(kāi)頭符號(hào)集合外的全部通過(guò)這樣的機(jī)制,可以在源程序消滅錯(cuò)誤時(shí),準(zhǔn)時(shí)跳過(guò)出錯(cuò)的局部,保證語(yǔ)法分析可以連續(xù)下去。語(yǔ)法分析過(guò)程中調(diào)用的其它子過(guò)程相比照擬簡(jiǎn)潔,請(qǐng)參考源程序的注釋。數(shù)據(jù)段用于存放運(yùn)行期數(shù)據(jù)、擁有一個(gè)代碼段用于存放類(lèi)PCODE程序代碼。同時(shí)還擁用數(shù)據(jù)段安排指針、指令指針、指令存放器、局部段基址指針等存放器。對(duì)于源程序的每一個(gè)過(guò)程(包括主程序),在被調(diào)用時(shí),首先在數(shù)據(jù)段中開(kāi)辟三個(gè)空間,存放靜態(tài)鏈SL、動(dòng)態(tài)鏈DL和返回地址RA。靜態(tài)鏈記錄了定義該過(guò)程的直接外過(guò)程(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址。動(dòng)態(tài)鏈記錄調(diào)用該過(guò)程前正在運(yùn)行的過(guò)程的數(shù)據(jù)段基址。返回地址記錄了調(diào)用該過(guò)程時(shí)程序運(yùn)行的斷點(diǎn)要引用它的直接或間接父過(guò)程(這里的父過(guò)程是按定義過(guò)程時(shí)的嵌套悄況來(lái)定的,而不是按執(zhí)行時(shí)的調(diào)用挨次定的)的變量時(shí),可以通過(guò)靜態(tài)鏈,跳過(guò)個(gè)數(shù)為層差的數(shù)據(jù)段,找到包含要引用的變量所在的數(shù)據(jù)段基址,然后通過(guò)偏移地址訪問(wèn)它。在過(guò)程返回時(shí),解釋程序通過(guò)返回地址恢復(fù)指令指針的值到調(diào)用前的地址,通過(guò)當(dāng)前段基址恢復(fù)數(shù)據(jù)段安排指針,通過(guò)動(dòng)態(tài)鏈恢復(fù)局部段基址指針。實(shí)現(xiàn)子過(guò)程的返回。對(duì)于主程序來(lái)說(shuō),解釋程序會(huì)遇到返回地址為0的請(qǐng)況,這時(shí)就認(rèn)為程序運(yùn)行結(jié)束。層數(shù)的局部數(shù)據(jù)段基址。這在使用st。、lod等訪問(wèn)局部變量的指令中會(huì)經(jīng)常用相應(yīng)的動(dòng)作。當(dāng)遇到主程序中的返回指令時(shí),指令指針會(huì)指到0位置,把這樣一個(gè)條件作為終至循環(huán)的條件,保證程序運(yùn)行可以正常的結(jié)束。programpl0(input,output));(*PL/0編譯程序與代碼生成解釋運(yùn)行程序*)label99;(*聲明出錯(cuò)跳轉(zhuǎn)標(biāo)記*)norw二11;(*ofreservedwords*)(*保存字的個(gè)數(shù)*)txmax=100;(*lengthofidentifiertable*)(*標(biāo)識(shí)符表的長(zhǎng)度(容ft)*)nmax=14;(水maxnumberofdigitsinnumbers*)(*數(shù)字允許的最長(zhǎng)位數(shù)*)al=10;(*lengthofidentifiers*)(*標(biāo)識(shí)符最長(zhǎng)長(zhǎng)度*)amax=2047;(*maximumaddress*)(水尋址空間水)levmax=3;(*maxdepthofblocknesting*)(*最大允許的塊嵌套層數(shù)*)容納代碼行數(shù))*)symbol=(nul,ident,number,plus,minus,times,sllss,leq,gtr,geq,lparen,rparen,comma,semicolon,pbeginsym,endsym,ifsym,thensconstsym,varsym,procsym);(*symobl類(lèi)型標(biāo)識(shí)了不同類(lèi)型的詞匯*)alfa=packedarray[1..al]ofchar;(*alfa類(lèi)型用于標(biāo)識(shí)符*)objectl=(constant,variable,procedur);(*objectl為三種標(biāo)識(shí)符的fct=(lit,opr,lod,sto,cal,int,jmp,jpc);(*fct類(lèi)型分別標(biāo)識(shí)a:0.·amax;(*displacementaddrjmp0,ajumptoajpc0,ajumpconditionaltoaid:alfa;(*lastcc:integer;(*charactercount*)(*行緩沖區(qū)指針*)塊總在ex所指位置生成新的代碼*)line:array[1..81]ofchar;(*行緩沖區(qū),用于從文件讀出一行,供詞法分析獵取單詞時(shí)之用*)a:alfa;&詞法分析器中用于臨時(shí)存放正在分析的詞*)word:array[1..norw]ofalfa;(*保存字表*)類(lèi)型*)ssym:array]ofsymbol:(*一些符號(hào)對(duì)應(yīng)的symbol類(lèi)型表*)和項(xiàng)開(kāi)頭符號(hào)集合*)table:array[0..txmaxZofrecord(*constant:(*假如是常量名*)variable,procedur:(*假如是變量名或過(guò)程名*)(level,adr,size:integer)(*存放層差、偏移地址和大小*)fin,fout:text;(*fin文本文件用于指向輸入沒(méi)有用到*)sfile:string;(*存放PL/0源程序文件的文件名*)procedureerror〔n:integer〕;writein('****',’’:ccT,n:2〕;(*在屏幕ccT位置顯示!與出錯(cuò)代碼提示,由于ccwritein(fal,’:cc~1,n:2);(*在文件與出錯(cuò)代碼提示*)err:二err+1(*出錯(cuò)總次數(shù)加一*)(*讀取原程序中下一個(gè)字符過(guò)程getch*)ifcc二11then〔*假如行緩沖區(qū)指針指向行緩沖區(qū)最終一個(gè)字符就從文件讀一行到行緩沖區(qū)*)ifeof(fin)then(*假如到達(dá)文件末尾*)writeProgramincomplete');(*出錯(cuò),退出程序水)11:=0;(*行緩沖區(qū)長(zhǎng)度置0*)cc:=0;(*行緩沖區(qū)指針置行首*)write〔cx:4,’’〕;&輸出ex值,寬度為4*〕write(fal,ex:4,’’);(*輸出ex值,寬度為4到文件*)whilenoteoln(fi11:=11+1;(*行緩沖區(qū)長(zhǎng)度加一*)(*可見(jiàn),PL/0源程序要求每行的長(zhǎng)度都小于81個(gè)字符*)read(fin,ch);(*我添加的代碼。由于PC上文本文件換行是以所以要把多余的LF從文件讀出,這里放在ch變量中是由于ch變量的值在下面即將被轉(zhuǎn)變,把這個(gè)多余值放在ch中沒(méi)有問(wèn)題*)writein(fal);ifchin[’d’..’z’]then(*假如讀出的字符是一個(gè)字母,說(shuō)明是保存字或k:=0;(廉標(biāo)識(shí)符緩沖區(qū)指針置0*)repeat(*這個(gè)循環(huán)用于依次讀出源文件中的字符構(gòu)成標(biāo)識(shí)符粉過(guò)k<althen(*假如標(biāo)識(shí)符長(zhǎng)度沒(méi)有超過(guò)最大標(biāo)識(shí)符長(zhǎng)度(假如超過(guò),就取前面一局部,把多余的拋棄)*)以字母開(kāi)頭,后面跟假設(shè)干個(gè)字母或數(shù)字*)ifk>=kkthen(*假如當(dāng)前獲得的標(biāo)識(shí)符長(zhǎng)度大于等于kk*)repeat〔*這個(gè)循環(huán)用于把標(biāo)識(shí)符緩沖后部沒(méi)有填入相應(yīng)字母或空格的空間識(shí)符長(zhǎng)度小于kk,就把a(bǔ)數(shù)組的后部沒(méi)有字母的空間用空格補(bǔ)足。假如讀到的標(biāo)識(shí)符長(zhǎng)度大于等于kk,這時(shí)就不必在后面填空格了,由于它的后面確定全是空格。反之假如最近讀到的標(biāo)識(shí)符長(zhǎng)度小于kk,那就需要從kk位置向前,把超過(guò)當(dāng)前標(biāo)識(shí)長(zhǎng)度的空間填滿(mǎn)空格。以上的這樣一個(gè)規(guī)律,完全是出于程序性能的上考慮。其實(shí)完全可以簡(jiǎn)潔的把a(bǔ)數(shù)組中a[k]元素以后的空間不管三七二十一全填空格。(*下面開(kāi)頭二分法查找看讀出的標(biāo)識(shí)符是不是保存字之一*)ifid<=word[k]then(*假如當(dāng)前的標(biāo)識(shí)符小于k所指的保存字*)j:=k-1;(*移動(dòng)j指針*)ifid>=word[k]then(*假如當(dāng)前的標(biāo)識(shí)符大于k所指的保存字*)中存的是保存字*)sym:=wsym[k]&找到保存字,把sym置為相應(yīng)的保存字值*)sym:二ident〔*未找到保存字,把sym置為ident類(lèi)型,表示是標(biāo)識(shí)符*〕end(*至此讀出字符為字母即對(duì)保存字或標(biāo)識(shí)符的處理結(jié)束*)else(*假如讀出字符不是字母*)ifchin[’0'..’9’]then(*假如讀出字符是數(shù)字*)begin(*number*)(*開(kāi)頭對(duì)數(shù)字進(jìn)行處理*)k:二0;(*數(shù)字位數(shù)*)num:二0;(*數(shù)字置為0*)sym:=number:(*置sym為number,表示這一次讀到的是數(shù)字*)repeat(*這個(gè)循環(huán)依次從源文件中讀出字符,組成數(shù)字粉num:=10*num+(ord(ch)-ord('0'));〔*num*10加上最近讀出的k:二k+1;(*數(shù)字位數(shù)加一*)〔*發(fā)出30號(hào)錯(cuò)*〕end(*至此對(duì)數(shù)字的識(shí)別處理結(jié)束時(shí)過(guò)ch二’:then(*假如讀出的不字母也不是數(shù)字而是冒號(hào)時(shí)sym:二becomes;〔*sym的類(lèi)型設(shè)為賦值號(hào)becomes*〕sym:=nul;(*假如不是讀到等號(hào),那單獨(dú)的一個(gè)冒號(hào)就什么也不是*)end仕以上完成對(duì)賦值號(hào)的處理*)else〔*假如讀到不是字母也不是數(shù)字也不是冒號(hào)粉ifch=*<*then(*假如讀到小于號(hào)*)getch;〔*再讀一個(gè)字符*〕ifch=*二’then(*假如讀到等號(hào)*)sym:=leq;(*購(gòu)成一個(gè)小于等于號(hào)*)else(*假如小于號(hào)后不是跟的等號(hào)*)sym:=1ss〔*那就是一個(gè)單獨(dú)的小于號(hào)*〕else(*假如讀到不是字母也不是數(shù)字也不是冒號(hào)也不是小于號(hào)*)過(guò)ch二’〉’then(*假如讀到大于號(hào),處理過(guò)程類(lèi)似getch;(*再讀一個(gè)字符歡)sym:二geq;(*購(gòu)成一個(gè)大于等于號(hào)*)else〔*假如大于號(hào)后不是跟的等號(hào)*〕sym:=gtr〔*那就是一個(gè)單獨(dú)的大于號(hào)*〕else〔*假如讀到不是字母也不是數(shù)字也不是冒號(hào)也不是小于號(hào)也不是大于號(hào)begin(*那就說(shuō)明它不是標(biāo)識(shí)符/保存字,也不是簡(jiǎn)單的雙字節(jié)操作符,應(yīng)該是一個(gè)一般的符號(hào)*)sym:=ssym[ch]:〔*直接成符號(hào)表中查到它的類(lèi)型,賦給sym*〕getch(*讀下一個(gè)字符*)(*整個(gè)過(guò)語(yǔ)句推斷結(jié)束*)(*詞法分析過(guò)程getsym總結(jié):從源文件中讀出假設(shè)干有效字符,組成一個(gè)token串,識(shí)別它的類(lèi)型為保存字/標(biāo)識(shí)符/數(shù)字或是其它符號(hào)。假如是保存字,把sym置成相應(yīng)的保存字類(lèi)型,假如是標(biāo)識(shí)符,把sym置成ident表示是標(biāo)識(shí)符,于此同時(shí),id變量中存放的即為保留字字符串或標(biāo)識(shí)那么直接把sym置成相應(yīng)類(lèi)型。經(jīng)過(guò)本過(guò)程后ch變量中存放的是下一個(gè)即將被識(shí)別的字符*)(*y,z:代碼的兩個(gè)操作數(shù)*)(*本過(guò)程用于把生成的U標(biāo)代碼寫(xiě)入U(xiǎn)標(biāo)代碼數(shù)組,供后面的解釋器解釋執(zhí)行*)proceduregen(x:fct;y,z:integer);ifex>exmaxthen〔*假如cx>cxmax表示半前生成的代碼行號(hào)大于允許的最大代碼行數(shù)*)(*測(cè)試當(dāng)前單詞是否合法過(guò)程test*)集(*s2:在某一出錯(cuò)狀態(tài)下,可恢復(fù)語(yǔ)法分析正常工作的補(bǔ)充單詞集合*)(*n:出錯(cuò)信息編號(hào),當(dāng)當(dāng)前符號(hào)不屬于合法的si集合時(shí)發(fā)出的出錯(cuò)信息時(shí)proceduretest(si,s2:symset:n:integer):ifnot(syminsi)then(*假如當(dāng)前符號(hào)不在si中*)error〔n〕;(*發(fā)出n號(hào)錯(cuò)誤水)si:二si+s2;(*把s2集合補(bǔ)充進(jìn)si集合*)whilenot(syminsi)do(*通過(guò)循環(huán)找到下一個(gè)合法的符號(hào),以恢復(fù)語(yǔ)法分析工作*)getsym(*fsys:用于出錯(cuò)恢復(fù)的單詞集合*)procedureblock(lev,tx:integer;fsys:symset);dx:integer;〔*dataallocationindex*〕(*數(shù)據(jù)段內(nèi)存安排指針,指向下一個(gè)被安排空間在數(shù)據(jù)段中的偏移位置*)位置時(shí)(*記錄本層開(kāi)頭時(shí)代碼段安排(*登陸符號(hào)表過(guò)程enter◆)begin(*enterobjecttx:=tx+1;(*符號(hào)表指針指向一個(gè)新的空位紂withtable[tx]do(*開(kāi)頭登錄*)name:=id;(*name是符號(hào)的名字,對(duì)于標(biāo)識(shí)符,這里就是標(biāo)識(shí)符的名字時(shí)casekof(*依據(jù)不同的類(lèi)型進(jìn)行不同的操作*)constant:(*假如是常量名*)過(guò)num>amaxthen(*在常量的數(shù)值大于允許的最大值的惜況下*)拋出31號(hào)錯(cuò)誤時(shí)實(shí)際登陸的數(shù)字以0代替*)val:二num(*如是合法的數(shù)值,就登陸到符號(hào)表*)dx:=dx+1;(*偏移量自增一,為下一次做好預(yù)備*)procedur:(*假如要登陸的是過(guò)程名*)(*登錄符號(hào)過(guò)程沒(méi)有考慮到重復(fù)的定義的問(wèn)題。假如消滅重復(fù)定義,那么以最終一次的定義為準(zhǔn)。*〕(*在符號(hào)表中查找指定符號(hào)所在位置的函數(shù)position*)(*返回值:要找的符號(hào)在符號(hào)表中的位置,假如找不到就返回0*)table[01.name:=id;〔*先把id放入符號(hào)表0號(hào)位置*〕position:=i(*返回找到的位置號(hào),假如沒(méi)找到那么肯定正procedureconstdeclaration;符*)getsym;(水獵取下一個(gè)token*)〔1〕;〔*拋出1號(hào)錯(cuò)誤*)(*這里其實(shí)自動(dòng)進(jìn)行了錯(cuò)誤訂正使編譯連續(xù)進(jìn)行,把賦值號(hào)當(dāng)作等號(hào)處理getsym;〔*獵取下一個(gè)token,等號(hào)或賦值號(hào)后應(yīng)接上數(shù)字*〕過(guò)sym=numberthen〔*假如的確是數(shù)字*〕enter〔constant〕;(*把這個(gè)常量登陸到符號(hào)表*)error(2)(*假如等號(hào)后接的不是數(shù)字,拋出2號(hào)錯(cuò)誤時(shí)error(3)仕假如常量標(biāo)識(shí)符后接的不是等號(hào)或賦值號(hào),拋出3號(hào)錯(cuò)誤水)error(4)(*假如常量聲明過(guò)程遇到的第一個(gè)符號(hào)不為標(biāo)識(shí)符,拋出4號(hào)錯(cuò)誤procedurevardeclaraifsym二identthen(*變量聲明過(guò)程開(kāi)頭遇到的第一個(gè)符號(hào)必定應(yīng)為標(biāo)識(shí)符enter(variable);(*將標(biāo)識(shí)符登陸到符號(hào)表中*)getsym(*獵取下一個(gè)token,為后面作預(yù)備*)error(4)(*假如變量聲明過(guò)程遇到的第一個(gè)符號(hào)不是標(biāo)識(shí)符,拋出4號(hào)錯(cuò)誤end(*vardeclaration水);iflistswitchthen〔*假如用戶(hù)選擇是要列出代碼的狀況下才列出代碼*〕fori:二cx0toex-1do(*從當(dāng)前層代碼開(kāi)頭位置到當(dāng)前代碼位置T處,即為本分程序塊*)助記符和L與A操作數(shù)*)(*我修改的代碼:原程序此處在輸出i時(shí),沒(méi)有指定占4個(gè)字符寬度,不美觀也與下面一句不配套。*)procedurestatemeexpression〔fsys:symset〕;procedureterm〔fsys:symset〕;procedurefactor(fsys:symset);test(facbegsys,fsys,24);(*開(kāi)頭因子處理前,先檢查當(dāng)前token是否在(*假如不是合法的token,拋24號(hào)錯(cuò)誤,并通過(guò)fsys集恢復(fù)使語(yǔ)法處理可以ifsym=identthen(*假如遇到的是標(biāo)識(shí)符*)ifi=0then(*假如查符號(hào)表返回為0,表示沒(méi)有找到標(biāo)識(shí)符*)error(11)(*拋出11號(hào)錯(cuò)誤*)WithtableEi]do〔*假如在符號(hào)表中找到了當(dāng)前標(biāo)識(shí)符的位置,開(kāi)頭生成相casekindofconstant:gen(lit,0,val):〔*假如這個(gè)標(biāo)識(shí)符對(duì)應(yīng)的是常量,值為val,生成lit指令,把Vdl放到棧頂*)variable:gen(lod,lev-level,adr);〔*假如標(biāo)識(shí)符是變量名,生成(*把位于距離當(dāng)前層level的層的偏移地址為adr的變量放到棧頂*)procedur:error〔21〕&假如在因子處理中遇到的標(biāo)識(shí)符是過(guò)程名,出錯(cuò)了,拋21號(hào)錯(cuò)*]ifnum>amaxthen〔*假如數(shù)字的大小超過(guò)允許最大值num:二0(*把數(shù)字按0值處理*)gen(lit,0,num);〔*生成lit指令,把這個(gè)數(shù)值字面常量放到棧頂*〕ifsym=lparenthen(*假如遇到的是左括號(hào)*)getsym;(*獵取一個(gè)token*)expression([rparen]+fsys);〔*遞歸調(diào)用expression子程序分析一個(gè)子表達(dá)式*)ifsym=rparenthen(*子表達(dá)式getsym〔*假如的確遇到右括號(hào),讀取下一個(gè)tokerror〔22〕(*否那么拋出22test(fsys,facbegsys,23)(*一個(gè)因子處理完畢,遇到的token應(yīng)在fsys集合中*)(*假如不是,拋23號(hào)錯(cuò),并找到下一個(gè)因子的開(kāi)頭,使語(yǔ)法分析可以連續(xù)運(yùn)行下去*)factor([times,slash]+fsys);〔*每一個(gè)項(xiàng)都應(yīng)當(dāng)由因子開(kāi)頭,因此調(diào)用factor子程序分析因子*)mulop:二sym;(*保存當(dāng)前運(yùn)算符*)factor〔fsys+[times,slash]〕;〔*運(yùn)算符后應(yīng)是一個(gè)因子,故調(diào)factor(*生成乘法指令*)(*不是乘號(hào)肯定是除號(hào),生成除法指令*)ifsymin[plus,minus]then示正負(fù)號(hào)*)beginaddop:二sym;〔*把當(dāng)前的正號(hào)或負(fù)號(hào)保存起getsym;(*獵取一個(gè)toterm〔fsys+[plus,minus]〕:〔*正負(fù)號(hào)后面應(yīng)當(dāng)是一個(gè)項(xiàng),調(diào)term子程序分析*)ifaddop=minusthen(*假如保存下來(lái)的符號(hào)是負(fù)號(hào)*)gen〔opr,0,1〕(*生成一條1號(hào)操作指令:取反運(yùn)算*)(*假如不是負(fù)號(hào)就是正號(hào),不需生成相應(yīng)的指令*)else(*假如不是山正負(fù)號(hào)開(kāi)頭,就應(yīng)是一個(gè)項(xiàng)開(kāi)頭*)whilesymin[plus,minus]do〔*項(xiàng)后應(yīng)是加運(yùn)算或減運(yùn)算*〕getsym;〔*獵取下一個(gè)token,加減運(yùn)算符后應(yīng)跟的是一個(gè)項(xiàng)*〕ifaddop=plusthegen(opr,0,3)(*生成3號(hào)操作指令:減法*)(*條件處理過(guò)程condition◆)procedurecondition(frelop:symbol;〔*用于臨時(shí)記錄token(這里肯定是一個(gè)二元規(guī)律運(yùn)算符)的內(nèi)容*)begirifsym=oddsymthen(*假如是odd運(yùn)算符(一元)*)getsym;(*獵取下一個(gè)token*)gen〔opr,0,6〕;〔生成6號(hào)操作指令:奇偶推斷運(yùn)算*〕else(*假如不是odd運(yùn)算符(那就肯定是二元規(guī)律運(yùn)算符)*)expression([eql,neq,1ss,leq,gtr,geq]+fsys);(*對(duì)表達(dá)式左部進(jìn)行處理計(jì)算*)ifnot(symin[eql,neq,lss,leg,gtr,geq])then(*假如token不是邏輯運(yùn)算符中的一個(gè)*)error(20)(*拋出20號(hào)錯(cuò)誤*)relop:二sym;(*記錄下當(dāng)前的規(guī)律運(yùn)算符*)getsym;(*獵取下一個(gè)token*)expression(fsys);(*對(duì)表達(dá)式右部進(jìn)行處理訃算*)caserelopof(*假如剛剛的運(yùn)算符是下面的一種粉eql:gen(opr,0,8);(*等號(hào):產(chǎn)生8號(hào)判等指令時(shí)neq:gen(opr,0,9);(*不等號(hào):產(chǎn)生9號(hào)判不等指令粉lssgen(opr,0,1(歡大于等號(hào)號(hào):產(chǎn)生11號(hào)判不小于指令*)leq:gen(opr,0,13);(*小于等于號(hào):產(chǎn)生13號(hào)判不大于指令*)i:二position(id);(*在符號(hào)表中查到該標(biāo)識(shí)符所在位置*)ifi=0then(*假如沒(méi)找到*)error(11)(*拋出11號(hào)錯(cuò)誤*)iftable[i].kind<>variablethen(*假如在符號(hào)表中找到該標(biāo)識(shí)符,但該標(biāo)識(shí)符不是變量名*)error(12);(*拋出12號(hào)錯(cuò)誤水)error(34)(*拋出34號(hào)錯(cuò)誤*)ifsym=identthen(*假如確為一個(gè)標(biāo)識(shí)符*)(*這里略有問(wèn)題,還應(yīng)推斷一下這個(gè)標(biāo)識(shí)符是不是變量名,假如是常量名或過(guò)程名應(yīng)出錯(cuò)*)i:=position(id)(*查符號(hào)表,找到它所在位置給i,找不到時(shí)i會(huì)為0i:二0;(*不是標(biāo)識(shí)符那么有問(wèn)題,i置0作為出錯(cuò)標(biāo)志*)ifi=0then(*假如有錯(cuò)誤*)error〔35〕(*拋出35號(hào)錯(cuò)誤*)else〔*否那么生成相應(yīng)的口標(biāo)代碼*〕gen(sto,lev-level,adr)(*生成sto指令,把讀入的值存入指定變量所在的空間*)右括號(hào)*)untilsym<>comma;〔*不斷生成代碼直到read語(yǔ)句的參數(shù)表中的變量遍歷完為止,這里遇到不是逗號(hào),應(yīng)為右括號(hào)*)ifsym<>rparenthen(*假如不是我們預(yù)想中的右括號(hào)*)whilenot〔syminfsys〕do(*依靠fsys集,找到下一個(gè)合法的token,恢復(fù)語(yǔ)法分析*)getsym〔*假如read語(yǔ)句正常結(jié)束,得到下一個(gè)token,一般為分號(hào)或end*〕過(guò)sym=writesymthen〔*假如遇到/write語(yǔ)句*〕getsym;(*獵取下一token,應(yīng)為左括號(hào)*)repeat〔*依次獵取括號(hào)中的每一個(gè)值,進(jìn)行輸出*〕getsym;〔*獲得一個(gè)token,這里應(yīng)是一個(gè)標(biāo)識(shí)符*〕expression〔[rparen,comgen(opr,0,14)(*生成14號(hào)指令:向屏幕輸出*)untilsym>comma;〔*循環(huán)直到遇到的不再是逗號(hào),這時(shí)應(yīng)是右括號(hào)*〕error(33)(*拋出33號(hào)錯(cuò)誤*)gen〔opr,0,15〕&生成一個(gè)13號(hào)操作的目標(biāo)代碼,功能是輸出一個(gè)換行*)(*由此可知PL/0中的write語(yǔ)句與Pascal中的writein語(yǔ)句類(lèi)似,是帶有輸出換行的水)error(11)(*拋出11號(hào)錯(cuò)誤*)error(15);&假如call后跟的不是過(guò)程名,拋出15號(hào)錯(cuò)誤粉getsym;〔*獵取一token應(yīng)是一個(gè)規(guī)律表達(dá)式*〕錯(cuò)恢復(fù)集中參與then和do語(yǔ)句*)cxl:二ex;&登記當(dāng)前代碼安排指針位置*)生成條件跳轉(zhuǎn)指令,跳轉(zhuǎn)位置臨時(shí)填0,分析完語(yǔ)句后再statement〔fsys〕;(*分析thencodeEcxl1.a-cx(*上一行指令(cxl所指的)的跳轉(zhuǎn)位置應(yīng)為當(dāng)前ex所指位置進(jìn)行分析處理*)whilesymin[semicolon]+statbegsysdo〔*假如分析完一句后遇到分號(hào)或語(yǔ)句開(kāi)頭符循環(huán)分析下一句語(yǔ)句*)ifsym=semicolonthen〔*假如語(yǔ)句是分號(hào)(可能是空語(yǔ)句〕*)getsym〔*獵取下一token連續(xù)分析*〕error(10);&假如語(yǔ)句與語(yǔ)句間沒(méi)有分號(hào),出10號(hào)錯(cuò)*)statement([semicolon,error(17)(*假如不是end,拋出17號(hào)錯(cuò)*)cxl:二ex;&登記當(dāng)前代碼安排位置,這是while循環(huán)的開(kāi)頭位置*)condition〔[dosym]+fsys〕;〔*對(duì)這個(gè)規(guī)律表達(dá)式進(jìn)行分析汁算*)cx2:=ex;&登記當(dāng)前代碼安排位置,這是while的do中的語(yǔ)句的開(kāi)頭位置*)gen(jpc,0,0);&生成條件跳轉(zhuǎn)指令,跳轉(zhuǎn)位置臨時(shí)填0*)過(guò)sym=dosymthen〔*規(guī)律表達(dá)式后應(yīng)為do語(yǔ)句*〕error(18);(*if后缺少then,拋出18號(hào)錯(cuò)誤*)statement(fsys);(*分析do后的語(yǔ)句塊*)gen(jmp,0,cxl);住循環(huán)跳轉(zhuǎn)到cx1位置,即再次進(jìn)行規(guī)律推斷時(shí)code[cx2].a:=ex(*把剛剛填0的跳轉(zhuǎn)位置改成當(dāng)前位置,完成while語(yǔ)號(hào),假如沒(méi)有遇到,就拋19號(hào)錯(cuò)*)dx:二3;(*地址指示器給出每層局部量當(dāng)前已安排到的相對(duì)位置。置初始值為3的緣由是:每一層最開(kāi)頭的位置有三個(gè)空間用于存放靜態(tài)鏈tx0:二tx;&初始符號(hào)表指針指向當(dāng)前層的符號(hào)在符號(hào)表中的開(kāi)頭位置*)table[txl.adr:=ex;(*符號(hào)表當(dāng)前位置登記當(dāng)前層代碼的開(kāi)頭位置*)gen(jmp,0,0);&產(chǎn)生一行跳轉(zhuǎn)指令,跳轉(zhuǎn)位置臨時(shí)未知填0*)iflev>levmaxthen&假如當(dāng)前過(guò)程嵌套層數(shù)大發(fā)出32號(hào)錯(cuò)誤*)repeat(*開(kāi)頭循環(huán)處理源程序中全部的聲明局部*)ifsym=constsymthen〔*假如當(dāng)前token是const保存字,開(kāi)頭進(jìn)行常量聲getsym;〔*獵取下一個(gè)token,正常應(yīng)為用作常量名的標(biāo)識(shí)符*〕repeat(*反復(fù)進(jìn)行常量聲明*)constdeclaration;(*聲明以肖前token為標(biāo)識(shí)符的常量*)whilesym=commado(*假如遇到了逗號(hào)那么反復(fù)聲明下一個(gè)常量*)聲明以的前token為標(biāo)識(shí)符的常量*)end;ifsym=semicolonthen(*假如常量聲明結(jié)束,應(yīng)遇到分號(hào)*)getsym〔*獵取下一個(gè)token,為下一輪循環(huán)做好預(yù)備*〕error(5)(*假如常量聲明語(yǔ)句結(jié)束后沒(méi)有遇到分號(hào)那么發(fā)出5號(hào)錯(cuò)誤*)untilsym>ident(*假如遇到非標(biāo)識(shí)符,那么常量聲明結(jié)束*)它可以接受像下面的聲明方法,而依據(jù)課本上的EBNF范式不行得出下面的語(yǔ)即它可以接受分號(hào)或逗號(hào)隔開(kāi)的常量聲明,而依據(jù)EBNF范式只可接受用逗號(hào)getsym;(*獵取下一個(gè)token,此處正常應(yīng)為用作變量名的一個(gè)標(biāo)識(shí)符*)vardeclaration;whilesym=commado(*假如遇到了逗號(hào)那么反復(fù)聲明下一個(gè)變量*)getsym;〔*獵取下一個(gè)token,這里正好應(yīng)當(dāng)是標(biāo)識(shí)符*〕vardeclaration;〔*聲明以肖前token為標(biāo)識(shí)符的變量*〕ifsym=semicolonthen〔水假如變量聲明結(jié)束,應(yīng)遇到分號(hào)*〕getsym(*獵取下一個(gè)token,error(5)(*假如變量聲明語(yǔ)句結(jié)束后沒(méi)有遇到分號(hào)那么發(fā)出5號(hào)錯(cuò)誤*)untilsym>ident;(*假如遇到非標(biāo)識(shí)符,那么變量聲明結(jié)束*)(*這里也存在與上面的常量聲明一樣的毛?。号cPL/0的語(yǔ)法標(biāo)準(zhǔn)有沖突。*)ifsym=identthen(*假如token確為enter(procedur);〔*把這個(gè)過(guò)程登錄到名字表中*)error〔4〕;&否那么拋出4號(hào)錯(cuò)誤水)ifsym=semicolonthengetsym〔*獵取下一,個(gè)token,預(yù)備進(jìn)行語(yǔ)法分析的遞歸調(diào)用*〕error〔5〕;(*否那么拋出5號(hào)錯(cuò)誤*)block〔lev+1,tx,[semicolon]+fsys〕前層次加一,同時(shí)傳遞表頭索引、合法單詞符*)個(gè)end后的分號(hào)*)test(statbegsys+[ident,procsym],fsys,6);(*檢查當(dāng)前tok合法,不合法那么用fsys恢復(fù)語(yǔ)法分析同時(shí)拋6號(hào)錯(cuò)*)error(5)(*假如過(guò)程聲明后的符號(hào)不是分號(hào),拋出5號(hào)錯(cuò)誤*)test(statbegsys+[ident],不合法那么用聲明開(kāi)頭符號(hào)作出錯(cuò)恢復(fù)、拋7號(hào)錯(cuò)*〕untilnot(symindeclbegsys);(*直到聲明性的源程序分析完畢,連續(xù)向下執(zhí)行,分析主程序*)codeEtableEtx01.adrl.a:二ex;&把前面生成的跳轉(zhuǎn)語(yǔ)句的跳轉(zhuǎn)位置改成當(dāng)前位置*)withtable[tx0]do(*在符號(hào)表中記錄*)size:二dx;&長(zhǎng)度為當(dāng)前數(shù)據(jù)代安排位置粉gen(int,0,dx);(*生成安排空間指令,安排dx個(gè)空間水)塊*)gen(opr,0,O):(*生成從子程序返回操作指令*)test(fsys,[],8);&用fsys檢查當(dāng)前狀態(tài)是否合法,不合法那么拋8號(hào)錯(cuò)水)procedureinterpret;p,b,t:integer;(*programbass:array[1..stacksize]ofinteger;(*datastore◆)while1>0d
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年南昌客運(yùn)駕駛員應(yīng)用能力考試
- 2024年黑龍江客車(chē)駕駛員考試試題及答案
- 2024年西藏道路旅客運(yùn)輸知識(shí)考試題庫(kù)
- 房屋轉(zhuǎn)租租賃合同大全6篇
- 股東合作協(xié)議書(shū)15篇
- 無(wú)錫市商品房買(mǎi)賣(mài)合同
- 家具產(chǎn)品售后服務(wù)方案范本
- 個(gè)人商業(yè)計(jì)劃書(shū)完整版5篇
- 美麗的小興安嶺課件
- 地理自然特征與農(nóng)業(yè)一草原和荒漠新
- 幼兒園英語(yǔ)課件:有趣的身體 my body
- 羅克韋爾自動(dòng)化 集成架構(gòu)
- 學(xué)生申請(qǐng)退學(xué)審批表(模板)
- 小學(xué)生漢語(yǔ)拼音田字格練習(xí)紙藍(lán)打印版
- 你好,無(wú)廢校園主題班會(huì)
- PEP版五年級(jí)英語(yǔ)上冊(cè)教案Unit 1 單元教案 5
- 智能小區(qū)弱電室外管網(wǎng)施工方案(實(shí)用資料)
- 中醫(yī)內(nèi)科學(xué) 消渴課件
- 小學(xué)數(shù)學(xué)三年級(jí)上冊(cè)五 四則混合運(yùn)算教案
- 體檢中心理論知識(shí)考核試題與答案
- 燃?xì)獍踩R(shí)與應(yīng)急管理培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論