




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章PL/0編譯程序的實(shí)現(xiàn)本章目的:以PL/0編譯程序?yàn)閷?shí)例,學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技術(shù)1PL/0編譯程序的結(jié)構(gòu)2PL/0編譯程序的分析工作(詞法,語(yǔ)法和語(yǔ)義)實(shí)現(xiàn)3PL/0編譯程序的錯(cuò)誤處理方法4目標(biāo)代碼生成和類(lèi)pcode代碼解釋器
1.PL/0編譯程序的結(jié)構(gòu)
PL/0編譯程序
PL/0語(yǔ)言程序
類(lèi)p-code代碼源語(yǔ)言(PL/0)目標(biāo)語(yǔ)言(類(lèi)p-code)實(shí)現(xiàn)語(yǔ)言(pascal/C)
PL/0
類(lèi)p-codepascal/C
PL/0編譯程序類(lèi)p-code解釋程序類(lèi)p-code代碼PL/0源程序輸入數(shù)據(jù)輸出數(shù)據(jù)PL/0編譯系統(tǒng)的結(jié)構(gòu)框架PL/0語(yǔ)言PL/0語(yǔ)言:PASCAL語(yǔ)言的子集PL/0程序示例PL/0的語(yǔ)法描述圖PL/0語(yǔ)言的EBNF表示
PL/0程序示例CONSTA=10;(*常量說(shuō)明部分*)
VARB,C;(*變量說(shuō)明部分*)PROCEDUREP;(*過(guò)程說(shuō)明部分*)VARD;(*P的局部變量說(shuō)明部分*)PROCEDUREQ;(*P的局部過(guò)程說(shuō)明部分*)VARX;
BEGIN
READ(X);D:=X;WHILEX#0DOCALLP;
END;
BEGIN
WRITE(D);
CALLQ;
END;
BEGIN
CALLP;
END.Q過(guò)程體p過(guò)程體主程序體
輸入圓柱的半徑和高,計(jì)算一些面積、體積等
varr,h,len,a1,a2,volumn;begin read(r); read(h);
len:=2*3*r; a1:=3*r*r; a2:=a1+a1+len*h; volumn:=a1*h;
write(len); write(a1); write(a2); write(volumn);end.計(jì)算最大公約數(shù)varm,n,r,q;{計(jì)算m和n的最大公約數(shù)}proceduregcd;beginwhiler#0dobeginq:=m/n;r:=m-q*n;m:=n;n:=r;endend;beginread(m);read(n);{為了方便,規(guī)定m>=n}ifm<nthenbeginr:=m;m:=n;n:=r;end;beginr:=1;callgcd;write(m);end;end.pl/0程序--遞規(guī)調(diào)用varn;procedurerec;beginifn#0thenbeginwrite(n);n:=n-1;callrec;end;end;beginread(n);callrec;end.計(jì)算sum=1!+2!+...+n!,
n從控制臺(tái)讀入varn,m,fact,sum;{遞規(guī)計(jì)算fact=m!}procedurefactorial;beginifm>0thenbeginfact:=fact*m;m:=m-1;callfactorial;end;end;begin{讀入n}read(n);sum:=0;whilen>0dobeginm:=n;fact:=1;callfactorial;sum:=sum+fact;n:=n-1;end;{輸出n!}write(sum);end.
程序分程序.內(nèi)的文字表示語(yǔ)法成分(短語(yǔ))或內(nèi)的文字表示單詞符號(hào)程序.內(nèi)的文字表示語(yǔ)法成分(短語(yǔ))語(yǔ)法圖constidentnumber=,;varident,;;procedureident;分程序語(yǔ)句分程序PL/0語(yǔ)言的EBNF表示
構(gòu)成EBNF的元素—(非終結(jié)符,終結(jié)符,開(kāi)始符,規(guī)則)EBNF
的元符號(hào):
<>用左右尖括號(hào)括起來(lái)的內(nèi)容為非終結(jié)符
∷=讀做‘定義為’∷=的左部由右部定義→讀做‘定義為’→的左部由右部定義|讀做‘或’表示右部候選內(nèi)容{}表示花括號(hào)內(nèi)的內(nèi)容可重復(fù)任意次或限定次數(shù)
[]表示方括號(hào)內(nèi)的內(nèi)容為任選項(xiàng)
()表示圓括號(hào)內(nèi)的內(nèi)容優(yōu)先
例:用EBNF描述<整數(shù)>的定義:
<整數(shù)>∷=[+|-]<數(shù)字>{<數(shù)字>}
<數(shù)字>∷=0|1|2|3|4|5|6|7|8|9或<整數(shù)>∷=[+|-]<非零數(shù)字>{<數(shù)字>}|0
<非零數(shù)字>∷=1|2|3|4|5|6|7|8|9
<數(shù)字>∷=0|<非零數(shù)字>
PL/0語(yǔ)言是PASCAL語(yǔ)言的子集同PASCAL作用域規(guī)則(內(nèi)層可引用包圍它的外層定義的標(biāo)識(shí)符),上下文約束,過(guò)程可嵌套定義,可遞歸調(diào)用子集數(shù)據(jù)類(lèi)型,只有整型數(shù)據(jù)結(jié)構(gòu),只有簡(jiǎn)變和常數(shù)數(shù)字最多為14位標(biāo)識(shí)符的有效長(zhǎng)度是10語(yǔ)句種類(lèi)過(guò)程無(wú)參,最多可嵌套三層
目標(biāo)代碼類(lèi)p-code目標(biāo)代碼類(lèi)p-code是一種棧式機(jī)的匯編語(yǔ)言。棧式機(jī)系統(tǒng)結(jié)構(gòu):沒(méi)有累加器和寄存器,只有存儲(chǔ)棧指針?biāo)羞\(yùn)算都在棧頂(零地址機(jī))指令格式:flaf 功能碼l 層次差(標(biāo)識(shí)符引用層減去定義層)a 根據(jù)不同的指令有所區(qū)別指令功能表
consta=10;
varb,c;
procedurep;
begin
c:=b+a;
end;
begin
read(b);
whileb#0do
begin
callp;
write(2*c);
read(b);
end
end.
(0)jmp08轉(zhuǎn)向主程序入口(1)jmp02轉(zhuǎn)向過(guò)程p入口(2)
int03過(guò)程p入口,為過(guò)程p開(kāi)辟空間(3)lod13取變量b的值到棧頂(4)lit010取常數(shù)10到棧頂(5)opr02次棧頂與棧頂相加(6)sto14棧頂值送變量c中(7)opr00退棧并返回調(diào)用點(diǎn)(16)(8)
int05主程序入口開(kāi)辟5個(gè)??臻g(9)opr016從命令行讀入值置于棧頂(10)sto03將棧頂值存入變量b中(11)lod03將變量b的值取至棧頂(12)lit00將常數(shù)值0進(jìn)棧(13)opr09次棧頂與棧頂是否不等(14)jpc024等時(shí)轉(zhuǎn)(24)(條件不滿(mǎn)足轉(zhuǎn))(15)cal02
調(diào)用過(guò)程p(16)lit02常數(shù)值2進(jìn)棧(17)lod04將變量c的值取至棧頂(18)opr04次棧頂與棧頂相乘(2*c)(19)opr014棧頂值輸出至屏幕(20)opr015換行(21)opr016從命令行讀取值到棧頂(22)sto03棧頂值送變量b中(23)jmp011無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24)opr00結(jié)束退棧
PL/0編譯程序的結(jié)構(gòu)詞法分析程序語(yǔ)法語(yǔ)義分析程序代碼生成程序表格管理程序出錯(cuò)處理程序PL/0源程序目標(biāo)程序PL/0編譯程序的總體設(shè)計(jì)以語(yǔ)法、語(yǔ)義分析程序?yàn)楹诵?/p>
詞法分析程序和代碼生成程序都作為一個(gè)過(guò)程,當(dāng)語(yǔ)法分析需要讀單詞時(shí)就調(diào)用詞法分析程序,而當(dāng)語(yǔ)法、語(yǔ)義分析正確,需要生成相應(yīng)的目標(biāo)代碼時(shí),則調(diào)用代碼生成程序。表格管理程序?qū)崿F(xiàn)變量,常量和過(guò)程標(biāo)識(shí)符的信息的登錄與查找。出錯(cuò)處理程序,對(duì)詞法和語(yǔ)法、語(yǔ)義分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和與錯(cuò)誤性質(zhì)有關(guān)的編號(hào),并進(jìn)行錯(cuò)誤恢復(fù)。第2章PL/0編譯程序本章目的:以PL/0編譯程序?yàn)閷?shí)例,學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技術(shù)1PL/0編譯程序的結(jié)構(gòu)2PL/0編譯程序的分析工作(詞法,語(yǔ)法和語(yǔ)義)實(shí)現(xiàn)3PL/0編譯程序的錯(cuò)誤處理方法4目標(biāo)代碼生成和類(lèi)pcode代碼解釋器
2PL/0編譯程序的分析工作(詞法,語(yǔ)法和語(yǔ)義)
2.1PL/0編譯程序詞法分析的實(shí)現(xiàn)識(shí)別的單詞:保留字或關(guān)鍵字:如:BEGIN、END、IF、THEN等運(yùn)算符:如:+、-、*、/、:=、#、>=、<=等標(biāo)識(shí)符:用戶(hù)定義的變量名、常數(shù)名、過(guò)程名常數(shù):如:10、25、100等整數(shù)界符:如:‘,’、‘.’、‘;’、‘(’、‘)’等詞法分析過(guò)程GETSYM所要完成的任務(wù):從源程序讀字符(getch)濾空格識(shí)別保留字識(shí)別標(biāo)識(shí)符拼數(shù)識(shí)別單字符單詞拼雙字符單詞詞法分析過(guò)程:GETSYM框圖(見(jiàn)教材圖2.5)程序(
proceduregetsym)當(dāng)識(shí)別到標(biāo)識(shí)符時(shí)先查保留字表保留字表:(
begin(*main*))word[1]:=‘begin‘;word[2]:=‘call‘;...word[13]:=‘write‘;查到時(shí)找到相應(yīng)的內(nèi)部表示W(wǎng)sym[1]:=beginsym;wsym[2]:=callsym;…wsym[13]:=writesym;字符對(duì)應(yīng)的單詞表:ssym[‘+’]:=plus;ssym[‘-’]:=minus;…ssym[‘;’]:=semicolon;詞法分析如何把單詞傳遞給語(yǔ)法分析typesymbol=(nul,ident,number,plus,…,varsym,procsym);3個(gè)全程量
SYM:symbol;ID:alfa;NUM:integer;通過(guò)三個(gè)全程量
SYM、ID和NUM將識(shí)別出的單詞信息傳遞給語(yǔ)法分析程序。SYM:存放單詞的類(lèi)別如:有程序段落為:begininitial:=60;end對(duì)應(yīng)單詞翻譯后變?yōu)椋篵eginbeginsym,initialident,‘:=‘becomes,60number,‘;’semicolon,endendsym。ID:存放用戶(hù)所定義的標(biāo)識(shí)符的值如:initial(在SYM中放ident,在ID中放initial)NUM:存放用戶(hù)定義的數(shù)如:60(在SYM中放number,在NUM中放60)
使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)詞法分析程序的設(shè)計(jì)方法詞法分析程序的設(shè)計(jì)---使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)表示狀態(tài),對(duì)應(yīng)每個(gè)狀態(tài)編一段程序,每個(gè)狀態(tài)調(diào)用取字符程序,根據(jù)當(dāng)前字符轉(zhuǎn)到不同的狀態(tài),并做相應(yīng)操作。表示終態(tài),已識(shí)別出一個(gè)單詞。2.2PL/0編譯程序語(yǔ)法分析
自頂向下的語(yǔ)法分析遞歸子程序法(上下文無(wú)關(guān)文法)句型的分析句型分析就是識(shí)別一個(gè)符號(hào)串是否為某文法的句型的過(guò)程,或者說(shuō)是某個(gè)推導(dǎo)的構(gòu)造過(guò)程。對(duì)于一個(gè)給定的文法,要想判定一個(gè)符號(hào)串是否為該文法的句子,需要考察是否可以從該文法的開(kāi)始符號(hào)派生出(推導(dǎo)出)此符號(hào)串。-編譯程序的語(yǔ)法分析工作。分析算法分類(lèi)分析算法可分為:自上而下分析法:
從文法的開(kāi)始符號(hào)出發(fā),尋找與輸入符號(hào)串匹配的推導(dǎo),或者說(shuō),為輸入串尋找一個(gè)最左推導(dǎo)。自下而上分析法:
從輸入符號(hào)串開(kāi)始,逐步進(jìn)行歸約,直至歸約到文法的開(kāi)始符號(hào)。
語(yǔ)法分析-(從概念上講)建立一棵與輸入串相匹配的語(yǔ)法樹(shù)。
語(yǔ)法樹(shù)-推導(dǎo)的幾何表示句型aabbaa的可能推導(dǎo)序列和語(yǔ)法樹(shù)例:G[S]: S→aAS A→SbA A→SS S→a A→baS
aASSbAa
a
b
aSaASaAaaSbAaaSbbaaaabbaaSaASaSbASaabASaabbaSaabbaaSaASaSbASaSbAaaabAaaabbaa兩種方法反映了語(yǔ)法樹(shù)的兩種構(gòu)造過(guò)程。自上而下方法是從文法符號(hào)開(kāi)始,將它做為語(yǔ)法樹(shù)的根,向下逐步建立語(yǔ)法樹(shù),使語(yǔ)法樹(shù)的結(jié)果正好是輸入符號(hào)串自下而上方法則是從輸入符號(hào)串開(kāi)始,以它做為語(yǔ)法樹(shù)的結(jié)果,自底向上的構(gòu)造語(yǔ)法樹(shù)自上而下的語(yǔ)法分析的一般過(guò)程例:文法G:S→cAd
A→ab
A→a
識(shí)別輸入串w=cabd是否為該文法的句子 S S S
c A d
c A d
a
b推導(dǎo)過(guò)程:S
cAd
cAd
cabd
程序分程序.constidentnumber=,;varident,;;procedureident;分程序語(yǔ)句分程序identreadend;語(yǔ)句表達(dá)式:=begin語(yǔ)句語(yǔ)句)(ident,
自頂向下的語(yǔ)法分析
VARA;BEGINREAD(A)END.
<程序><分程序>.<變量說(shuō)明部分><語(yǔ)句>VAR<標(biāo)識(shí)符>;<復(fù)合語(yǔ)句>
A
BEGIN<語(yǔ)句>END<讀語(yǔ)句>
READ
(<標(biāo)識(shí)符>)
A<程序>為文法的開(kāi)始符號(hào),以開(kāi)始符號(hào)作為根結(jié)點(diǎn)構(gòu)造一棵倒掛著的語(yǔ)法樹(shù)。遞歸子程序法-語(yǔ)法分析程序由一組遞歸過(guò)程組成對(duì)應(yīng)每個(gè)非終結(jié)符(語(yǔ)法單元),編一個(gè)獨(dú)立的處理過(guò)程(或函數(shù),子程序)。由<程序>(即開(kāi)始符)開(kāi)始,沿語(yǔ)法描述圖箭頭所指出的方向進(jìn)行分析(規(guī)則右部)遇到非終結(jié)符(進(jìn)入了又一個(gè)語(yǔ)法單元),則調(diào)用相應(yīng)的處理過(guò)程遇到終結(jié)符,則判斷當(dāng)前讀入的單詞是否與該終結(jié)符相匹配,若匹配,再讀取下一個(gè)單詞繼續(xù)分析。--也稱(chēng)為遞歸下降分析器(recursive-descentparser)
例:表達(dá)式的語(yǔ)法分析程序(遞歸子程序)項(xiàng)表達(dá)式+-項(xiàng)+-項(xiàng)
因子
因子
*/語(yǔ)法圖因子的語(yǔ)法圖因子identnumber(表達(dá)式)表達(dá)式的EBNF
〈表達(dá)式〉∷=[+|-]〈項(xiàng)〉{(+|-)〈項(xiàng)〉}
〈項(xiàng)〉∷=〈因子〉{(*|/)〈因子〉}
〈因子〉∷=〈標(biāo)識(shí)符〉|〈無(wú)符號(hào)整數(shù)〉|‘(’〈表達(dá)式〉‘)’〈表達(dá)式〉∷=[+|-]〈項(xiàng)〉{(+|-)〈項(xiàng)〉}
pascal〈表達(dá)式〉的分析程序(遞歸子程序)
procedureexpr;
begin
ifsymin[plus,minus]then
begin
getsym;term;
end
elseterm;
whilesymin[plus,
minus]do
begin
getsym;term;
end
end;
〈項(xiàng)〉∷=〈因子〉{(*|/)〈因子〉}pascal〈項(xiàng)〉的分析程序(遞歸子程序)
procedureterm;
begin
factor;
whilesymin[times,
slash]do
begin
getsym;factor;
end
end;〈因子〉∷=〈標(biāo)識(shí)符〉|〈無(wú)符號(hào)整數(shù)〉|‘(’〈表達(dá)式〉‘)’〈因子〉的分析程序(遞歸子程序)
procedurefactor;
begin
ifsym<>identthen
begin
ifsym<>numberthen
beginifsym=‘(‘then
begin
getsym;
expr;
ifsym=‘)’thengetsym
elseerror
end
elseerrorendelsegetsymendelsegetsymend;〈表達(dá)式〉∷=[+|-]〈項(xiàng)〉{(+|-)〈項(xiàng)〉}inCintexpression(bool*fsys,int*ptx,intlev){ if(sym==plus||sym==minus) /*開(kāi)頭的正負(fù)號(hào),當(dāng)前表達(dá)式被看作一個(gè)正的或負(fù)的項(xiàng)*/ { getsymdo; termdo(nxtlev,ptx,lev); /*處理項(xiàng)*/ } else /*此時(shí)表達(dá)式被看作項(xiàng)的加減*/ { termdo(nxtlev,ptx,lev); /*處理項(xiàng)*/ } while(sym==plus||sym==minus) { getsymdo; termdo(nxtlev,ptx,lev); /*處理項(xiàng)*/ } return0;}〈項(xiàng)〉∷=〈因子〉{(*|/)〈因子〉}intterm(bool*fsys,int*ptx,intlev){ factordo(nxtlev,ptx,lev); /*處理因子*/ while(sym==times||sym==slash) { getsymdo; factordo(nxtlev,ptx,lev); } return0;}〈因子〉∷=〈標(biāo)識(shí)符〉|〈無(wú)符號(hào)整數(shù)〉|‘(’〈表達(dá)式〉‘)’intfactor(bool*fsys,int*ptx,intlev){ if(sym==ident) /*因子為常量或變量*/ getsymdo; else{if(sym==number) /*因子為*/ getsymdo; elseif(sym==lparen) /*因子為表達(dá)式*/ {expressiondo(nxtlev,ptx,lev); if(sym==rparen) getsymdo; elseerror(22); /*缺少右括號(hào)*/ }} return0;}
<程序>∷=<分程序>
begin(*main*)
…(*initialize*)…(*r/wfileset*)
getsym;
block();…ifsym<>periodthenerror...
end.。程序pl0分程序block語(yǔ)句statement條件condition表達(dá)式expression項(xiàng)term因子factor語(yǔ)法調(diào)用關(guān)系圖編譯系統(tǒng)總體流程圖2.3PL/0編譯程序語(yǔ)義分析的設(shè)計(jì)與實(shí)現(xiàn)
PL/0編譯程序語(yǔ)法、語(yǔ)義分析的的核心程序是BLOCK過(guò)程哪些語(yǔ)義分析工作?如何實(shí)現(xiàn)?--語(yǔ)義分析環(huán)境(符號(hào)表)
說(shuō)明部分的分析與處理表格管理過(guò)程體(語(yǔ)句)的分析與處理〈因子〉∷=〈標(biāo)識(shí)符〉|〈無(wú)符號(hào)整數(shù)〉|‘(’〈表達(dá)式〉‘)’語(yǔ)義分析intfactor(bool*fsys,int*ptx,intlev){ if(sym==ident) /*因子為常量或變量*/ { i=position(id,*ptx); /*查找名字*/ if(i==0) {error(11); /*標(biāo)識(shí)符未聲明*/ } else {switch(table[i].kind) {caseconstant: /*名字為常量*/ break; casevariable: /*名字為變量*/ break; caseprocedur: /*名字為過(guò)程*/ error(21);/*不能為過(guò)程名*/ …… 登錄符號(hào)表
說(shuō)明部分的分析與處理對(duì)每個(gè)過(guò)程(含主程序)說(shuō)明的對(duì)象(變量,常量和過(guò)程)造符號(hào)表
登錄標(biāo)識(shí)符的屬性。標(biāo)識(shí)符的屬性:種類(lèi),所在層次,值和分配的相對(duì)位置。登錄信息由ENTER過(guò)程完成。符號(hào)表結(jié)構(gòu)Enumobject{constant,variable,procedur};Structtablestruct{charname[al];enumobjectkind;intval;intlevel;intadr;intsize;};Structtablestructtable[txmax];
符號(hào)表結(jié)構(gòu)說(shuō)明種類(lèi)的定義:object=(constant,variable,procedur)(定義純量/枚舉類(lèi)型)符號(hào)表的定義table:array[0..txmax]ofrecordname:alfa;casekind:objectof
constant:(val:integer);
variable:procedur:(level,adr,size:integer);
例程序說(shuō)明部分為:CONSTA=35,B=49;
VARC,D,E;
PROCEDUREP;
VARG;…
符號(hào)表名字種類(lèi)層次/值地址存儲(chǔ)空間對(duì)應(yīng)名字表tx:table表的下標(biāo)指針,是以值參數(shù)形式使用的。dx:計(jì)算每個(gè)變量在運(yùn)行棧中相對(duì)本過(guò)程基地址的偏移量,放在table表中的adr域,生成目標(biāo)代碼時(shí)再放在code中的a域變量定義語(yǔ)句的處理(C)語(yǔ)法:<變量說(shuō)明部分>::=var
<標(biāo)識(shí)符>{,<標(biāo)識(shí)符>};程序:if(sym==varsym){ /*收到變量聲明符號(hào),開(kāi)始處理變量聲明*/getsymdo;do{vardeclarationdo(&tx,lev,&dx);while(sym==comma){getsymdo;vardeclarationdo(&tx,lev,&dx);}if(sym==semicolon){getsymdo;}elseerror(5);}while(sym==ident);}注意:&tx變量說(shuō)明處理(C)intvardeclaration(int*ptx,intlev,int*pdx){if(sym==ident){enter(variable,ptx,lev,pdx);//填寫(xiě)名字表getsymdo;}else{error(4); /*var后應(yīng)是標(biāo)識(shí)符*/}return0;}變量定義語(yǔ)句的處理語(yǔ)法:<變量說(shuō)明部分>::=var
<標(biāo)識(shí)符>{,<標(biāo)識(shí)符>};程序:ifsym=varsymthen
begin
getsym;
repeat
vardeclaration;(*變量說(shuō)明處理*)
whilesym=commado
begin
getsym;
vardeclaration
end;
ifsym=semicolonthengetsym
elseerror(5)
untilsym<>ident;
end;變量說(shuō)明處理procedurevardeclaration;
begin
ifsym=identthen
begin
enter(variable);
getsym
end
else error(4)
end(*vardeclaration*);過(guò)程ENTER的實(shí)現(xiàn)(C)/**在名字表中加入一項(xiàng)**k:名字種類(lèi)const,varorprocedure*ptx:名字表尾指針的指針*lev:名字所在的層次,以后所有的lev都是這樣*pdx:當(dāng)前應(yīng)分配變量的相對(duì)地址,分配后增加1*/voidenter(enumobjectk,int*ptx, intlev,int*pdx)過(guò)程ENTER的實(shí)現(xiàn)(C){(*ptx)++;strcpy(table[(*ptx)].name,id);/*全局變量id中已存有當(dāng)前名字的名字*/table[(*ptx)].kind=k; switch(k){caseconstant: /*常量名字*/if(num>amax){error(31); /*數(shù)越界*/num=0;}table[(*ptx)].val=num;break;過(guò)程ENTER的實(shí)現(xiàn)(C)casevariable: /*變量名字*/table[(*ptx)].level=lev;table[(*ptx)].adr=(*pdx);(*pdx)++;break;caseprocedur: /*過(guò)程名字*/table[(*ptx)].level=lev;break;}}過(guò)程ENTER的實(shí)現(xiàn)tx:table表的指針procedureenter(k:object);
begin(*enterobjectintotable*)
tx:=tx+1;
withtable[tx]do(*
開(kāi)域語(yǔ)句*)
begin
name:=id;(*表示table[tx].name:=id;*)
kind:=k;(*表示table[tx].kind:=k;*)
過(guò)程ENTER的實(shí)現(xiàn)
case
kof
constant:begin
ifnum>amaxthenbegin
error(31);
num:=0;
end;
val:=num;(*table[tx].val:=num;*)
end;
過(guò)程ENTER的實(shí)現(xiàn)
variable:begin
level:=lev;(*表示table[tx].level:=lev*)
adr:=dx;(*表示table[tx].adr:=dx*) dx:=dx+1;
end;
procedur:level:=lev(*表示table[tx].level:=lev;*) end(*case*);
end
end(*enter*);過(guò)程體的處理/**編譯程序主體**lev:當(dāng)前分程序所在層*tx:名字表當(dāng)前尾指針*fsys:當(dāng)前模塊后跟符號(hào)集合*/intblock(intlev,inttx,bool*fsys)過(guò)程體的處理......//main()函數(shù)if(-1==block(0,0,nxtlev)){......}......if(sym!=period)error(9);......interpret();/*調(diào)用解釋執(zhí)行程序*/......過(guò)程體的處理while(sym==procsym)//block()函數(shù){getsymdo;if(sym==ident){enter(procedur,&tx,lev,&dx);.....}......if(-1==block(lev+1,tx,nxtlev))} 過(guò)程體的處理-變量引用的處理對(duì)語(yǔ)句進(jìn)行語(yǔ)法分析語(yǔ)義分析當(dāng)遇到標(biāo)識(shí)符的引用時(shí)就調(diào)用POSITION函數(shù)查T(mén)ABLE表,看是否有過(guò)正確定義,若已有,則從表中取相應(yīng)的有關(guān)信息,供代碼的生成使用。若無(wú)定義則錯(cuò)。語(yǔ)義分析TABLE表若已有過(guò)正確定義,檢查引用與說(shuō)明的屬性是否一致,若不一致則錯(cuò)。當(dāng)語(yǔ)法語(yǔ)義正確時(shí),就生成相應(yīng)語(yǔ)句功能的目標(biāo)代碼賦值語(yǔ)句的處理(C)if(sym==ident){ /*準(zhǔn)備按照賦值語(yǔ)句處理*/i=position(id,*ptx);if(i==0){error(11); /*變量未找到*/}else{if(table[i].kind!=variable){error(12); /*賦值語(yǔ)句格式錯(cuò)誤*/i=0;}else{......gendo(sto,lev-table[i].level,table[i].adr);......}}}賦值語(yǔ)句的處理
ifsym=identthenbegini:=position(id);ifi=0thenerror(11)elseiftable[i].kind<>variablethenbeginerror(12);i:=0end;
getsym;ifsym=becomesthengetsymelseerror(13);expression(fsys);ifi<>0thenwithtable[i]dogen(sto,lev-level,adr)end
第2章PL/0編譯程序本章目的:以PL/0編譯程序?yàn)閷?shí)例,學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技術(shù)1PL/0編譯程序的結(jié)構(gòu)2PL/0編譯程序的分析工作(詞法,語(yǔ)法和語(yǔ)義)實(shí)現(xiàn)3PL/0編譯程序的錯(cuò)誤處理方法4目標(biāo)代碼生成和類(lèi)pcode代碼解釋器編譯程序的錯(cuò)誤處理錯(cuò)誤處理的原則:盡可能準(zhǔn)確指出出錯(cuò)位置,錯(cuò)誤性質(zhì),盡可能進(jìn)行校正。PL/0編譯程序?qū)φZ(yǔ)法錯(cuò)誤的處理:
(1)對(duì)于易于校正的錯(cuò)誤,如丟了逗號(hào),分號(hào)等,指出出錯(cuò)位置,加以校正,繼續(xù)進(jìn)行分析。
(2)對(duì)于難于校正的錯(cuò)誤,給出錯(cuò)誤的位置與性質(zhì),跳過(guò)后面的一些單詞,直到下一個(gè)可以進(jìn)行正常語(yǔ)法分析的語(yǔ)法單位。
在進(jìn)入某個(gè)語(yǔ)法單位時(shí),調(diào)用TEST,檢查當(dāng)前符號(hào)是否屬于該語(yǔ)法單位的開(kāi)始符號(hào)集合。若不屬于,則濾去開(kāi)始符號(hào)和后跟符號(hào)集合外的所有符號(hào)。在語(yǔ)法單位分析結(jié)束時(shí),調(diào)用TEST,檢查當(dāng)前符號(hào)是否屬于調(diào)用該語(yǔ)法單位時(shí)應(yīng)有的后跟符號(hào)集合。若不屬于,則濾去后跟符號(hào)和開(kāi)始符號(hào)集合外的所有符號(hào)。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST開(kāi)始符號(hào)集合與后跟符號(hào)集合開(kāi)始符號(hào)集合
symset=setof
symbol;declbegsys,statbegsys,facbegsys:symset;開(kāi)始符號(hào)集合(*主程序*)declbegsys:=[constsym,varsym,procsym];
statbegsys:=[beginsym,callsym,ifsym,
whilesym,readsym,writesym];
facbegsys:=[ident,number,lparen];
后跟符號(hào)集合fsys作為參數(shù):procedure
test(s1,s2:symset;n:integer);procedureblock(lev,tx:integer;fsys:symset);procedurestatement(fsys:symset);procedureexpression(fsys:symset);procedureterm(fsys:symset);procedurefactor(fsys:symset);READ語(yǔ)句的分析處理(C)if(sym==readsym){//處理read語(yǔ)句getsymdo;if(sym!=lparen){error(34); //格式錯(cuò)誤,應(yīng)是左括號(hào)}else{do{getsymdo;
READ語(yǔ)句的語(yǔ)法語(yǔ)義分析處理
ifsym=readsymthenbegingetsym;ifsym<>lparenthenerror(34)else
repeatgetsym;
READ語(yǔ)句的語(yǔ)法語(yǔ)義分析處理ifsym=identtheni:=position(id)elsei:=0;ifi=0thenerror(35)else
withtable[i]do
begingen(opr,0,16);gen(sto,lev-level,adr)
end;READ語(yǔ)句的語(yǔ)法語(yǔ)義分析處理getsym
untilsym<>comma;ifsym<>rparenthenbeginerror(33);whilenot(syminfsys)dogetsymendelsegetsymend出錯(cuò)處理跳過(guò)不應(yīng)出現(xiàn)的符號(hào)正確出口TESTSYM在S1中?打印出錯(cuò)編號(hào)nS1:=S1+S2SYM在S1中?GETSYM返回YYNNTEST測(cè)試過(guò)程流程圖因子的處理過(guò)程例:因子的處理過(guò)程
procedurefactor(fsys:symset);vari:integer;begin入口:test(facbegsys,fsys,24);whilesyminfacbegsysdo
beginif...出口:test(fsys,facbegsys,23);endend;因子的處理過(guò)程Facbegsysy處理identnumber,lparentestntest增加后跟符與調(diào)用位置有關(guān)
例:調(diào)用expression(fsys);write語(yǔ)句的語(yǔ)法write(<exp>{,<exp>});write語(yǔ)句(后調(diào)用expression時(shí)后跟符expression([rparen,comma]+fsys);factor的語(yǔ)法:factor∷=...|‘(’exp’)在factor(后調(diào)用expression時(shí)后跟符expression([rparen]+fsys);第2章PL/0編譯程序本章目的:以PL/0編譯程序?yàn)閷?shí)例,學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技術(shù)1PL/0編譯程序的結(jié)構(gòu)2PL/0編譯程序的分析工作(詞法,語(yǔ)法和語(yǔ)義)實(shí)現(xiàn)3PL/0編譯程序的錯(cuò)誤處理方法4目標(biāo)代碼生成和類(lèi)pcode代碼解釋器代碼生成代碼生成是由過(guò)程GEN完成。GEN有3個(gè)參數(shù),分別代表目標(biāo)代碼的功能碼,層差和位移量。例如gen(opr,0,16);gen(sto,lev-level,adr)
lev:當(dāng)前處理的過(guò)程層次
level:被引用變量或過(guò)程所在層次CX:為目標(biāo)代碼code數(shù)組的下標(biāo)指針代碼結(jié)構(gòu)變換,地址返填I(lǐng)fcthensgetsym;condition;ifsym=thensymthengetsymelseerror(16);cx1:=cx;gen(jpc,0,0)statement();code[cx1].a:=cx類(lèi)p-code代碼解釋器的實(shí)現(xiàn)類(lèi)p-code目標(biāo)機(jī)結(jié)構(gòu)目標(biāo)代碼解釋執(zhí)行時(shí)數(shù)據(jù)棧的布局(運(yùn)行棧的存儲(chǔ)分配)
目標(biāo)代碼類(lèi)p-code目標(biāo)代碼類(lèi)p-code是一種棧式機(jī)的匯編語(yǔ)言。棧式機(jī)系統(tǒng)結(jié)構(gòu):沒(méi)有累加器和寄存器,只有存儲(chǔ)棧指針?biāo)羞\(yùn)算都在棧頂(零地址機(jī))指令格式:flaf 功能碼l 層次差(標(biāo)識(shí)符引用層減去定義層)a 根據(jù)不同的指令有所區(qū)別類(lèi)p-code解釋器的結(jié)構(gòu)目標(biāo)代碼(指令)存放在數(shù)組CODE中(程序地址寄存器p)。解釋程序定義一個(gè)一維整型數(shù)組S作為運(yùn)行棧棧頂寄存器(指針)t,基址寄存器(指針)b,指令寄存器i(當(dāng)前正在解釋的目標(biāo)指令)
consta=10;
varb,c;
procedurep;
begin
c:=b+a;
end;
begin
read(b);
whileb#0do
begin
callp;
write(2*c);
read(b);
end
end.
(0)jmp08轉(zhuǎn)向主程序入口(1)jmp02轉(zhuǎn)向過(guò)程p入口(2)
int03過(guò)程p入口,為過(guò)程p開(kāi)辟空間(3)lod13取變量b的值到棧頂(4)lit010取常數(shù)10到棧頂(5)opr02次棧頂與棧頂相加(6)sto14棧頂值送變量c中(7)opr00退棧并返回調(diào)用點(diǎn)(16)(8)
int05主程序入口開(kāi)辟5個(gè)棧空間(9)opr016從命令行讀入值置于棧頂(10)sto03將棧頂值存入變量b中(11)lod03將變量b的值取至棧頂(12)lit00將常數(shù)值0進(jìn)棧(13)opr09次棧頂與棧頂是否不等(14)jpc024等時(shí)轉(zhuǎn)(24)(條件不滿(mǎn)足轉(zhuǎn))(15)cal02
調(diào)用過(guò)程p(16)lit02常數(shù)值2進(jìn)棧(17)lod04將變量c的值取至棧頂(18)opr04次棧頂與棧頂相乘(2*c)(19)opr014棧頂值輸出至屏幕(20)opr015換行(21)opr016從命令行讀取值到棧頂(22)sto03棧頂值送變量b中(23)jmp011無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24)opr00結(jié)束退棧目標(biāo)代碼解釋執(zhí)行時(shí)數(shù)據(jù)棧的布局(運(yùn)行棧的存儲(chǔ)分配)在每個(gè)過(guò)程調(diào)用時(shí)在棧頂分配3個(gè)聯(lián)系單元:SL:靜態(tài)鏈,指向定義該過(guò)程的直接外過(guò)程
(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址。DL:動(dòng)態(tài)鏈,指向調(diào)用該過(guò)程前正在運(yùn)行過(guò) 程的數(shù)據(jù)段基地址。RA:返回地址,記錄調(diào)用該過(guò)程時(shí)目標(biāo)程序的斷點(diǎn),即調(diào)用過(guò)程指令的下一條指令的地址。Varx,y;ProcedureP;vara;procedureQ;varb;begin(*Q*)b:=10;end(*Q*);procedureS;varc,d;procedureR;
vare,f;begin(*R*)callQ;end(*R*);
begin(*S*)callR;end(*S*);begin(*P*)callS;end;(*P*)begin(*MAIN*)callP;end(*MAIN*).
目標(biāo)代碼的解釋執(zhí)行運(yùn)行棧SM調(diào)用過(guò)程PM調(diào)用過(guò)程PP調(diào)用過(guò)程SRADLSLbttbPMPMS目標(biāo)代碼的解釋執(zhí)行幾條特殊指令在code中的位置和功能INT0A
在過(guò)程目標(biāo)程序的入口處,開(kāi)辟A個(gè)單元的數(shù)據(jù)段。A為局部變量的個(gè)數(shù)+3。OPR00
在過(guò)程目標(biāo)程序的出口處,釋放數(shù)據(jù)段(退棧),恢復(fù)調(diào)用該過(guò)程前正在運(yùn)行的過(guò)程的數(shù)據(jù)段基址寄存器B和棧頂寄存器T的值,并將返回地址送到指令地址寄存器P中,以使調(diào)用前的程序從斷點(diǎn)開(kāi)始繼續(xù)執(zhí)行。目標(biāo)代碼的解釋執(zhí)行幾條特殊指令在code中的位置和功能CALLA
調(diào)用過(guò)程,還完成填寫(xiě)靜態(tài)鏈、動(dòng)態(tài)鏈、返回地址,給出被調(diào)用過(guò)程的基地址值,送入基址寄存器B中,目標(biāo)程序的入口地址A的值送指令地址寄存器P中,使指令從A開(kāi)始執(zhí)行。
CX:為目標(biāo)代碼code數(shù)組的下標(biāo)指針。code為一維數(shù)組,數(shù)組元素為記錄型數(shù)據(jù)。每一個(gè)記錄就是一條目標(biāo)指令。CX為整數(shù)變量,由0開(kāi)始順序增加。實(shí)際上目標(biāo)代碼的順序是內(nèi)層過(guò)程的在前邊,主程序的目標(biāo)代碼在最后。tx:table表的下標(biāo)指針,是以值參數(shù)形式使用的。dx:計(jì)算每個(gè)變量在運(yùn)行棧中相對(duì)本過(guò)程基地址的偏移量,放在table表中的adr域,生成目標(biāo)代碼時(shí)再放在code中的a域。下標(biāo)指針cx,tx和變量dx的作用code[cx]table[tx]s[t](運(yùn)行棧)cxtxt(運(yùn)行時(shí)棧指針)(0)jmp00(1)int07..(cx).(0)name…adr...(1)b(dx)...(tx)qpmbTable表的下標(biāo)指針tx補(bǔ)充說(shuō)明:主程序BLOCK第1次調(diào)用blockBLOCK(0,0,…)
0
0
...BLOCK
BLOCK(LEV+1,TX,…)(遞歸進(jìn)入分程序)LEVtxLEVtx(6)6(9)1tx是BLOCK的實(shí)際值參PL/0編譯程序的實(shí)現(xiàn)
proceduregen(x:fct;y,z:integer); begin
ifcx>cxmaxthen(*指針越界*)begin
write(‘programtoolong’);
close(fin);(*關(guān)閉文件*)
writeln;
exitend;PL/0編譯程序的實(shí)現(xiàn)
withcode[cx]do
begin
f:=x;(*表示code[cx].f:=x;*)
l:=y;(*表示code[cx].l:=y;*)
a:=z;(*表示code[cx].a:=z;*)
end;
cx:=cx+1
end(*gen*);PL/0編譯程序的實(shí)現(xiàn)對(duì)分程序的定義(見(jiàn)教材417,437頁(yè))
procedure block(lev,tx:integer;fsys:symset);vardx:integer;(*dataallocationindex*)
tx0:integer;(*initialtableindex*)
cx0:integer;(*initialcodeindex*)(tx0,cx0是tx,cx的初值)PL/0編譯程序的實(shí)現(xiàn)對(duì)分程序體人口的處理(見(jiàn)程序文本block的過(guò)程體)begin(*block*)
dx:=3;tx0:=tx;(保留當(dāng)前table表指針值)table[tx].adr:=cx;(保留當(dāng)前code指針值到過(guò)程名 的adr域
)gen(jmp,0,0);(生成轉(zhuǎn)向過(guò)程體入口的指令,該指令的地址 為cx已保留在過(guò)程名的adr域,等生成過(guò)程 體入口的指令時(shí),再由table[tx].adr中取出 cx將過(guò)程體入口返填到cx中,即 (jmp,0,0)的第3區(qū)域?!ㄗ⒁鈊x,tx,cx的作用)
CONSTA=35,B=49;
VARC,D,E;
PROCEDUREP;
VARG
table表格管理名字類(lèi)型層次/值地址存儲(chǔ)空間(0)jmp00
CX(1)jmp00..記錄過(guò)程在code的入口到table中的adr域PL/0編譯程序的實(shí)現(xiàn)過(guò)程體入口時(shí)的處理code[table[tx0].adr].a:=cx;(過(guò)程入口地址填寫(xiě)在code中)withtable[tx0]dobegin
adr:=cx;(過(guò)程的入口填寫(xiě)在table中)
size:=dx;(過(guò)程占的空間填寫(xiě)在table中)
end;
cxo:=cx;(保留過(guò)程在code中的入口地址)gen(int,0,dx);(生成過(guò)程入口指令)PL/0編譯程序的實(shí)現(xiàn)第1次調(diào)用block(見(jiàn)教材428,430頁(yè))block(0,0,[period]+declbegsys+statbegsys);(0,0是tx,lev的實(shí)際值參,第1次調(diào)用時(shí)為0以后調(diào)用時(shí)的參數(shù)為lev+1,tx)interpret三個(gè)寄存器賦初值t:=0;b:=1;p:=0;主程序的SL,DL,RA賦初值s[1]:=0;s[2]=0;s[3]=0;i:=code[p];p:=p+1;P=0?返回解釋執(zhí)行的流程圖執(zhí)行指令iNY主程序的RAs[3]=0
目標(biāo)代碼的解釋執(zhí)行幾條特殊指令的解釋執(zhí)行:過(guò)程入口:開(kāi)辟a個(gè)單元(見(jiàn)教材425頁(yè))int:t:=t+a;(t是當(dāng)前棧頂值)過(guò)程出口:釋放數(shù)據(jù)段(退棧)(見(jiàn)教材425頁(yè))opr:caseaof(*operator*)
0:begin(*return*)
t:=b-1;恢復(fù)調(diào)用前棧頂
p:=s[t+3];送返回地址到p
b:=s[t+2]恢復(fù)調(diào)用前基地址
end;
目標(biāo)代碼的解釋執(zhí)行過(guò)程出口RADLSLb..tMtbt:=b-1;p:=s[t+3];b:=s[t+2]Q
目標(biāo)代碼的解釋執(zhí)行調(diào)用過(guò)程:cal:begin(*generatnewblockmark*)s[t+1]:=base(l);
填寫(xiě)靜態(tài)鏈s[t+2]:=b;填寫(xiě)動(dòng)態(tài)鏈s[t+3]:=p;填寫(xiě)返回地址
b:=t+1;被調(diào)用過(guò)程的基地址
p:=a
過(guò)程入口地址a送p
end;
目標(biāo)代碼的解釋執(zhí)行functionbase(l:integer):integer;varb1:integer;beginb1:=b;(*findbaselleveldown*)whilel>0dobegin
b1:=s[b1];l:=l-1;end;
base:=b1end(*base*);
目標(biāo)代碼的解釋執(zhí)行base(l:integer):integer;bbbmp0bbq
運(yùn)行時(shí)數(shù)據(jù)棧S的變化狀態(tài)
…ProcedureA;…procedureB;…procedureC;…callB;……callC;……callB;……CallA;…
MagneticResonanceImaging磁共振成像發(fā)生事件作者或公司磁共振發(fā)展史1946發(fā)現(xiàn)磁共振現(xiàn)象BlochPurcell1971發(fā)現(xiàn)腫瘤的T1、T2時(shí)間長(zhǎng)Damadian1973做出兩個(gè)充水試管MR圖像Lauterbur1974活鼠的MR圖像Lauterbur等1976人體胸部的MR圖像Damadian1977初期的全身MR圖像
Mallard1980磁共振裝置商品化1989
0.15T永磁商用磁共振設(shè)備中國(guó)安科
2003諾貝爾獎(jiǎng)金LauterburMansfierd時(shí)間MR成像基本原理實(shí)現(xiàn)人體磁共振成像的條件:人體內(nèi)氫原子核是人體內(nèi)最多的物質(zhì)。最易受外加磁場(chǎng)的影響而發(fā)生磁共振現(xiàn)象(沒(méi)有核輻射)有一個(gè)穩(wěn)定的靜磁場(chǎng)(磁體)梯度場(chǎng)和射頻場(chǎng):前者用于空間編碼和選層,后者施加特定頻率的射頻脈沖,使之形成磁共振現(xiàn)象信號(hào)接收裝置:各種線(xiàn)圈計(jì)算機(jī)系統(tǒng):完成信號(hào)采集、傳輸、圖像重建、后處理等
人體內(nèi)的H核子可看作是自旋狀態(tài)下的小星球。自然狀態(tài)下,H核進(jìn)動(dòng)雜亂無(wú)章,磁性相互抵消zMyx進(jìn)入靜磁場(chǎng)后,H核磁矩發(fā)生規(guī)律性排列(正負(fù)方向),正負(fù)方向的磁矢量相互抵消后,少數(shù)正向排列(低能態(tài))的H核合成總磁化矢量M,即為MR信號(hào)基礎(chǔ)ZZYYXB0XMZMXYA:施加90度RF脈沖前的磁化矢量MzB:施加90度RF脈沖后的磁化矢量Mxy.并以L(fǎng)armor頻率橫向施進(jìn)C:90度脈沖對(duì)磁化矢量的作用。即M以螺旋運(yùn)動(dòng)的形式傾倒到橫向平面ABC在這一過(guò)程中,產(chǎn)生能量
三、弛豫(Relaxation)回復(fù)“自由”的過(guò)程
1.
縱向弛豫(T1弛豫):
M0(MZ)的恢復(fù),“量變”高能態(tài)1H→低能態(tài)1H自旋—晶格弛豫、熱弛豫
吸收RF光子能量(共振)低能態(tài)1H高能態(tài)1H
放出能量(光子,MRS)T1弛豫時(shí)間:
MZ恢復(fù)到M0的2/3所需的時(shí)間
T1愈小、M0恢復(fù)愈快T2弛豫時(shí)間:MXY喪失2/3所需的時(shí)間;T2愈大、同相位時(shí)間長(zhǎng)MXY持續(xù)時(shí)間愈長(zhǎng)MXY與ST1加權(quán)成像、T2加權(quán)成像
所謂的加權(quán)就是“突出”的意思
T1加權(quán)成像(T1WI)----突出組織T1弛豫(縱向弛豫)差別
T2加權(quán)成像(T2WI)----突出組織T2弛豫(橫向弛豫)差別。
磁共振診斷基于此兩種標(biāo)準(zhǔn)圖像磁共振常規(guī)h檢查必掃這兩種標(biāo)準(zhǔn)圖像.T1的長(zhǎng)度在數(shù)百至數(shù)千毫秒(ms)范圍T2值的長(zhǎng)度在數(shù)十至數(shù)千毫秒(ms)范圍
在同一個(gè)馳豫過(guò)程中,T2比T1短得多
如何觀看MR圖像:首先我們要分清圖像上的各種標(biāo)示。分清掃描序列、掃描部位、掃描層面。正常或異常的所在部位---即在同一層面觀察、分析T1、T2加權(quán)像上信號(hào)改變。絕大部分病變T1WI是低信號(hào)、T2WI是高信號(hào)改變。只要熟悉掃描部位正常組織結(jié)構(gòu)的信號(hào)表現(xiàn),通常病變與正常
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年柔印直接制版機(jī)項(xiàng)目建議書(shū)
- 2025年血液灌流器項(xiàng)目建議書(shū)
- 2025年專(zhuān)用X射線(xiàn)機(jī)項(xiàng)目合作計(jì)劃書(shū)
- 2025年高溫高壓機(jī)械密封項(xiàng)目建議書(shū)
- 幼兒園教師個(gè)人學(xué)期工作發(fā)展計(jì)劃(大班)
- 2025年高溫高壓機(jī)械密封項(xiàng)目合作計(jì)劃書(shū)
- 2025年航空制造和材料專(zhuān)用設(shè)備項(xiàng)目建議書(shū)
- 2025年節(jié)溫器項(xiàng)目建議書(shū)
- 學(xué)生公寓租客安全責(zé)任協(xié)議范文
- 2025天津市建筑安全員-A證考試題庫(kù)及答案
- 初中生心理健康教育講座課件
- 2024年司法考試完整真題及答案
- 部編高教版2023·職業(yè)模塊 中職語(yǔ)文 《寧夏閩寧鎮(zhèn):昔日干沙灘今日金沙灘》課件
- 企業(yè)對(duì)外溝通與形象塑造制度
- 《前列腺增生》課件
- 整體法蘭強(qiáng)度校核計(jì)算表(設(shè)計(jì):zxg)
- 供應(yīng)鏈經(jīng)理年度工作計(jì)劃
- 2024年甘肅省公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專(zhuān)業(yè)答案
- 中國(guó)高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 非ST段抬高型急性冠脈綜合征診斷和治療指南(2024)解讀
評(píng)論
0/150
提交評(píng)論