TINY部分源碼分析報告

上傳人:cjc****537 文檔編號:50763090 上傳時間:2022-01-22 格式:DOCX 頁數(shù):23 大小:89.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--目標匯編代碼文件

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ù)。這個相當于lex的功能,進行詞法分析。也就是一個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、 是,就當作表識符添加進去。在語法分析的時候也要用到,看變量有沒有聲明的時候用的。 三、實驗心得: 通過這次實驗,仔細地去查看和分析了TINY編譯器的部分源碼。了解到了編譯器的運 行:檢查參數(shù)正確否(tiny.exefilename)->構(gòu)造語法樹(調(diào)用parse函數(shù))->根據(jù)語法樹生 成代碼(調(diào)用codeGen函數(shù)),同時熟悉了編譯器是如何使用prase函數(shù)進行語法樹的構(gòu) 建以及語法樹生成代碼的轉(zhuǎ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;//指針指向目標匯編代碼文件的地址 /*allocateandsettracingflags分配和設(shè)置跟蹤標志*/ intEchoSource=FALSE; intTraceScan=FALSE; intTraceParse=FALSE; intTraceAnalyze=FALSE; intTraceCode=FALSE; intError=FALSE;//跟蹤標志全部初始化為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ù)進行循環(huán),直至結(jié)束 #else syntaxTree=parse();//調(diào)用prase()函數(shù)構(gòu)造語法樹 if(TraceParse){ fprintf(listing,"\nSyntaxtree:\n"); printTree(syntaxTree);//如果語法分析追蹤標志為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");//將源文件名,去掉擴展名,添加擴展名.tm code=fopen(codefile,"w");//以只寫的方式打開目標匯編代碼文件,并返回地址給 codez指針 if(code==NULL) {printf("Unabletoopen%s\n",codefile); exit(1);//如果code指針為空,打印顯示信息并退出 } codeGen(syntaxTree,codefile);/

19、/目標代碼生成 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 源代碼地址 */ 顯示分析過程的文件的地址 */ 目標匯編代碼文件的地址 */ 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,/*進入到賦值狀態(tài)*/ INCOMMENT,/*進入到注釋狀態(tài)*/ INNUM,/*進入到數(shù)字狀態(tài)*/ INID,/*進入到標志符狀態(tài)*/ DONE/*狀態(tài)結(jié)束*/ }StateType; /*每當語法分析程序需要一個單詞時,就調(diào)用該子程序,得到(類別碼,單詞的值)*//*語義標識符和保留字*/ chartokenString[M

29、AXTOKENLEN+1]; /*BUFLEN=源代碼的輸入緩沖長度*/ #defineBUFLEN256 staticcharlineBuf[BUFLEN];/*當前行*/ staticintlinepos=0;/*在linebuf中的當前位置*/ staticintbufsize=0;/*緩沖區(qū)的字符串當前大小*/ 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}}; /*標識符是否是保留字*/ 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ù)輸出一個標號 */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用來存儲要縮進的空格個數(shù) /*macrostoincrease/decreaseindentation*/ #defineINDENTindentno+=2//這個宏增加縮進空格個數(shù) #defineUNINDENTindentno-=2//這個宏減少縮進空格個數(shù)

52、 /*printSpacesindentsbyprintingspaces*/ staticvoidprintSpaces(void)//此函數(shù)通過打印空格縮進 {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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(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)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!