TINY部分源碼分析報告

上傳人:cjc****537 文檔編號:50763090 上傳時間:2022-01-22 格式:DOCX 頁數(shù):23 大?。?9.74KB
收藏 版權(quán)申訴 舉報 下載
TINY部分源碼分析報告_第1頁
第1頁 / 共23頁
TINY部分源碼分析報告_第2頁
第2頁 / 共23頁

本資源只提供2頁預(yù)覽,全部文檔請下載后查看!喜歡就下載吧,查找使用更方便

0 積分

下載資源

資源描述:

《TINY部分源碼分析報告》由會員分享,可在線閱讀,更多相關(guān)《TINY部分源碼分析報告(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、精品資料 TINY源碼分析 一、文件概述 MAIN.C:主函數(shù) GLOBALS.H:全局定義的文件 SCAN.C/SCAN.H:詞法分析 PARSE.C/PARSE.H:語法分析 UTIL.C/UTIL.H:構(gòu)造樹 SYMTAB.C/SYMTAB.H:符號表 CGEN.C/CGEN.H:生成"匯編代碼" CODE.C/CODE.H:這個只是用來把分析過程輸出到屏幕的. 二、各個文件的分析 1.MAIN.C: 主要有三個FILE*句柄: source--源代碼文件。 listing--顯示分析過程的文件,這里重定向到stdout。 code--目標(biāo)匯編代碼文件

2、。 從該文件中可知程序運行的流程: 檢查參數(shù)正確否(tiny.exefilename)->構(gòu)造語法樹(調(diào)用parse函數(shù))->根據(jù)語法樹生成代 碼(調(diào)用codeGen函數(shù),該函數(shù)又調(diào)用cGen函數(shù)。 2.GLOBALS.H: 定義了關(guān)鍵字個數(shù)8個。 定義了關(guān)鍵字,運算符等內(nèi)容的枚舉值。 定義了語句類型的枚舉值,這個決定樹的結(jié)點。 可編輯修改 定義了變量類型(也就三種,void,integer,boolean)。 定義了樹的節(jié)點--這個最重要了!!其結(jié)構(gòu)如下所示: typedefstructtreeNode { structtreeNode*child[MAXCHI

3、LDREN]; structtreeNode*sibling; intlineno; NodeKindnodekind; union{StmtKindstmt;ExpKindexp;}kind; union{TokenTypeop; intval; char*name;}attr; ExpTypetype;/*fortypecheckingofexps*/ }TreeNode; 3.UTIL.C/UTIL.H 主要函數(shù) TreeNode*newStmtNode(StmtKindkind) 此函數(shù)創(chuàng)建一個有關(guān)語法樹的聲明節(jié)點 TreeNode*newExpNode(E

4、xpKindkind) 此函數(shù)創(chuàng)建一個有關(guān)語法樹的表述節(jié)點 char*copyString(char*s) 此函數(shù)分配和創(chuàng)建一個新的已存在樹的復(fù)制 voidprintTree(TreeNode*tree) 輸出一個語法樹 這兩個文件主要是關(guān)于語法樹的創(chuàng)建和輸出 4.SCAN.c/SCAN.H 主要有這么幾個函數(shù):staticintgetNextChar(void); staticvoidungetNextChar(void); staticTokenTypereservedLookup(char*s); TokenTypegetToken(void); reserved

5、Lookup函數(shù)是查找關(guān)鍵字的,在符號表中找。這里還定義了一個保存關(guān)鍵字的結(jié) 構(gòu): staticstruct {char*str; TokenTypetok; }reservedWords[MAXRESERVED] {{"if",IF},{"then",THEN},{"else",ELSE},{"end",END}, {"repeat",REPEAT},{"until",UNTIL},{"read",READ}, {"write",WRITE}}; 最重要的是getToken(void)函數(shù)。這個相當(dāng)于lex的功能,進(jìn)行詞法分析。也就是一個DFA, switch后面跟了一堆

6、的case。 其中g(shù)etNextChar(void)函數(shù)的思路,以下列出: staticintgetNextChar(void) { if(!(linepos

7、turnEOF; } } elsereturnlineBuf[linepos++]; } 4.PARSE.C/PARSE.H 有這么幾個函數(shù): TreeNode*parse(void) staticTreeNode*stmt_sequence(void); staticTreeNode*statement(void); staticTreeNode*if_stmt(void); staticTreeNode*repeat_stmt(void); staticTreeNode*assign_stmt(void); staticTreeNode*read_stmt(vo

8、id); staticTreeNode*write_stmt(void); staticTreeNode*exp(void); staticTreeNode*simple_exp(void); staticTreeNode*term(void); staticTreeNode*factor(void); 最重要的是parse這個函數(shù),就是用來構(gòu)造整個程序的語法樹的。下面的一堆私有函數(shù)構(gòu) 造相應(yīng)語法的語法樹,然后parse最后把它們這些子樹整合成一個大樹。 5.SYMTAB.C/SYMTAB.H 這個是符號表操作的,也就是詞法分析的時候查找表,看該token是不是關(guān)鍵字。如果不

9、 是,就當(dāng)作表識符添加進(jìn)去。在語法分析的時候也要用到,看變量有沒有聲明的時候用的。 三、實驗心得: 通過這次實驗,仔細(xì)地去查看和分析了TINY編譯器的部分源碼。了解到了編譯器的運 行:檢查參數(shù)正確否(tiny.exefilename)->構(gòu)造語法樹(調(diào)用parse函數(shù))->根據(jù)語法樹生 成代碼(調(diào)用codeGen函數(shù)),同時熟悉了編譯器是如何使用prase函數(shù)進(jìn)行語法樹的構(gòu) 建以及語法樹生成代碼的轉(zhuǎn)化,最主要的是進(jìn)一步清晰了解到編譯器的構(gòu)造和運行原理,加 深了對課本知識的運用和拓展,感覺收獲很大! Main.c/*********************************

10、*******************/ */ */ */ */ /*File:main.c /*MainprogramforTINYcompiler /*CompilerConstruction:PrinciplesandPractice /*KennethC.Louden /** ************************************************ **/ #include "globals.h /* set NO_PARSE to TRUE to get a scanner-only compiler 創(chuàng)建一個只掃描的編譯器 *

11、/ #define NO_PARSE FALSE /* set NO_ANALYZE to TRUE to get a parser-only compiler 時創(chuàng)建一個只分析和掃描的編譯器 */ #define NO_ANALYZE FALSE NO_PARSE 為 true 時 NO_ANALYZE 為 true /*setNO_CODEtoTRUEtogetacompilerthatdoesnot *generatecodeNO_CODE為true時創(chuàng)建一個執(zhí)行語義分析,但不生成代碼的編譯器 */ #include "util.h" #if NO_PARSE

12、 #include "scan.h" #else #include "parse.h" #if !NO_ANALYZE #include "analyze.h #if !NO_CODE #include "cgen.h" #endif #defineNO_CODEFALSE //如果NO_PARSE為true,調(diào)用頭文件scan.h //否則調(diào)用頭文件prase.h //如果NO_ANALYZE為true,調(diào)用頭文件analyze.h //如果NO_CODE為true,調(diào)用頭文件cgen.h#endif #endif//結(jié)束預(yù)處理語句符號 /*allocateglobalvar

13、iables分配全局變量*/ intlineno=0; FILE*source;//指針指向源代碼文件地址 FILE*listing;//指針指向顯示分析過程的文件的地址 FILE*code;//指針指向目標(biāo)匯編代碼文件的地址 /*allocateandsettracingflags分配和設(shè)置跟蹤標(biāo)志*/ intEchoSource=FALSE; intTraceScan=FALSE; intTraceParse=FALSE; intTraceAnalyze=FALSE; intTraceCode=FALSE; intError=FALSE;//跟蹤標(biāo)志全部初始化為fal

14、semain(intargc,char*argv[]) {TreeNode*syntaxTree; charpgm[120];/*sourcecodefilename*/ if(argc!=2) {fprintf(stderr,"usage:%s\n",argv[0]); exit(1);//如果argv不為2,打印顯示信息并退出 } strcpy(pgm,argv[1]);//復(fù)制argv[1]地址以null為退出字符的存儲器區(qū)塊到另一個存 儲器區(qū)塊品pgm內(nèi) if(strchr(pgm,'.')==NULL) strcat(pgm,".tny");/

15、/把.tyn文件所指字符串添加到pgm結(jié)尾處并添加'\0'。 source=fopen(pgm,"r");//以只讀的方式打開pgm文件,并將指向pgm文件的 指針返回給source if(source==NULL) {fprintf(stderr,"File%snotfound\n",pgm); exit(1);//如果源代碼文件為空,打印顯示信息并退出 } listing=stdout;/*sendlistingtoscreen清單發(fā)送到屏幕*/ fprintf(listing,"\nTINYCOMPILATION:%s\n",pgm);//答應(yīng)顯示語句 #ifNO_PA

16、RSE while(getToken()!=ENDFILE);//如果輸入流沒有結(jié)束就繼續(xù)進(jìn)行循環(huán),直至結(jié)束 #else syntaxTree=parse();//調(diào)用prase()函數(shù)構(gòu)造語法樹 if(TraceParse){ fprintf(listing,"\nSyntaxtree:\n"); printTree(syntaxTree);//如果語法分析追蹤標(biāo)志為TRUE且沒有語法錯誤,則將生 成的語法樹輸出到屏幕 } #if!NO_ANALYZE if(!Error) {if(TraceAnalyze)fprintf(listing,"\nBuildingSymb

17、olTable...\n"); buildSymtab(syntaxTree);//輸出含符號表信息的語法樹 if(TraceAnalyze)fprintf(listing,"\nCheckingTypes...\n"); typeCheck(syntaxTree);//輸出含類型檢查的語法樹 if(TraceAnalyze)fprintf(listing,"\nTypeCheckingFinished\n");//打印結(jié)束信息 } #if!NO_CODE if(!Error) {char*codefile; intfnlen=strcspn(pgm,"."); codef

18、ile=(char*)calloc(fnlen+4,sizeof(char)); strncpy(codefile,pgm,fnlen); strcat(codefile,".tm");//將源文件名,去掉擴(kuò)展名,添加擴(kuò)展名.tm code=fopen(codefile,"w");//以只寫的方式打開目標(biāo)匯編代碼文件,并返回地址給 codez指針 if(code==NULL) {printf("Unabletoopen%s\n",codefile); exit(1);//如果code指針為空,打印顯示信息并退出 } codeGen(syntaxTree,codefile);/

19、/目標(biāo)代碼生成 fclose(code); } #endif #endif #endif//結(jié)束之前對應(yīng)的條件編譯fclose(source);//關(guān)閉源代碼文件return0; } GLOBALS.H /****************************************************/ /*File:globals.h*/ /*GlobaltypesandvarsforTINYcompiler*/ /*mustcomebeforeotherincludefiles*/ /*CompilerConstruction:PrinciplesandPr

20、actice*/ /*KennethC.Louden*//****************************************************/ #ifndef_GLOBALS_H_ #define_GLOBALS_H_//宏定義 #include #include #include #include//頭文件引用 #ifndefFALSE #defineFALSE0//定義FALSE為0 #endif #ifndefTRUE #defineTRUE1//定義TRUE為1

21、#endif /*MAXRESERVED=thenumberofreservedwords*/ #defineMAXRESERVED8//定義了關(guān)鍵字個數(shù)8個 typedefenum /*book-keepingtokens*/ {ENDFILE,ERROR, /*reservedwords*/ IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE, /*multicharactertokens*/ ID,NUM, /*specialsymbols*/ ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAR

22、EN,SEMI }TokenType;//定義了關(guān)鍵字,運算符等內(nèi)容的枚舉值 externFILE*source;/*sourcecodetextfile externFILE*listing;/*listingoutputtextfile 源代碼地址 */ 顯示分析過程的文件的地址 */ 目標(biāo)匯編代碼文件的地址 */ externFILE*code;/*codetextfileforTMsimulatorexternintlineno;/*sourcelinenumberforlisting*//****************************************

23、**********/ /*********** Syntaxtreeforparsing************//**************************************************/typedefenum{StmtK,ExpK}NodeKind;//定義了語句類型的枚舉值,這個決定樹的節(jié) 點 typedefenum{IfK,RepeatK,AssignK,ReadK,WriteK}StmtKind; typedefenum{OpK,ConstK,IdK}ExpKind; /*ExpTypeisusedfortypechecking*/ typ

24、edefenum{Void,Integer,Boolean}ExpType;//定義了變量類型 #defineMAXCHILDREN3//定義了最大子節(jié)點 typedefstructtreeNode//定義了樹的節(jié)點 {structtreeNode*child[MAXCHILDREN]; structtreeNode*sibling; intlineno; NodeKindnodekind; union{StmtKindstmt;ExpKindexp;}kind; union{TokenTypeop; intval; char*name;}attr; ExpTypetyp

25、e;/*fortypecheckingofexps*/ }TreeNode; /*********** Flags for tracing ************/ /**************************************************/ /**************************************************/ /*EchoSource=TRUEcausesthesourceprogramto * beechoedtothelistingfilewithlinenumbers * duringparsing

26、* / externintEchoSource; /*TraceScan=TRUEcausestokeninformationtobe * printedtothelistingfileaseachtokenis * recognizedbythescanner * / externintTraceScan; /*TraceParse=TRUEcausesthesyntaxtreetobe * printedtothelistingfileinlinearizedform * (usingindentsforchildren) * / externintTracePars

27、e; /*TraceAnalyze=TRUEcausessymboltableinserts * andlookupstobereportedtothelistingfile */ externintTraceAnalyze; /*TraceCode=TRUEcausescommentstobewritten * totheTMcodefileascodeisgenerated */ externintTraceCode; /*Error=TRUEpreventsfurtherpassesifanerroroccurs*/externintError; #endif SC

28、AN.C /*詞法掃描程序*/ #include"globals.h" #include"util.h" #include"scan.h" /*定義的狀態(tài)*/ typedefenum { START,/*初始狀態(tài)*/ INASSIGN,/*進(jìn)入到賦值狀態(tài)*/ INCOMMENT,/*進(jìn)入到注釋狀態(tài)*/ INNUM,/*進(jìn)入到數(shù)字狀態(tài)*/ INID,/*進(jìn)入到標(biāo)志符狀態(tài)*/ DONE/*狀態(tài)結(jié)束*/ }StateType; /*每當(dāng)語法分析程序需要一個單詞時,就調(diào)用該子程序,得到(類別碼,單詞的值)*//*語義標(biāo)識符和保留字*/ chartokenString[M

29、AXTOKENLEN+1]; /*BUFLEN=源代碼的輸入緩沖長度*/ #defineBUFLEN256 staticcharlineBuf[BUFLEN];/*當(dāng)前行*/ staticintlinepos=0;/*在linebuf中的當(dāng)前位置*/ staticintbufsize=0;/*緩沖區(qū)的字符串當(dāng)前大小*/ staticintEOF_flag=FALSE;/*如果讀入下一個字符出錯,設(shè)置EOF_flag為假。*/ /*從linebuffer中讀取下一個非空白字符,如果讀完,則讀入新行。*/staticintgetNextChar(void){if(!(linepos<

