TINY部分源碼分析報(bào)告

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

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

0 積分

下載資源

資源描述:

《TINY部分源碼分析報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《TINY部分源碼分析報(bào)告(23頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、精品資料TINY源碼分析一、文件概述MAIN.C:主函數(shù)GLOBALS.H:全局定義的文件SCAN.C/SCAN.H:詞法分析PARSE.C/PARSE.H:語(yǔ)法分析UTIL.C/UTIL.H:構(gòu)造樹(shù)SYMTAB.C/SYMTAB.H:符號(hào)表CGEN.C/CGEN.H:生成匯編代碼CODE.C/CODE.H:這個(gè)只是用來(lái)把分析過(guò)程輸出到屏幕的.二、各個(gè)文件的分析1.MAIN.C:主要有三個(gè)FILE*句柄:source-源代碼文件。listing-顯示分析過(guò)程的文件,這里重定向到stdout。code-目標(biāo)匯編代碼文件。從該文件中可知程序運(yùn)行的流程:檢查參數(shù)正確否(tiny.exefilenam

2、e)-構(gòu)造語(yǔ)法樹(shù)(調(diào)用parse函數(shù))-根據(jù)語(yǔ)法樹(shù)生成代碼(調(diào)用codeGen函數(shù),該函數(shù)又調(diào)用cGen函數(shù)。2.GLOBALS.H:定義了關(guān)鍵字個(gè)數(shù)8個(gè)。定義了關(guān)鍵字,運(yùn)算符等內(nèi)容的枚舉值。定義了語(yǔ)句類型的枚舉值,這個(gè)決定樹(shù)的結(jié)點(diǎn)??删庉嬓薷亩x了變量類型(也就三種,void,integer,boolean)。定義了樹(shù)的節(jié)點(diǎn)-這個(gè)最重要了!其結(jié)構(gòu)如下所示:typedefstructtreeNodestructtreeNode*childMAXCHILDREN;structtreeNode*sibling;intlineno;NodeKindnodekind;unionStmtKindstmt

3、;ExpKindexp;kind;unionTokenTypeop;intval;char*name;attr;ExpTypetype;/*fortypecheckingofexps*/TreeNode;3.UTIL.C/UTIL.H主要函數(shù)TreeNode*newStmtNode(StmtKindkind)此函數(shù)創(chuàng)建一個(gè)有關(guān)語(yǔ)法樹(shù)的聲明節(jié)點(diǎn)TreeNode*newExpNode(ExpKindkind)此函數(shù)創(chuàng)建一個(gè)有關(guān)語(yǔ)法樹(shù)的表述節(jié)點(diǎn)char*copyString(char*s)此函數(shù)分配和創(chuàng)建一個(gè)新的已存在樹(shù)的復(fù)制voidprintTree(TreeNode*tree)輸出一個(gè)語(yǔ)法樹(shù)這兩

4、個(gè)文件主要是關(guān)于語(yǔ)法樹(shù)的創(chuàng)建和輸出4.SCAN.c/SCAN.H主要有這么幾個(gè)函數(shù):staticintgetNextChar(void);staticvoidungetNextChar(void);staticTokenTypereservedLookup(char*s);TokenTypegetToken(void);reservedLookup函數(shù)是查找關(guān)鍵字的,在符號(hào)表中找。這里還定義了一個(gè)保存關(guān)鍵字的結(jié)構(gòu):staticstructchar*str;TokenTypetok;reservedWordsMAXRESERVEDif,IF,then,THEN,else,ELSE,end,END

5、,repeat,REPEAT,until,UNTIL,read,READ,write,WRITE;最重要的是getToken(void)函數(shù)。這個(gè)相當(dāng)于lex的功能,進(jìn)行詞法分析。也就是一個(gè)DFA,switch后面跟了一堆的case。其中g(shù)etNextChar(void)函數(shù)的思路,以下列出:staticintgetNextChar(void)if(!(linepos構(gòu)造語(yǔ)法樹(shù)(調(diào)用parse函數(shù))-根據(jù)語(yǔ)法樹(shù)生成代碼(調(diào)用codeGen函數(shù)),同時(shí)熟悉了編譯器是如何使用prase函數(shù)進(jìn)行語(yǔ)法樹(shù)的構(gòu)建以及語(yǔ)法樹(shù)生成代碼的轉(zhuǎn)化,最主要的是進(jìn)一步清晰了解到編譯器的構(gòu)造和運(yùn)行原理,加深了對(duì)課本知識(shí)的

6、運(yùn)用和拓展,感覺(jué)收獲很大!Main.c/*/*/*/*/*/*File:main.c/*MainprogramforTINYcompiler/*CompilerConstruction:PrinciplesandPractice/*KennethC.Louden/*/#include globals.h/* set NO_PARSE to TRUE to get a scanner-only compiler創(chuàng)建一個(gè)只掃描的編譯器*/#define NO_PARSE FALSE/* set NO_ANALYZE to TRUE to get a parser-only compiler時(shí)創(chuàng)建一

7、個(gè)只分析和掃描的編譯器*/#define NO_ANALYZE FALSENO_PARSE 為 true 時(shí)NO_ANALYZE 為 true/*setNO_CODEtoTRUEtogetacompilerthatdoesnot*generatecodeNO_CODE為true時(shí)創(chuàng)建一個(gè)執(zhí)行語(yǔ)義分析,但不生成代碼的編譯器*/#include util.h#if NO_PARSE #include scan.h #else#include parse.h #if !NO_ANALYZE #include analyze.h #if !NO_CODE #include cgen.h #endif#

8、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ù)處理語(yǔ)句符號(hào)/*allocateglobalvariables分配全局變量*/intlineno=0;FILE*source;/指針指向源代碼文件地址FILE*listing;/指針指向顯示分析過(guò)程的文件的地址FILE*code;/指針指向目標(biāo)匯編代碼文件的地址/*allocateandsettracingflags分配和設(shè)

9、置跟蹤標(biāo)志*/intEchoSource=FALSE;intTraceScan=FALSE;intTraceParse=FALSE;intTraceAnalyze=FALSE;intTraceCode=FALSE;intError=FALSE;/跟蹤標(biāo)志全部初始化為falsemain(intargc,char*argv)TreeNode*syntaxTree;charpgm120;/*sourcecodefilename*/if(argc!=2)fprintf(stderr,usage:%sn,argv0);exit(1);/如果argv不為2,打印顯示信息并退出strcpy(pgm,argv

10、1);/復(fù)制argv1地址以null為退出字符的存儲(chǔ)器區(qū)塊到另一個(gè)存儲(chǔ)器區(qū)塊品pgm內(nèi)if(strchr(pgm,.)=NULL)strcat(pgm,.tny);/把.tyn文件所指字符串添加到pgm結(jié)尾處并添加0。source=fopen(pgm,r);/以只讀的方式打開(kāi)pgm文件,并將指向pgm文件的指針?lè)祷亟osourceif(source=NULL)fprintf(stderr,File%snotfoundn,pgm);exit(1);/如果源代碼文件為空,打印顯示信息并退出listing=stdout;/*sendlistingtoscreen清單發(fā)送到屏幕*/fprintf(lis

11、ting,nTINYCOMPILATION:%sn,pgm);/答應(yīng)顯示語(yǔ)句#ifNO_PARSEwhile(getToken()!=ENDFILE);/如果輸入流沒(méi)有結(jié)束就繼續(xù)進(jìn)行循環(huán),直至結(jié)束#elsesyntaxTree=parse();/調(diào)用prase()函數(shù)構(gòu)造語(yǔ)法樹(shù)if(TraceParse)fprintf(listing,nSyntaxtree:n);printTree(syntaxTree);/如果語(yǔ)法分析追蹤標(biāo)志為TRUE且沒(méi)有語(yǔ)法錯(cuò)誤,則將生成的語(yǔ)法樹(shù)輸出到屏幕#if!NO_ANALYZEif(!Error)if(TraceAnalyze)fprintf(listing,n

12、BuildingSymbolTable.n);buildSymtab(syntaxTree);/輸出含符號(hào)表信息的語(yǔ)法樹(shù)if(TraceAnalyze)fprintf(listing,nCheckingTypes.n);typeCheck(syntaxTree);/輸出含類型檢查的語(yǔ)法樹(shù)if(TraceAnalyze)fprintf(listing,nTypeCheckingFinishedn);/打印結(jié)束信息#if!NO_CODEif(!Error)char*codefile;intfnlen=strcspn(pgm,.);codefile=(char*)calloc(fnlen+4,siz

13、eof(char);strncpy(codefile,pgm,fnlen);strcat(codefile,.tm);/將源文件名,去掉擴(kuò)展名,添加擴(kuò)展名.tmcode=fopen(codefile,w);/以只寫的方式打開(kāi)目標(biāo)匯編代碼文件,并返回地址給codez指針if(code=NULL)printf(Unabletoopen%sn,codefile);exit(1);/如果code指針為空,打印顯示信息并退出codeGen(syntaxTree,codefile);/目標(biāo)代碼生成fclose(code);#endif#endif#endif/結(jié)束之前對(duì)應(yīng)的條件編譯fclose(sourc

14、e);/關(guān)閉源代碼文件return0;GLOBALS.H/*/*File:globals.h*/*GlobaltypesandvarsforTINYcompiler*/*mustcomebeforeotherincludefiles*/*CompilerConstruction:PrinciplesandPractice*/*KennethC.Louden*/*/#ifndef_GLOBALS_H_#define_GLOBALS_H_/宏定義#include#include#include#include/頭文件引用#ifndefFALSE#defineFALSE0/定義FALSE為0#end

