第五章語法制導(dǎo)的翻譯_第1頁
第五章語法制導(dǎo)的翻譯_第2頁
第五章語法制導(dǎo)的翻譯_第3頁
第五章語法制導(dǎo)的翻譯_第4頁
免費預(yù)覽已結(jié)束,剩余60頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第五章 語法制導(dǎo)的翻譯趙建華南京大學(xué)計算機系2010年3月介紹 使用上下文無關(guān)文法引導(dǎo)語言的翻譯 CFG的非終結(jié)符號代表了語言的某個構(gòu)造 程序設(shè)計語言的構(gòu)造由更小的構(gòu)造組合而成 一個構(gòu)造的語義可以由小構(gòu)造的含義綜合而來 比如:表達(dá)式x+y的類型由x、y的類型和運算符+決定。 也可以從附近的構(gòu)造繼承而來 比如:聲明int x;中x的類型由它左邊的類型表達(dá)式?jīng)Q定。語法制導(dǎo)定義和語法制導(dǎo)翻譯 語法制導(dǎo)定義: 將文法符號和某些屬性相關(guān)聯(lián), 并通過語義規(guī)則來描述如何計算屬性的值 EE1+TE.code=E1.code|T.code | + 屬性code代表中綴表達(dá)式的逆波蘭表示,規(guī)則說明加法表達(dá)式的逆波

2、蘭表示由兩個分量的逆波蘭表示并置,然后加上+得到。 語法制導(dǎo)翻譯: 在產(chǎn)生式體中加入語義動作,并在適當(dāng)?shù)臅r候執(zhí)行這些語義動作 EE1+Tprint +;語法制導(dǎo)的定義(SDD) SDD是上下文無關(guān)文法和屬性/規(guī)則的結(jié)合; 屬性和文法符號相關(guān)聯(lián),按照需要來確定各個文法符號需要哪些屬性 規(guī)則和產(chǎn)生式相關(guān)聯(lián) 對于文法符號X和屬性a,我們用X.a表示分析樹中的某個標(biāo)號為X的結(jié)點的值。 一個分析樹結(jié)點和它的分支對應(yīng)于一個產(chǎn)生式規(guī)則,而對應(yīng)的語義規(guī)則確定了這些結(jié)點上的屬性的取值。分析樹和屬性值(1) 假設(shè)我們需要知道一個表達(dá)式的類型,以及對應(yīng)代碼將它的值存放在何處,我們就需要兩個屬性:type,place

3、; 產(chǎn)生式規(guī)則:EE1+T 語義規(guī)則:(假設(shè)只有int/float類型) E.type = if (E1.type=T.type) T.type else float E.place = newTempPlace(); /返回一個新的內(nèi)存位置; 產(chǎn)生式規(guī)則:Fid F.type = lookupIDTable(id.lexValue)-type; F.place = lookupIDTable(id.lexValue)-address;分析樹和屬性值(2) a+b*c的語法分析樹以及屬性值EET+TFidTF*Fididid.lexValue=aF.Type = FLOATF.Place =

4、&aT.Type = FLOATT.Place = &aE.Type = FLOATE.Place = &aT.Type = INTT.Place = &tmpF.Type = INTF.Place = &cid.lexValue=cid.lexValue=b假設(shè)a,b,c是已經(jīng)聲明的全局變量,a的類型為FLOAT,b,c的類型為INT中間未標(biāo)明的T和F的type和address都是INT和&b;E.Type = FLOATE.Place = &tmp2繼承屬性和綜合屬性 綜合屬性(synthesized attribute):在分析樹結(jié)

5、點N上的非終結(jié)符號A的屬性值由N對應(yīng)的產(chǎn)生式所關(guān)聯(lián)的語義規(guī)則來定義。 通過N的子結(jié)點或N本身的屬性值來定義 繼承屬性(inherited attribute):結(jié)點N的屬性值由N的父結(jié)點所關(guān)聯(lián)的語義規(guī)則來定義。 依賴于N的父結(jié)點、N本身和N的兄弟結(jié)點上的屬性值。 不允許N的繼承屬性通過N的子結(jié)點上的屬性來定義,但是允許N的綜合屬性依賴于N本身的繼承屬性。 終結(jié)符號有綜合屬性(由詞法分析獲得),但是沒有繼承屬性。SDD的例子 目標(biāo):計算表達(dá)式行L的值(屬性val) 計算L的val值需要E的val值 E的val值又依賴于E和T的val值 終結(jié)符號digit有綜合屬性lexval。S屬性的SDD 只

