編譯原理課程設(shè)計報告--pl0編譯器的擴(kuò)充_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設(shè) 計</b></p><p>  課程名稱 編譯原理 </p><p>  題目名稱 PL/0編譯器的擴(kuò)充 </p><p>  學(xué)生學(xué)院 計算機(jī)學(xué)院 </p><p>  專業(yè)班級 計算機(jī)科學(xué)與技術(shù)12(4)</p>

2、<p>  2014 年 12 月 28日</p><p><b>  實驗?zāi)康呐c要求</b></p><p>  基本內(nèi)容(成績范圍:“中”、“及格”或“不及格”)</p><p>  (1)擴(kuò)充賦值運(yùn)算:*= 和 /=</p><p> ?。?)擴(kuò)充語句(Pascal的FOR語句):</p>

3、<p>  FOR <變量>:=<表達(dá)式>STEP<表達(dá)式> UNTIL<表達(dá)式>Do<語句></p><p>  選做內(nèi)容(成績評定范圍擴(kuò)大到:“優(yōu)”和“良”)</p><p> ?。?)增加類型:① 字符類型; ② 實數(shù)類型。</p><p> ?。?)增加 注釋; 注釋由

4、/*和*/包含;</p><p> ?。?)擴(kuò)充函數(shù):① 有返回值和返回語句;② 有參數(shù)函數(shù)。</p><p> ?。?)增加一維數(shù)組類型(可增加指令)。</p><p> ?。?)其他典型語言設(shè)施。</p><p><b>  實驗環(huán)境與工具</b></p><p>  1、源語言:PL/0語言

5、,PL/0語言是PASCAL語言的子集,它的編譯程序是一個編譯解析執(zhí)行系統(tǒng),后綴名為.PL0;</p><p>  2、目標(biāo)語言:生成文件后綴為*.COD的目標(biāo)代碼</p><p>  3、實現(xiàn)平臺:Borland C++Builder 6</p><p>  4、運(yùn)行平臺:Windows 8.1</p><p><b>  設(shè)計概

6、述</b></p><p><b>  結(jié)構(gòu)設(shè)計說明</b></p><p> ?。?)PL/0編譯系統(tǒng)的結(jié)構(gòu)框架</p><p>  源語言:源語言是基于C語言寫的PL/0編譯程序——PL0語言(可 以看成 Pascal語言的子集)</p><p>  目標(biāo)語言:假想的棧式計算機(jī)計算語言,即類PC

7、ODE指令代碼。</p><p><b>  指令格式如下:</b></p><p>  其中f代表功能碼,l表示層次差,a的含意對不同的指令有所區(qū)別。</p><p><b>  具體的指令功能表:</b></p><p><b>  設(shè)計分析</b></p>

8、<p>  擴(kuò)充賦值運(yùn)算:*= 和 /=</p><p>  需要增加2個運(yùn)算符*= 和 /=,用下面表格定義的SYM代替</p><p>  *= 和 /=的語法描述圖:</p><p>  擴(kuò)充語句(Pascal的FOR語句)</p><p>  因為在Pascal中的FOR語句描述為:</p><p>

9、  FOR <變量>:=<表達(dá)式> STEP <表達(dá)式> UNTIL <表達(dá)式> DO <語句></p><p>  所以增加FOR,STEP,UNTIL,DO</p><p>  FOR語句語法描述圖為:</p><p><b>  程序設(shè)計</b></p><p

10、>  增加所需要的保留字和運(yùn)算符,實現(xiàn)*=和/=,以及FOR語句,應(yīng)該增加TIMESBECOMES,SLASHBECOMES,F(xiàn)OR,STEP,UNTIL,DO。</p><p>  注:因為要求課設(shè)和之前實驗的內(nèi)容合并在一起,所以保留了課程實驗已經(jīng)添加的保留字和運(yùn)算符,之前的已經(jīng)添加了的不再贅述。</p><p>  具體實現(xiàn)的語句如下所示:</p><p>