15、if#ifndefTRUE#defineTRUE1/定義TRUE為1#endif/*MAXRESERVED=thenumberofreservedwords*/#defineMAXRESERVED8/定義了關(guān)鍵字個(gè)數(shù)8個(gè)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,L

16、PAREN,RPAREN,SEMITokenType;/定義了關(guān)鍵字,運(yùn)算符等內(nèi)容的枚舉值externFILE*source;/*sourcecodetextfileexternFILE*listing;/*listingoutputtextfile源代碼地址*/顯示分析過(guò)程的文件的地址*/目標(biāo)匯編代碼文件的地址 */externFILE*code;/*codetextfileforTMsimulatorexternintlineno;/*sourcelinenumberforlisting*/*/*Syntaxtreeforparsing*/*/typedefenumStmtK,ExpKNo

17、deKind;/定義了語(yǔ)句類型的枚舉值,這個(gè)決定樹(shù)的節(jié)點(diǎn)typedefenumIfK,RepeatK,AssignK,ReadK,WriteKStmtKind;typedefenumOpK,ConstK,IdKExpKind;/*ExpTypeisusedfortypechecking*/typedefenumVoid,Integer,BooleanExpType;/定義了變量類型#defineMAXCHILDREN3/定義了最大子節(jié)點(diǎn)typedefstructtreeNode/定義了樹(shù)的節(jié)點(diǎn)structtreeNode*childMAXCHILDREN;structtreeNode*sibl