30、bufsize)) {lineno++; if(fgets(lineBuf,BUFLEN-1,source)) {if(EchoSource)fprintf(listing,"%4d:%s",lineno,lineBuf); bufsize=strlen(lineBuf); linepos=0; returnlineBuf[linepos++]; } else {EOF_flag=TRUE; returnEOF; } } elsereturnlineBuf[linepos++]; } /*如果讀入下一個字符出錯,在linebuf中回退一個字符。*/ static

31、voidungetNextChar(void) {if(!EOF_flag)linepos--;} /*保留字的查找表*/ staticstruct {char*str; TokenTypetok; }reservedWords[MAXRESERVED] ={{"if",IF},{"then",THEN},{"else",ELSE},{"end",END}, {"repeat",REPEAT},{"until",UNTIL},{"read",READ},{"write",WRITE}}; /*標(biāo)識符是否是保留字*/ staticTokenTypereservedLookup

32、(char*s) {inti; for(i=0;i

33、e=START; /*表示保存到tokenstring的flag*/ intsave; while(state!=DONE) { intc=getNextChar();/*從輸入buf中讀入一個字符*/ save=TRUE; switch(state) { caseSTART: if(isdigit(c)) state=INNUM; elseif(isalpha(c))/*判斷字母*/ state=INID; elseif(c==':') state=INASSIGN; elseif((c=='')||(c=='/t')||(c=='/n')) save=FA

34、LSE; elseif(c=='{') { save=FALSE; state=INCOMMENT; }else { state=DONE;switch(c){caseEOF: save=FALSE; currentToken=ENDFILE; break; case'=': currentToken=EQ; break; case'<': currentToken=LT;break; case'+': currentToken=PLUS;break; case'-': currentToken=MINUS;break; case currentTok

35、en=TIMES;break; case'/': currentToken=OVER;break; case'(': currentToken=LPAREN; break; case')': currentToken=RPAREN; break; case';': currentToken=SEMI; break; default: currentToken=ERROR; break; } } break; caseINCOMMENT: save=FALSE; if(c==EOF) { state=DONE; currentToken=ENDFIL

36、E; } elseif(c=='}')state=START; break; caseINASSIGN: state=DONE; if(c=='=') currentToken=ASSIGN; else{ /*在輸入中備份*/ ungetNextChar(); save=FALSE; currentToken=ERROR; } break; caseINNUM: if(!isdigit(c)) { /*在輸入中備份*/ ungetNextChar(); save=FALSE; state=DONE; currentToken=NUM; } bre

37、ak; caseINID: if(!isalpha(c)) { /*在輸入中備份*/ ungetNextChar(); save=FALSE; state=DONE; currentToken=ID; } break; caseDONE: default:/*應(yīng)該不會執(zhí)行*/ fprintf(listing,"ScannerBug:state=%d/n",state); state=DONE; currentToken=ERROR; break; } if((save)&&(tokenStringIndex<=MAXTOKENLEN)) { tokenS

38、tring[tokenStringIndex++]=(char)c; } /*解析單詞結(jié)束*/ if(state==DONE) { tokenString[tokenStringIndex]='/0'; if(currentToken==ID) { currentToken=reservedLookup(tokenString); } } } if(TraceScan) { fprintf(listing,"/t%d:",lineno); printToken(currentToken,tokenString); } returncurrentToken;

39、} SCAN.H/****************************************************//*對于tiny編譯器的掃描程序接口*//****************************************************/#ifndef_SCAN_H_ #define_SCAN_H_ /*maxtokenlen是token的最大大小*/ #defineMAXTOKENLEN40 /*tokenString數(shù)組保存每個token*/ externchartokenString[MAXTOKENLEN+1]; /*f函數(shù)getToke

40、n返回源程序中的下一個token*/ TokenTypegetToken(void); #endif UTIL.H /****************************************************/ */ /*File:util.h /*UtilityfunctionsfortheTINYcompiler*/ /*CompilerConstruction:PrinciplesandPractice*/ */ /*KennethC.Louden/****************************************************/

41、 #ifndef_UTIL_H_ #define_UTIL_H_ /*ProcedureprintTokenprintsatoken * anditslexemetothelistingfile * / voidprintToken(TokenType,constchar*); /*FunctionnewStmtNodecreatesanewstatement * nodeforsyntaxtreeconstruction * / TreeNode*newStmtNode(StmtKind); /*FunctionnewExpNodecreatesanewexpressi

42、on * nodeforsyntaxtreeconstruction * / TreeNode*newExpNode(ExpKind); /*FunctioncopyStringallocatesandmakesanew * copyofanexistingstring * / char*copyString(char*); /*procedureprintTreeprintsasyntaxtreetothe * listingfileusingindentationtoindicatesubtrees * / voidprintTree(TreeNode*); #en

43、dif UTIL.C/****************************************************/ */ /*File:util.c /*Utilityfunctionimplementation*/ /*fortheTINYcompiler*/ /*CompilerConstruction:PrinciplesandPractice*/ */ /*KennethC.Louden/****************************************************/ #include"globals.h #include"u

44、til.h" /*ProcedureprintTokenprintsatoken * anditslexemetothelistingfile 此函數(shù)輸出一個標(biāo)號 */voidprintToken(TokenTypetoken,constchar*tokenString)// 和一個詞素 {switch(token) {caseIF: caseTHEN: caseELSE: caseEND: caseREPEAT: caseUNTIL: caseREAD: caseWRITE: fprintf(listing, "reservedword:%s\n",toke

45、nString); break; caseASSIGN:fprintf(listing,":=\n");break; caseLT:fprintf(listing,"<\n");break; caseEQ:fprintf(listing,"=\n");break; caseLPAREN:fprintf(listing,"(\n");break; caseRPAREN:fprintf(listing,")\n");break; caseSEMI:fprintf(listing,";\n");break; casePLUS:fprintf(listing,"+\n");break;