11、;  typedef enum {NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,</p><p>  SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,</p><p>  LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,</p><p>  BECOMES,

12、BEGINSYM, ENDSYM, IFSYM, THENSYM,</p><p>  WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,</p><p>  CONSTSYM, VARSYM, PROCSYM, PROGSYM,ELSESYM,</p><p>  FORSYM,STEPSYM,UNTILSYM,RETURNS

13、YM,</p><p>  TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM</p><p><b>  } SYMBOL;</b></p><p>  這里需要考慮需要增加保留字的個數(shù),以及如何命名,再將新增的保留字添加對應(yīng)的保留字的集合中。具體實現(xiàn)的語句如下所示:</p><p&

14、gt;  char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES",</p><p>  "SLASH", "ODDSYM", "EQL", "N

15、EQ", "LSS", "LEQ", "GTR", "GEQ",</p><p>  "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD",</p><p&g

16、t;  "BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM",</p><p>  "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "C

17、ALLSYM",</p><p>  "CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM" ,"ELSESYM",</p><p>  "FORSYM","STEPSYM","UNTILSYM&quo

18、t;,"RETURNSYM","TIMESBECOMES",</p><p>  "SLASHBECOMES", "ANDSYM", "ORSYM", "NOTSYM"};</p><p>  將新增的保留字按照字母表升序的方式添加,運(yùn)算符參照已有的運(yùn)算符來進(jìn)行添加,注意

19、好符號與SYM的對應(yīng)。具體實現(xiàn)的語句如下所示:</p><p>  特別注意點:此處一定要考慮到PLO編譯器采用了折半查找算法來進(jìn)行操作,如果新增的保留字沒有按照既定的升序規(guī)則來插入,會造成在編譯過程中,編譯器無法識別某些保留字。</p><p>  strcpy(KWORD[ 1],"BEGIN"); strcpy(KWORD[ 2],"CALL&qu

20、ot;);</p><p>  strcpy(KWORD[ 3],"CONST"); strcpy(KWORD[ 4],"DO");</p><p>  strcpy(KWORD[ 5],"ELSE");</p><p>  strcpy(KWORD[ 6],"END");<

21、/p><p>  strcpy(KWORD[ 7],"FOR");</p><p>  strcpy(KWORD[ 8],"IF");</p><p>  strcpy(KWORD[ 9],"ODD"); strcpy(KWORD[ 10],"PROCEDURE");</p&

22、gt;<p>  strcpy(KWORD[ 11],"PROGRAM"); strcpy(KWORD[12],"READ");</p><p>  strcpy(KWORD[13],"RETURN");</p><p>  strcpy(KWORD[14],"STEP");</p>

23、<p>  strcpy(KWORD[15],"THEN");</p><p>  strcpy(KWORD[16],"UNTIL");</p><p>  strcpy(KWORD[17],"VAR");</p><p>  strcpy(KWORD[18],"WHILE"

24、;); strcpy(KWORD[19],"WRITE");</p><p>  WSYM[ 1]=BEGINSYM; WSYM[ 2]=CALLSYM;</p><p>  WSYM[ 3]=CONSTSYM; WSYM[ 4]=DOSYM;</p><p>  WSYM[ 5]=ELSESYM; </p>&l

25、t;p>  WSYM[ 6]=ENDSYM;</p><p>  WSYM[ 7]=FORSYM;</p><p>  WSYM[ 8]=IFSYM;</p><p>  WSYM[ 9]=ODDSYM; WSYM[ 10]=PROCSYM;</p><p>  WSYM[ 11]=PROGSYM; WSYM[12]=RE

26、ADSYM;</p><p>  WSYM[13]=RETURNSYM;</p><p>  WSYM[14]=STEPSYM;</p><p>  WSYM[15]=THENSYM;</p><p>  WSYM[16]=UNTILSYM;</p><p>  WSYM[17]=VARSYM;</p>