18、ing;intlineno;NodeKindnodekind;unionStmtKindstmt;ExpKindexp;kind;unionTokenTypeop;intval;char*name;attr;ExpTypetype;/*fortypecheckingofexps*/TreeNode;/*Flags for tracing*/*/*/*EchoSource=TRUEcausesthesourceprogramto* beechoedtothelistingfilewithlinenumbers* duringparsing* /externintEchoSource;/*Trac

19、eScan=TRUEcausestokeninformationtobe* printedtothelistingfileaseachtokenis* recognizedbythescanner* /externintTraceScan;/*TraceParse=TRUEcausesthesyntaxtreetobe* printedtothelistingfileinlinearizedform* (usingindentsforchildren)* /externintTraceParse;/*TraceAnalyze=TRUEcausessymboltableinserts* andl

20、ookupstobereportedtothelistingfile*/externintTraceAnalyze;/*TraceCode=TRUEcausescommentstobewritten* totheTMcodefileascodeisgenerated*/externintTraceCode;/*Error=TRUEpreventsfurtherpassesifanerroroccurs*/externintError;#endifSCAN.C/*詞法掃描程序*/#includeglobals.h#includeutil.h#includescan.h/*定義的狀態(tài)*/typed

21、efenumSTART,/*初始狀態(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)語(yǔ)法分析程序需要一個(gè)單詞時(shí),就調(diào)用該子程序,得到(類別碼,單詞的值)*/*語(yǔ)義標(biāo)識(shí)符和保留字*/chartokenStringMAXTOKENLEN+1;/*BUFLEN=源代碼的輸入緩沖長(zhǎng)度*/#defineBUFLEN256staticcharlineBufBUFLEN;/*當(dāng)前行*/staticintlinepos=0;/*在linebuf中的當(dāng)前位