6、包含綜合屬性的SDD稱為S屬性的SDD。 每個語義規(guī)則都根據(jù)產(chǎn)生式體中的屬性值來計算頭部非終結(jié)符號的屬性值。 S屬性的SDD可以和LR語法分析器一起實現(xiàn) 棧中的狀態(tài)可以附加相應(yīng)的屬性值 在進行歸約時,按照語義規(guī)則計算歸約得到的符號的屬性值。 語義規(guī)則不應(yīng)該有復(fù)雜的副作用 要求副作用不影響其它屬性的求值 沒有副作用的SDD稱為屬性文法。語法分析樹上的SDD求值(1) 實踐中很少先構(gòu)造語法分析樹再進行SDD求值 但在分析樹上求值有助于翻譯方案的可視化,便于理解。 注釋語法分析樹 包含了各個結(jié)點的各屬性值的語法分析樹 步驟: 對于任意的輸入串,首先構(gòu)造出相應(yīng)的分析樹。 給各個結(jié)點(根據(jù)其文法符號)加

7、上相應(yīng)的屬性值 按照語義規(guī)則計算這些屬性值即可語法分析樹上的SDD求值(2) 按照分析樹中的分支對應(yīng)的文法產(chǎn)生式,應(yīng)用相應(yīng)的語義規(guī)則計算屬性值 計算順序問題: 如果某個結(jié)點N的屬性a為f(N1.b1,N2.b2,Nk.bk),那么我們需要先算出N1.b1,N2.b2,Nk.bk的值。 如果我們可以給各個屬性值排出計算順序,那么這個注釋分析樹就可以計算得到。 S屬性的SDD一定可以按照自底向上的方式求值。 下面的SDD不能計算 ABA.s=B.i;B.i=A.s+1;注釋分析樹的例子適用于自頂向下分析的SDD 前面的表達(dá)式文法存在直接左遞歸,因此無法直接用自頂向下方法處理。 消除左遞歸之后,我們

8、無法直接使用屬性val進行處理: 比如規(guī)則:TFTT*FT T對應(yīng)的項中,第一個因子對應(yīng)于F,而運算符卻在T中。 需要繼承屬性來完成這樣的計算相同表達(dá)式的不同文法的比較 輸入串:3*4*5 請觀察左邊的T對應(yīng)的部分,和右邊的T對應(yīng)部分 Ti和Ti恰好互補 計算方法:把T之外部分的值繼承給T。T3F*digit:4digit:5T2T1Fdigit:3F*TF*T3FF*digit:3digit:4T2T1digit:5適用于自頂向下分析的SDD 注意:T的屬性inh實際上繼承了相應(yīng)的*號的左運算分量。3*5的注釋分析樹 請觀察inh屬性是如何傳遞的。消直接左遞歸時語義規(guī)則的處理 假設(shè): AA1

9、YA.a = g(A1.a, Y.a) AXA.a = f(X.x) 那么 A XRR.i = f(X.x); A.a = R.s R YR1R1.i = g(R.i, Y.y); R.s=R1.s R R.s = R.i 新文法中R對應(yīng)的部分和原文法中A對應(yīng)的部分互補; 對于AXY1Y2Yn;如果R對應(yīng)于YYiYn;互補的A對應(yīng)于AY1Yi-1 R.i等于互補的A的A.sSDD的求值順序 在對SDD的求值過程中,如果結(jié)點N的屬性a依賴于結(jié)點M1的屬性a1,M2的屬性a2,。那么我們必須先計算出Mi的屬性,才能計算N的屬性a。 使用依賴圖來表示計算順序。 顯然,這些值的計算順序應(yīng)該形成一個偏序