27、<p>  WSYM[18]=WHILESYM; WSYM[19]=WRITESYM;</p><p>  SSYM['+']=PLUS; SSYM['-']=MINUS;</p><p>  SSYM['*']=TIMES; SSYM['/']=SLASH;</p><p&

28、gt;  SSYM['(']=LPAREN; SSYM[')']=RPAREN;</p><p>  SSYM['=']=EQL; SSYM[',']=COMMA;</p><p>  SSYM['.']=PERIOD;</p><p>  SSYM[';

29、9;]=SEMICOLON;</p><p>  SSYM['&']=ANDSYM;</p><p>  SSYM['|']=ORSYM;</p><p>  SSYM['!']=NOTSYM;</p><p>  特別需要注意的兩點,這個是很容易被忽略的地方,就是在完成保留字和運(yùn)算符的

30、增加以后,一定要對PLO編譯器對保留字個數(shù)已經(jīng)單詞總數(shù)定義進(jìn)行相應(yīng)的修改。</p><p><b>  保留字總數(shù)</b></p><p>  比如說在不添加任何保留字的情況下,PL0編譯器的原保留字應(yīng)該是14個,所以在Unit1.CPP中有定義const NORW = 14; /* # OF RESERVED WORDS */</p><

31、p>  而在實驗中因為新增加保留字5個,故此處應(yīng)改為:</p><p>  const NORW = 19; /* # OF RESERVED WORDS */</p><p><b>  單詞總數(shù)</b></p><p>  與保留字總數(shù)一樣,我們增加完保留字和運(yùn)算符以后,要修改單詞總是,比如原單詞總數(shù)是33,因為原編譯器中并未

32、定義一個常量來進(jìn)行統(tǒng)一管理,所以需要對所有“i<33”的地方進(jìn)行修改。因為實驗中新增加單詞10個,故應(yīng)改為“i<43”。</p><p>  如下面代碼所示舉例:</p><p>  SYMSET SymSetUnion(SYMSET S1, SYMSET S2) {</p><p>  SYMSET S=(SYMSET)malloc(sizeof(in

33、t)*43);</p><p>  for (int i=0; i<43; i++)</p><p>  if (S1[i] || S2[i]) S[i]=1;</p><p>  else S[i]=0;</p><p><b>  return S;</b></p><p><b&

34、gt;  }</b></p><p>  特別是這個地方也要更改數(shù)目為43,不然會發(fā)生異常信息。</p><p>  DECLBEGSYS=(int*)malloc(sizeof(int)*43);</p><p>  STATBEGSYS=(int*)malloc(sizeof(int)*43);</p><p>  FACBE

35、GSYS =(int*)malloc(sizeof(int)*43);</p><p>  for(int j=0; j<43; j++) {</p><p>  DECLBEGSYS[j]=0; STATBEGSYS[j]=0; FACBEGSYS[j] =0;</p><p><b>  }</b></p><

36、p>  體會:在這里的細(xì)節(jié)導(dǎo)致出現(xiàn)了很多意料不到的問題,很多時候調(diào)試了很久才發(fā)現(xiàn),有些地方漏改了,其實可以考慮設(shè)置一個全局變量,進(jìn)行統(tǒng)一修改,不過考慮到對編譯器增加全局變量不是很好的一種方式,難免會發(fā)生出現(xiàn)可能的篡改,而且不夠直觀,故只是在原來基礎(chǔ)上做出修改。</p><p>  新增的運(yùn)算符需要被編譯器識別,必須滿足編譯器做詞法分析時,能夠正確得到對應(yīng)的SYM,因此在GetSym()函數(shù)中在相應(yīng)位置增加相