46、 caseMINUS:fprintf(listing,"-\n");break; caseTIMES:fprintf(listing,"*\n");break; caseOVER:fprintf(listing,"/\n");break; caseENDFILE:fprintf(listing,"EOF\n");break; caseNUM: fprintf(listing, "NUM,val=%s\n",tokenString); break; caseID: fprintf(listing, "ID,name=%s\n",tokenString); break;

47、caseERROR: fprintf(listing, "ERROR:%s\n",tokenString); break; default:/*shouldneverhappen*/ fprintf(listing,"Unknowntoken:%d\n",token); /*FunctionnewStmtNodecreatesanewstatement * nodeforsyntaxtreeconstruction * / TreeNode*newStmtNode(StmtKindkind)//此函數(shù)創(chuàng)建一個有關(guān)此法樹的聲明節(jié)點 {TreeNode*t=(TreeNode*

48、)malloc(sizeof(TreeNode)); inti; if(t==NULL) fprintf(listing,"Outofmemoryerroratline%d\n",lineno); else{ for(i=0;ichild[i]=NULL; t->sibling=NULL; t->nodekind=StmtK; t->kind.stmt=kind; t->lineno=lineno; } returnt; } /*FunctionnewExpNodecreatesanewexpression *nodefors

49、yntaxtreeconstruction */ TreeNode*newExpNode(ExpKindkind)//此函數(shù)創(chuàng)建一個有關(guān)此法樹的表述節(jié)點 {TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode)); inti; if(t==NULL) fprintf(listing,"Outofmemoryerroratline%d\n",lineno); else{ for(i=0;ichild[i]=NULL; t->sibling=NULL; t->nodekind=ExpK; t->kin