10、關(guān)系。如果依賴圖中出現(xiàn)了環(huán),表示屬性值無法計算依賴圖 描述了某棵特定的分析樹上各個屬性實例之間的信息流(計算順序) 從實例a1到實例a2的有向邊表示計算a2時需要a1的值。(必須先計算a2,再計算a1) 對于標(biāo)號為X的分析樹結(jié)點N,和X關(guān)聯(lián)的每個屬性a都對應(yīng)依賴圖的一個結(jié)點N.a。 結(jié)點N對應(yīng)的產(chǎn)生式的語義規(guī)則通過X.c計算了A.b的值,且在分析樹中X和A分別對應(yīng)于N1和N2,那么從N1.c到N2.b有一條邊。 N1和N2可以等于/不等于N。依賴圖的例子 3*2的注釋分析樹;TFT T.val = T.syn; T.inh = F.val; 邊e1、e2。 可能的計算順序: 1,2,3,4,5

11、,6,7,8.9 1,3,5,2,4,6,7,8,9屬性值的計算順序 各個屬性的值需要按照依賴圖的拓?fù)漤樞蛴嬎恪?如果依賴圖中存在環(huán),則屬性計算無法進行。 給定一個SDD,很難判定是否存在一棵分析樹,其對應(yīng)的依賴圖包含環(huán)。 但是特定類型的SDD一定不包含環(huán),且有固定的排序模式 S屬性的SDD L屬性的SDD 對于這些類型的SDD,我們可以確定屬性的計算順序,且可以把不需要的屬性(及分析樹結(jié)點)拋棄以提高效率S屬性的SDD 每個屬性都是綜合屬性 都是根據(jù)子構(gòu)造的屬性計算出父構(gòu)造的屬性。 在依賴圖中,總是通過子結(jié)點的屬性值來計算父結(jié)點的屬性值。可以和自頂向下、自底向上的語法分析過程一起計算 自底向

12、上: 在構(gòu)造分析樹的結(jié)點的同時計算相關(guān)的屬性(此時其子結(jié)點的屬性必然已經(jīng)計算完畢) 自頂向下: 遞歸子程序法中,在過程A()的最后計算A的屬性(此時A調(diào)用的其他過程(對應(yīng)于子結(jié)構(gòu))已經(jīng)調(diào)用完畢)在分析樹上計算SDD 按照后序遍歷的順序計算屬性值即可postorder(N)for(從左邊開始,對N的每個子結(jié)點C)postorder(c); /遞歸調(diào)用返回時,各子結(jié)點的屬性計算完畢對N的各個屬性求值; 在LR分析過程中,我們實際上不需要構(gòu)造分析樹的結(jié)點。L屬性的SDD 每個屬性 要么是綜合屬性, 要么是繼承屬性,且產(chǎn)生式AX1X2Xn中計算Xi.a的規(guī)則只能使用 A的繼承屬性 Xi左邊的文法符號X

13、j的繼承屬性或綜合屬性。 Xi自身的繼承或綜合屬性。且這些屬性之間的依賴關(guān)系不形成環(huán)。 特點: 依賴圖的邊: 繼承屬性從左到右,從上到下。 綜合屬性從下到上 在掃描過程中,計算一個屬性值時,和它相關(guān)的依賴屬性都已經(jīng)計算完畢。L屬性SDD和自頂向下語法分析 在遞歸子程序法中實現(xiàn)L屬性 對于每個非終結(jié)符號A,其對應(yīng)的過程的參數(shù)為繼承屬性,返回值為綜合屬性 在處理規(guī)則AX1X2Xn時, 在調(diào)用Xi()之前計算Xi的繼承屬性值,然后以它們?yōu)閰?shù)調(diào)用Xi(); 在產(chǎn)生式對應(yīng)代碼的最后計算A的綜合屬性 注意:如果所有的文法符號的屬性計算按上面的方式進行,計算順序必然和依賴關(guān)系一致。L屬性SDD的例子 非L