37、應(yīng)的運(yùn)算符分析判斷,具體實現(xiàn)如下面所示的語句:</p><p><b>  else</b></p><p>  if(CH=='*'){</p><p><b>  GetCh();</b></p><p>  if(CH=='=') {SYM=TIMESBECOM

38、ES; GetCh();}</p><p>  else SYM=TIMES;}</p><p><b>  else</b></p><p>  if(CH=='/'){</p><p><b>  GetCh();</b></p><p>  if(CH=

39、='='){SYM=SLASHBECOMES;</p><p><b>  GetCh();}</b></p><p>  else SYM=SLASH;}</p><p>  體會:這里是雙字符判斷,需要注意判別的連貫性,處理不同情況下對于的SYM或者報錯方式。</p><p>  完成*=和/=的語法

40、分析以后,需要考慮其語義的實現(xiàn),也就是考慮如何實現(xiàn)語句的處理,這里根據(jù)前面設(shè)計的語法描述圖來進(jìn)行相應(yīng)的語句分析。</p><p>  依據(jù)語法描述圖,首選找到STATEMENT函數(shù)中IDENT語句體,即case IDENT:語句中加入對*=和/=的語句描述。注意這里有三種情況,要考慮到相互不能影響。表達(dá)式的分析采用EXPRESSION(FSYS,LEV,TX);語句就行。</p><p>

41、<b>  從指令功能表可知:</b></p><p>  OPR,0,4代表次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧</p><p>  OPR,0,5代表次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧</p><p>  一定要注意是次棧頂對棧頂?shù)牟僮?,所以要注意被除?shù)(被乘數(shù))和除數(shù)(乘數(shù))的入棧的先后次序,不可顛倒。</p>&

42、lt;p>  case IDENT:</p><p>  i=POSITION(ID,TX);</p><p>  if (i==0) Error(11);</p><p><b>  else</b></p><p>  if (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT

43、TO NON-VARIABLE*/</p><p>  Error(12); i=0;</p><p><b>  }</b></p><p><b>  GetSym();</b></p><p>  if (SYM==BECOMES||TIMESBECOMES||SLASHBECOMES)<

44、;/p><p><b>  {</b></p><p>  OPSYM=SYM;</p><p>  if (SYM==TIMESBECOMES)</p><p><b>  {</b></p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[

45、i].vp.ADR); //取值到棧頂</p><p><b>  }</b></p><p>  else if (SYM==SLASHBECOMES)</p><p><b>  {</b></p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp

46、.ADR); //取值到棧頂</p><p><b>  }</b></p><p>  GetSym(); }</p><p>  else Error(13);</p><p>  EXPRESSION(FSYS,LEV,TX);</p><p>  if (OPSYM == TIMESBEC