50、d.exp=kind; t->lineno=lineno; t->type=Void; } returnt; } /*FunctioncopyStringallocatesandmakesanew *copyofanexistingstring */ char*copyString(char*s)//此函數(shù)分配和創(chuàng)建一個新的已存在樹的復(fù)制 {intn; char*t; if(s==NULL)returnNULL; n=strlen(s)+1; t=malloc(n); if(t==NULL) fprintf(listing,"Outofmemoryerrorat

51、line%d\n",lineno); elsestrcpy(t,s); returnt; } /*VariableindentnoisusedbyprintTreeto * storecurrentnumberofspacestoindent */ staticindentno=0;//此變量被函數(shù)printTree用來存儲要縮進(jìn)的空格個數(shù) /*macrostoincrease/decreaseindentation*/ #defineINDENTindentno+=2//這個宏增加縮進(jìn)空格個數(shù) #defineUNINDENTindentno-=2//這個宏減少縮進(jìn)空格個數(shù)

52、 /*printSpacesindentsbyprintingspaces*/ staticvoidprintSpaces(void)//此函數(shù)通過打印空格縮進(jìn) {inti; for(i=0;i

53、ree!=NULL){ printSpaces(); if(tree->nodekind==StmtK) {switch(tree->kind.stmt){ caseIfK: fprintf(listing,"If\n"); break; caseRepeatK: fprintf(listing,"Repeat\n"); break; caseAssignK: fprintf(listing,"Assignto:%s\n",tree->attr.name);break; caseReadK: fprintf(listing,"Read:%s\n",tree->attr

54、.name);break; caseWriteK: fprintf(listing,"Write\n"); break; default: fprintf(listing,"UnknownExpNodekind\n"); break; } } elseif(tree->nodekind==ExpK) {switch(tree->kind.exp){ caseOpK: fprintf(listing,"Op:"); printToken(tree->attr.op,"\0"); break; caseConstK: fprintf(listing,"Const:%

55、d\n",tree->attr.val); break; caseIdK: fprintf(listing,"Id:%s\n",tree->attr.name); break; default: fprintf(listing,"UnknownExpNodekind\n"); break; } } elsefprintf(listing,"Unknownnodekind\n"); for(i=0;ichild[i]); tree=tree->sibling; } UNINDENT; }

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