14、屬性的例子: ABCA.s=B.b;B.i=f(C.c, A.s)各子程序的類型 int T( ); int T1(int inh); int F( );文法符文法符號號函數(shù)名函數(shù)名 綜合屬性綜合屬性/類類型型返回類返回類型型繼承屬性繼承屬性/類型類型參數(shù)類型參數(shù)類型TTval / intint無無TT1syn / int intinh / intintFFval / intint無無考慮一下:如果有多個繼承屬性/多個綜合屬性是如何處理遞歸子程序法中實現(xiàn)L屬性SDDint T( )if(curToken = digit) /digit是first(FT)中唯一的符號/處理規(guī)則TFT。intfv

15、al = F( );/F的綜合屬性Value;intt1inh = fval;/計算T的繼承屬性intt1syn = T1(t1inh);/計算得到T的綜合屬性inttval = t1syn;/計算得到T的綜合屬性returntval;/返回T的綜合屬性elseerror();/報錯注意:if(curToken = )肯定不對,因為不是一個符號對規(guī)則中某個文法符號X的處理:1、計算X的所有繼承屬性的值2、用這些值調(diào)用子函數(shù)X;返回值保存在某個變量中。具有受控副作用的語義規(guī)則 屬性文法沒有副作用,但增加了描述的復(fù)雜度 比如語法分析時如果沒有副作用,標(biāo)識符表就必須作為屬性傳遞。 可以把標(biāo)識符表作為

16、全局變量,然后通過副作用函數(shù)來添加新標(biāo)識符; 受控的副作用 不會對屬性求值產(chǎn)生約束,即可以按照任何拓?fù)漤樞蚯笾担粫绊懽罱K結(jié)果。 或者對求值過程添加簡單的約束。受控副作用的例子 LE nprint(E.val) 通過副作用打印出E的值 總是在最后執(zhí)行,而且不會影響其它屬性的求值 變量聲明的SDD中的副作用 addType將標(biāo)識符的類型信息加入到標(biāo)識符表中。 只要標(biāo)識符不被重復(fù)聲明,標(biāo)識符的類型信息總是正確的。語法制導(dǎo)翻譯的應(yīng)用例子 抽象語法樹的構(gòu)造 基本類型和數(shù)組類型的L屬性定義構(gòu)造抽象語法樹的SDD 抽象語法樹 每個結(jié)點代表一個語法結(jié)構(gòu);對應(yīng)于一個運算符; 結(jié)點的每個子結(jié)點代表其子結(jié)構(gòu);對

17、應(yīng)于運算分量; 表示這些子結(jié)構(gòu)按照特定方式組成了較大的結(jié)構(gòu)。 可以忽略掉一些標(biāo)點符號等非本質(zhì)的東西。 語法樹的表示方法 每個結(jié)點用一個對象表示 對象有多個域 葉子結(jié)點中只存放詞法值; 內(nèi)部結(jié)點中存放了op值和參數(shù)(通常指向其它結(jié)點);構(gòu)造簡單表達(dá)式的語法樹的SDD 屬性E.node指向E對應(yīng)的語法樹的根結(jié)點;表達(dá)式語法樹的構(gòu)造過程 輸入:a-4+c 步驟: p1=new Leaf(id, entry_a) p2=new Leaf(num, 4); p3=new Node(-, p1,p2); p4=new Leaf(id, entry_c); p5=new Node(+, p3,p4);自頂向