47、OMES)</p><p><b>  {</b></p><p>  GEN(OPR,0,4); // OPR,0,4代表次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧</p><p><b>  }</b></p><p>  else if (OPSYM == SLASHBECOMES)</p

48、><p><b>  {</b></p><p>  GEN(OPR,0,5); // OPR,0,5代表次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧</p><p><b>  }</b></p><p><b>  if (i!=0)</b></p><p>

49、;<b>  {</b></p><p>  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b>  }</b></p><p><b>  break;</b></p><p>  體會:這里在調(diào)試過程中發(fā)現(xiàn)

50、了編譯程序中的一個BUG:</p><p>  當(dāng)我測試除等運(yùn)算時,發(fā)現(xiàn)目標(biāo)代碼的生成沒有問題,可是結(jié)果變成了取余運(yùn)算,調(diào)試許久以后,才發(fā)現(xiàn)原來在編譯器源碼中Interpret()函數(shù)的語句中的除運(yùn)算變成了取余運(yùn)算。也就造成了OPR 0,5語句本來應(yīng)該是表示除運(yùn)算指令,變成了取余運(yùn)算指令。</p><p>  所以把該語句修改為:</p><p>  case 5:

51、 T--; S[T]=S[T] / S[T+1]; break;</p><p>  結(jié)果就可以正常輸出。所以面對這種BUG,還好老師提醒一下,才發(fā)現(xiàn)是這個原因。</p><p>  在增加了所有FOR循環(huán)需要的保留字以后,根據(jù)FOR循環(huán)的語法描述進(jìn)行語義分析。因為在Pascal中的FOR語句描述為:FOR <變量>:=<表達(dá)式> STEP <表達(dá)式>

52、UNTIL <表達(dá)式> DO <語句>。所以按照這個語義,進(jìn)行相應(yīng)的語句處理。</p><p>  case FORSYM:</p><p><b>  GetSym();</b></p><p>  if (SYM!=IDENT) Error(13);//是否為 變量符號</p><p><

53、;b>  else {</b></p><p>  i=POSITION(ID,TX);</p><p>  if (i==0) Error(11);</p><p>  else if (TABLE[i].KIND!=VARIABLE) //賦值語句中,賦值左部標(biāo)識符是變量</p><p>  { Error(12); i

54、=0; }</p><p><b>  GetSym();</b></p><p>  if(SYM!=BECOMES) Error(13);</p><p><b>  else {</b></p><p><b>  GetSym();</b></p>&

55、lt;p>  /*處理賦值語句右部的表達(dá)式*/</p><p>  EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p><b>  if(i!=0)</b></p><p>  GEN(STO,LEV-TABLE[i].vp.LEV

56、EL,TABLE[i].vp.ADR); //保持初始值</p><p>  CX1=CX;//如果是賦值語句,跳轉(zhuǎn)到untilsym執(zhí)行</p><p>  GEN(JMP,0,0);</p><p>  CX2=CX; //保持循環(huán)開始點</p><p>  if(SYM!=STEPSYM) Error(19);</p>&

57、lt;p><b>  else{</b></p><p><b>  GetSym();</b></p><p>  EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p>  GEN(LOD,LEV-TABLE[

58、i].vp.LEVEL,TABLE[i].vp.ADR); //循環(huán)變量放到棧頂</p><p>  GEN(OPR,0,2);</p><p>  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//將棧頂?shù)闹捣湃胙h(huán)變量</p><p>  //GetSym();</p><p>  if(S

59、YM!=UNTILSYM) Error(19);</p><p><b>  else{</b></p><p>  CODE[CX1].A=CX; //如果是賦值語句,跳轉(zhuǎn)到untilsym執(zhí)行</p><p><b>  GetSym();</b></p><p>  EXPRESSION(Sy

60、mSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p>  GEN(OPR,0,12); //次棧頂是否比棧頂小,是,1進(jìn)棧,否,0進(jìn)棧</p><p><b> 

61、 CX3=CX;</b></p><p>  GEN(JPC,0,0);// 棧頂布爾值非0則轉(zhuǎn)移</p><p>  if(SYM=DOSYM) {</p><p><b>  GetSym();</b></p><p>  STATEMENT(FSYS,LEV,TX);</p><p&

62、gt;  GEN(JMP,0,CX2);//跳回step</p><p>  CODE[CX3].A=CX;</p><p><b>  }</b></p><p>  else Error(19);</p><p><b>  }}}}</b></p><p><b&

63、gt;  //跳出for循環(huán)</b></p><p><b>  break;</b></p><p>  體會:這里的語句分析的次序應(yīng)該是按照語句出現(xiàn)的先后,而不是語義的先后,不然邏輯很難處理,而且根據(jù)循環(huán)的方式,進(jìn)行相應(yīng)的跳轉(zhuǎn)回填操作比較多,因為要求是對表達(dá)式進(jìn)行操作,所以EXPRESSION()語句的處理也比較多。</p><p&

64、gt;<b>  測試用例</b></p><p>  因為這個整合了前面課程實驗和課程設(shè)計的全部內(nèi)容,因此對代碼的檢測也寫了很多的測試用例。</p><p><b>  下面是相關(guān)說明:</b></p><p><b>  運(yùn)行結(jié)果</b></p><p>  測試/=運(yùn)算(

65、結(jié)果截圖,測試用例E05.PL0)</p><p><b>  運(yùn)行代碼截圖:</b></p><p><b>  結(jié)果輸出截圖:</b></p><p>  測試*=運(yùn)算(結(jié)果截圖,測試用例E06.PL0)</p><p><b>  結(jié)果輸出截圖:</b></p>

66、;<p><b>  目標(biāo)代碼生成:</b></p><p><b>  0 JMP 0 1</b></p><p><b>  1 INI 0 7</b></p><p><b>  2 LIT 0 4</b></p><p><b&

67、gt;  3 STO 0 5</b></p><p>  4 OPR 0 16</p><p><b>  5 STO 0 3</b></p><p>  6 OPR 0 16</p><p><b>  7 STO 0 4</b></p><p><b&g

68、t;  8 LOD 0 3</b></p><p><b>  9 LIT 0 1</b></p><p>  10 OPR 0 2</p><p>  11 STO 0 6</p><p>  12 JMP 0 19</p><p>  13 LOD 0 4</p>&

69、lt;p>  14 LIT 0 2</p><p>  15 OPR 0 2</p><p>  16 LOD 0 6</p><p>  17 OPR 0 2</p><p>  18 STO 0 6</p><p>  19 LOD 0 3</p><p>  20 LIT 0 10&

70、lt;/p><p>  21 OPR 0 2</p><p>  22 LOD 0 6</p><p>  23 OPR 0 12</p><p>  24 JPC 0 31</p><p>  25 LOD 0 5</p><p>  26 LOD 0 6</p><p>

71、  27 OPR 0 4</p><p>  28 OPR 0 14</p><p>  29 OPR 0 15</p><p>  30 JMP 0 13</p><p>  31 OPR 0 0</p><p>  測試FOR循環(huán)語句(結(jié)果截圖,測試用例E07.PL0)</p><p>&l

72、t;b>  結(jié)果輸出截圖:</b></p><p><b>  心得體會</b></p><p>  總的來說,編譯原理課程設(shè)計,難度挺大,加上本身時間比較重疊,所以很多問題都沒有時間去嘗試。而且也遇到像編譯器存在某些小BUG的問題(比如OPR 0,5),導(dǎo)致調(diào)試了很久,才發(fā)現(xiàn)問題不在自己的代碼。最印象深刻的是對FOR語句的處理,因為FOR語句的語義

73、分析比較繁瑣,老師雖然在課堂講了兩次,也聽明白了,但是實際動手還是發(fā)現(xiàn)有比較大的困難。這也在一些方面體現(xiàn)了知識的活學(xué)活用還是不夠。</p><p>  對于編譯原理這門課,我覺得考慮問題的分析方式還是很有意思,也對如何編譯這個過程的處理有了一個大致的摸索。切實的進(jìn)行編譯器編程之后,對這個編譯器如何實現(xiàn)我們的代碼轉(zhuǎn)換有了新的認(rèn)識,站在這個基礎(chǔ)上去理解高級語言的語法分析的過程,去想象高級語言的語義分析的思路,對自己的

74、編程感悟也有了一些提高。</p><p>  編譯原理實驗是一個要很注意細(xì)節(jié)的事情,因為在處理細(xì)節(jié)上必須注意,比如我在處理保留字?jǐn)?shù)量和單詞數(shù)量上就一直摸索了好久,期間也造成了一些像內(nèi)存溢出,無法識別保留字的錯誤。而對于像FOR語句,主要是對于語義處理,和語句之間的銜接跳轉(zhuǎn)回調(diào)的理解。</p><p>  總之,編譯原理是一門需要細(xì)心和耐心的學(xué)科,對于我們理解高級語言的實現(xiàn)由很大的促進(jìn)。衷心

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論