22、置*/staticintbufsize=0;/*緩沖區(qū)的字符串當(dāng)前大小*/staticintEOF_flag=FALSE;/*如果讀入下一個(gè)字符出錯(cuò),設(shè)置EOF_flag為假。*/*從linebuffer中讀取下一個(gè)非空白字符,如果讀完,則讀入新行。*/staticintgetNextChar(void)if(!(lineposbufsize)lineno+;if(fgets(lineBuf,BUFLEN-1,source)if(EchoSource)fprintf(listing,%4d:%s,lineno,lineBuf);bufsize=strlen(lineBuf);linepos=0

23、;returnlineBuflinepos+;elseEOF_flag=TRUE;returnEOF;elsereturnlineBuflinepos+;/*如果讀入下一個(gè)字符出錯(cuò),在linebuf中回退一個(gè)字符。*/staticvoidungetNextChar(void)if(!EOF_flag)linepos-;/*保留字的查找表*/staticstructchar*str;TokenTypetok;reservedWordsMAXRESERVED=if,IF,then,THEN,else,ELSE,end,END,repeat,REPEAT,until,UNTIL,read,READ,

24、write,WRITE;/*標(biāo)識(shí)符是否是保留字*/staticTokenTypereservedLookup(char*s)inti;for(i=0;iMAXRESERVED;i+)if(!strcmp(s,reservedWordsi.str)returnreservedWordsi.tok;returnID;/*掃描儀的主要功能函數(shù)gettoken返回源文件中下一個(gè)標(biāo)記*/TokenTypegetToken(void)/*存入tokenstring的位置*/inttokenStringIndex=0;/*保存當(dāng)前要返回的token;*/TokenTypecurrentToken;當(dāng)前狀態(tài)S

25、tateTypestate=START;/*表示保存到tokenstring的flag*/intsave;while(state!=DONE)intc=getNextChar();/*從輸入buf中讀入一個(gè)字符*/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=FALSE;elseif(c=)save=FALSE;state=INCOMMENT;e

26、lsestate=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;casecurrentToken=TIMES;break;case/:currentToken=OVER;break;case(:currentToken=LPAREN;break;case):currentToken=RPARE

27、N;break;case;:currentToken=SEMI;break;default:currentToken=ERROR;break;break;caseINCOMMENT:save=FALSE;if(c=EOF)state=DONE;currentToken=ENDFILE;elseif(c=)state=START;break;caseINASSIGN:state=DONE;if(c=)currentToken=ASSIGN;else/*在輸入中備份*/ungetNextChar();save=FALSE;currentToken=ERROR;break;caseINNUM:if(

28、!isdigit(c)/*在輸入中備份*/ungetNextChar();save=FALSE;state=DONE;currentToken=NUM;break;caseINID:if(!isalpha(c)/*在輸入中備份*/ungetNextChar();save=FALSE;state=DONE;currentToken=ID;break;caseDONE:default:/*應(yīng)該不會(huì)執(zhí)行*/fprintf(listing,ScannerBug:state=%d/n,state);state=DONE;currentToken=ERROR;break;if(save)&(tokenSt

29、ringIndex=MAXTOKENLEN)tokenStringtokenStringIndex+=(char)c;/*解析單詞結(jié)束*/if(state=DONE)tokenStringtokenStringIndex=/0;if(currentToken=ID)currentToken=reservedLookup(tokenString);if(TraceScan)fprintf(listing,/t%d:,lineno);printToken(currentToken,tokenString);returncurrentToken;SCAN.H/*/*對(duì)于tiny編譯器的掃描程序接口*

30、/*/#ifndef_SCAN_H_#define_SCAN_H_/*maxtokenlen是token的最大大小*/#defineMAXTOKENLEN40/*tokenString數(shù)組保存每個(gè)token*/externchartokenStringMAXTOKENLEN+1;/*f函數(shù)getToken返回源程序中的下一個(gè)token*/TokenTypegetToken(void);#endifUTIL.H/*/*/*File:util.h/*UtilityfunctionsfortheTINYcompiler*/*CompilerConstruction:PrinciplesandPrac

31、tice*/*/*KennethC.Louden/*/#ifndef_UTIL_H_#define_UTIL_H_/*ProcedureprintTokenprintsatoken* anditslexemetothelistingfile* /voidprintToken(TokenType,constchar*);/*FunctionnewStmtNodecreatesanewstatement* nodeforsyntaxtreeconstruction* /TreeNode*newStmtNode(StmtKind);/*FunctionnewExpNodecreatesanewexp

32、ression* nodeforsyntaxtreeconstruction* /TreeNode*newExpNode(ExpKind);/*FunctioncopyStringallocatesandmakesanew* copyofanexistingstring* /char*copyString(char*);/*procedureprintTreeprintsasyntaxtreetothe* listingfileusingindentationtoindicatesubtrees* /voidprintTree(TreeNode*);#endifUTIL.C/*/*/*File

33、:util.c/*Utilityfunctionimplementation*/*fortheTINYcompiler*/*CompilerConstruction:PrinciplesandPractice*/*/*KennethC.Louden/*/#includeglobals.h#includeutil.h/*ProcedureprintTokenprintsatoken* anditslexemetothelistingfile此函數(shù)輸出一個(gè)標(biāo)號(hào)*/voidprintToken(TokenTypetoken,constchar*tokenString)/和一個(gè)詞素switch(tok

34、en)caseIF:caseTHEN:caseELSE:caseEND:caseREPEAT:caseUNTIL:caseREAD:caseWRITE:fprintf(listing,reservedword:%sn,tokenString);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);b

35、reak;caseSEMI:fprintf(listing,;n);break;casePLUS:fprintf(listing,+n);break;caseMINUS:fprintf(listing,-n);break;caseTIMES:fprintf(listing,*n);break;caseOVER:fprintf(listing,/n);break;caseENDFILE:fprintf(listing,EOFn);break;caseNUM:fprintf(listing,NUM,val=%sn,tokenString);break;caseID:fprintf(listing,

36、ID,name=%sn,tokenString);break;caseERROR:fprintf(listing,ERROR:%sn,tokenString);break;default:/*shouldneverhappen*/fprintf(listing,Unknowntoken:%dn,token);/*FunctionnewStmtNodecreatesanewstatement* nodeforsyntaxtreeconstruction* /TreeNode*newStmtNode(StmtKindkind)/此函數(shù)創(chuàng)建一個(gè)有關(guān)此法樹(shù)的聲明節(jié)點(diǎn)TreeNode*t=(TreeNo

37、de*)malloc(sizeof(TreeNode);inti;if(t=NULL)fprintf(listing,Outofmemoryerroratline%dn,lineno);elsefor(i=0;ichildi=NULL;t-sibling=NULL;t-nodekind=StmtK;t-kind.stmt=kind;t-lineno=lineno;returnt;/*FunctionnewExpNodecreatesanewexpression*nodeforsyntaxtreeconstruction*/TreeNode*newExpNode(ExpKindkind)/此函數(shù)

38、創(chuàng)建一個(gè)有關(guān)此法樹(shù)的表述節(jié)點(diǎn)TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode);inti;if(t=NULL)fprintf(listing,Outofmemoryerroratline%dn,lineno);elsefor(i=0;ichildi=NULL;t-sibling=NULL;t-nodekind=ExpK;t-kind.exp=kind;t-lineno=lineno;t-type=Void;returnt;/*FunctioncopyStringallocatesandmakesanew*copyofanexistingstring*/c

39、har*copyString(char*s)/此函數(shù)分配和創(chuàng)建一個(gè)新的已存在樹(shù)的復(fù)制intn;char*t;if(s=NULL)returnNULL;n=strlen(s)+1;t=malloc(n);if(t=NULL)fprintf(listing,Outofmemoryerroratline%dn,lineno);elsestrcpy(t,s);returnt;/*VariableindentnoisusedbyprintTreeto* storecurrentnumberofspacestoindent*/staticindentno=0;/此變量被函數(shù)printTree用來(lái)存儲(chǔ)要縮進(jìn)

40、的空格個(gè)數(shù)/*macrostoincrease/decreaseindentation*/#defineINDENTindentno+=2/這個(gè)宏增加縮進(jìn)空格個(gè)數(shù)#defineUNINDENTindentno-=2/這個(gè)宏減少縮進(jìn)空格個(gè)數(shù)/*printSpacesindentsbyprintingspaces*/staticvoidprintSpaces(void)/此函數(shù)通過(guò)打印空格縮進(jìn)inti;for(i=0;inodekind=StmtK)switch(tree-kind.stmt)caseIfK:fprintf(listing,Ifn);break;caseRepeatK:fprint

41、f(listing,Repeatn);break;caseAssignK:fprintf(listing,Assignto:%sn,tree-attr.name);break;caseReadK:fprintf(listing,Read:%sn,tree-attr.name);break;caseWriteK:fprintf(listing,Writen);break;default:fprintf(listing,UnknownExpNodekindn);break;elseif(tree-nodekind=ExpK)switch(tree-kind.exp)caseOpK:fprintf(listing,Op:);printToken(tree-attr.op,0);break;caseConstK:fprintf(listing,Const:%dn,tree-attr.val);break;caseIdK:fprintf(listing,Id:%sn,tree-attr.name);break;default:fprintf(listing,UnknownExpNodekindn);break;elsefprintf(listing,Unknownnodekindn);for(i=0;ichildi);tree=tree-sibling;UNINDENT;

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

相關(guān)資源

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

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

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


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