18、下方式處理的L屬性定義(1) 在消左遞歸時,按照規(guī)則得到此SDD自頂向下方式處理的L屬性定義(2) 對于這個SDD,各屬性值的計算過程實際上和原來S屬性定義中的計算過程一致。 繼承屬性可以把值從一個結(jié)構(gòu)傳遞到另一個并列的結(jié)構(gòu);也可把值從父結(jié)構(gòu)傳遞到子結(jié)構(gòu)。 抽象語法樹和分析樹不一致時,繼承屬性很有用。類型結(jié)構(gòu) 簡化的類型表達(dá)式的語法 TB CBint | float CnumC | 生成類型表達(dá)式的SDD類型的含義 類型包括兩個部分:TB C 基本類型B 分量C 分量形如34 表示3X4的二維數(shù)組 int 34 數(shù)組構(gòu)造算符array array(3,array(4,int)表示抽象的3X4的

19、二維數(shù)組類型表達(dá)式的生成過程 輸入:int 23語法制導(dǎo)的翻譯方案 語法制導(dǎo)的翻譯方案(SDT)是在產(chǎn)生式體中嵌入程序片斷(語義動作)的上下文無關(guān)文法 SDT的基本實現(xiàn)方法: 建立語法分析樹; 將語義動作看作是虛擬的結(jié)點; 從左到右、深度優(yōu)先地遍歷分析樹,在訪問虛擬結(jié)點時執(zhí)行相應(yīng)動作 用SDT實現(xiàn)兩類重要的SDD 基本文法是LR的,SDD是S屬性的 基本文法是LL的,SDD是L屬性的例子 語句3*4*5的分析樹如右 DFS可知動作執(zhí)行順序 A71,A5, A72, A41, A73, A42, A2 注意,一個動作的不同實例所訪問的屬性值屬于不同的結(jié)點T3F*digit:4digit:5T2T

20、1Fdigit:3F*EA7A71A72A5A41A42A2A73可在語法分析過程中實現(xiàn)的SDT 實現(xiàn)SDT時,實際上并不會真的構(gòu)造語法分析樹,而是在分析過程中執(zhí)行語義動作 即使基礎(chǔ)文法可以應(yīng)用某種分析技術(shù),仍可能因為動作的緣故導(dǎo)致此技術(shù)不可應(yīng)用 判斷是否可在分析過程中實現(xiàn) 將每個語義動作替換為一個獨有的標(biāo)記非終結(jié)符號;每個標(biāo)記非終結(jié)符號M的產(chǎn)生式為M。 如果新的文法可以由某種方法進行分析,那么這個SDT就可以在這個分析過程中實現(xiàn)。 注意:這個方法沒有考慮變量值的傳遞等要求。判斷SDT可否用特定分析技術(shù)實現(xiàn)例子 LE n M1M1 EE+T M2M2 ET M3M3 后綴翻譯方案 文法可以自底

21、向上分析且SDD是S屬性的,比然可以構(gòu)造出后綴SDT 后綴SDT:所有動作都在產(chǎn)生式最右端的SDT 構(gòu)造方法: 將每個語義規(guī)則看作是一個賦值語義動作 將所有的語義動作放在規(guī)則的最右端后綴翻譯方案的例子 實現(xiàn)桌上計算器的后綴SDT注意動作中對屬性值的引用: 我們允許語句引用全局變量,局部變量,文法符號的屬性。 文法符號的屬性只能被賦值一次;后綴SDT的語法分析棧實現(xiàn) 可以在LR語法分析的過程中實現(xiàn) 歸約時執(zhí)行相應(yīng)的語義動作 定義用于記錄各文法符號的屬性的union結(jié)構(gòu) 棧中的每個文法符號(或者說狀態(tài))都附帶一個這樣的union類型的值; 在按照產(chǎn)生式AXYZ歸約時,Z的屬性可以在棧頂找到,Y的屬

22、性可以在下一個位置找到,X的屬性可以在再下一個位置找到。分析棧實現(xiàn)的例子 假設(shè)語法分析棧存放在一個被稱為stack的記錄數(shù)組中,下標(biāo)top指向棧頂; stacktop是這個棧的棧頂; stacktop-1指向棧頂下一個位置; 如果不同的文法符號有不同的屬性集合,我們可以使用union來保存這些屬性值。 歸約時能夠知道棧頂向下的各個符號分別是什么;因此我們也能夠確定各個union中究竟存放了什么樣的值后綴SDT的棧實現(xiàn) 這個SDT中沒有局部變量,不會產(chǎn)生和局部變量有關(guān)的問題注意:stacktop-i和文法符號的對應(yīng)產(chǎn)生式內(nèi)部帶有語義動作的SDT 動作左邊的所有符號(以及動作)處理完成后,就立刻執(zhí)

23、行這個動作 BXaY 自底向上分析時,在X出現(xiàn)在棧頂時執(zhí)行動作a 自頂向下分析時,在試圖展開Y或者在輸入中檢測到Y(jié)的時刻執(zhí)行a 不是所有的SDT都可以在分析過程中實現(xiàn) 但是后綴SDT以及L屬性對應(yīng)的SDT可以在分析時完成。 對于一般的SDT,都可以先建立分析樹(語義動作作為虛擬的結(jié)點),然后進行前序遍歷并執(zhí)行動作。消左遞歸時SDT的轉(zhuǎn)換 如果動作不涉及屬性值,可以把動作當(dāng)作終結(jié)符號進行處理,然后消左遞歸 原始的產(chǎn)生式 EE1+T print(+); ET 轉(zhuǎn)換后得到 E T R R + T print (+); R R L屬性的SDT 從L屬性到SDT的轉(zhuǎn)換 將每個語義規(guī)則看作是一個賦值語義動

24、作 將賦值語義動作放到相應(yīng)產(chǎn)生式的適當(dāng)位置 計算A的繼承屬性的動作插入到產(chǎn)生式體中對應(yīng)的A的左邊 如果A的繼承屬性之間具有依賴關(guān)系,則需要對計算動作進行排序 計算產(chǎn)生式頭的綜合屬性的動作在產(chǎn)生式的最右邊。L屬性的SDT的例子 SDD 繼承屬性: next:語句結(jié)束后應(yīng)該跳轉(zhuǎn)到的標(biāo)號 true、false:C為真/假時應(yīng)該跳轉(zhuǎn)到的標(biāo)號 綜合屬性code表示代碼轉(zhuǎn)換 語義動作 (a) L1=new( )和L2=new( ):計算臨時值 (b) C.false = S.next; C.true = L2:計算C的繼承屬性 (c) S1.next = L1:計算S1的繼承屬性 (d) S.code=

25、:計算S的綜合屬型 根據(jù)放置語義動作的規(guī)則得到如下SDT b在C之前;c在S1之前;d在最右端 a可以放在最前面L屬性的SDD的實現(xiàn) 使用遞歸下降的語法分析器 每個非終結(jié)符號對應(yīng)一個函數(shù) 函數(shù)的參數(shù)接受繼承屬性 返回值包含了綜合屬性 在函數(shù)體中 首先選擇適當(dāng)?shù)漠a(chǎn)生式 使用局部變量來保存屬性 對于產(chǎn)生式體中的終結(jié)符號,讀入符號并獲取其(經(jīng)詞法分析得到的)綜合屬性 對于非終結(jié)符號,使用適當(dāng)?shù)姆绞秸{(diào)用相應(yīng)函數(shù),并記錄返回值。遞歸下降法實現(xiàn)L屬性SDD的例子邊掃描邊生成屬性(1) 當(dāng)屬性值的體積很大時,對屬性值進行運算的效率很低 比如code(代碼)可能是一個上百K的串,對其進行并置等運算會比較低效

26、可以逐步生成屬性的各個部分,并增量式添加到最終的屬性值中 條件: 存在一個主屬性,且主屬性是綜合屬性 在各產(chǎn)生式中,主屬性是通過產(chǎn)生式體中各個非終結(jié)符號的主屬性連接(并置)得到的。同時還會連接一些其它的元素。 各非終結(jié)符號的主屬性的連接順序和它在產(chǎn)生式體中的順序相同邊掃描邊生成屬性(2) 基本思想 只需要在適當(dāng)?shù)臅r候“發(fā)出”非主屬性的元素,即把這些元素拼接到適當(dāng)?shù)牡胤?舉例說明 假設(shè)我們在掃描一個非終結(jié)符號對應(yīng)的語法結(jié)構(gòu)時,調(diào)用相應(yīng)的函數(shù),并生成主屬性; S while (C) S1 S.code = Label | L1 |C.code |Label | L2 | S1.code 處理S時,先調(diào)用C,再調(diào)用S(對應(yīng)于S1) 如果各個函數(shù)把主屬性打印出來,我們處理while語句時,只需要先打印Label L1,再調(diào)用C(打印了C的代碼),再打印Label L2,再調(diào)用S(打印S1的代碼) 對于這個規(guī)則而言,只需要打印Label L1和Label L2。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論