編譯原理的課程設計
《編譯原理的課程設計》由會員分享,可在線閱讀,更多相關《編譯原理的課程設計(48頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、二、課程設計正文 1. 編寫一個L-語言的詞法分析器,從左到右逐個字符地對L-語言的源程序進行掃描,產(chǎn)生一個個單詞符號的機內(nèi)表示。程序結構如圖L-1所示: scanner IsAlpha IsNumber IsChar Isother OutP
2、ut Error 圖 L-1 1.1 Sanner() 1. 功能:完成初始化,并循環(huán)調(diào)用子模塊,完成單詞的識別。 2. 算法描述如下 Void Scanner() { 調(diào)用ScannerInit()進行初始化; 讀入源程序的第一個字符; while (字符!=EOF) { if (字符= =字母)IsAlPha(); else if ( 字符= = 數(shù)字) IsNumber(); else if (字符= =‘’’)IsC
3、har(); else IsOther(); } 打印結束信息; 結束操作; } 1.2 IsAlPha() 1.功能:識別保留字和標識符。 2.算法描述如下: Void IsAlPha() {while(字符為字母或數(shù)字或’_’) { 記錄當前字符; 讀取下一字符; } 判斷當前字符串是否為保留字,并設置標志位h; 調(diào)用OutPut()函數(shù)輸出保留字或標識符; } 1.3 IsNumber() 1.功能:識別整數(shù)和實數(shù)。 2.算法描述如下:
4、 void IsNumber() { int flag=0; while (字符為數(shù)字) { 記錄當前字符; 讀取下一字符; If(字符為’.’號) { 記錄當前字符; flag=1; 讀下一字符; 跳出循環(huán); } } 記單詞編碼為整數(shù)的編碼(當前Token為整數(shù)); If(flag=1)
5、 { if (當前字符為數(shù)字) { 記錄當前數(shù)字; while(當前字符為數(shù)字) { 記錄字符; 讀取下一字符; } 記單詞編碼為實數(shù)的編碼(當前Token為實數(shù)); } else Error(2); if (當前字符為’.’)刪除余下數(shù)字; } if (當前字符為字母) 舍去后面的部分; OutPut(); } 1.4 IsChar() 1.功能:識別字符串。 2.算法描述: void IsChar() { for (;;;) { 讀取下一字符;
6、 現(xiàn)行Token為字符串; If(當前字符不是‘.’號) 記錄字符; Else break; } OutPut(); 讀下一字符; } 1.5 IsOther() 1.功能:識別其他單詞。 2.算法描述如下: void IsOther() { switch(當前字符) {對于不同字符做出不同處理,主要有: 1、符號內(nèi)容的記?。? 2、查出機內(nèi)碼; 3、調(diào)用OutPut()輸出至Token()文件;
7、 4、讀取下一字符; 5、對于錯誤符號將其刪除,并報錯;} } 1.6 ScannerInit() 1.功能:進行初始化,主要包括: 1、建立單詞編碼表、token表、符號表,并將它們清空。 2、打開單詞編碼文件,并將單詞編碼讀到編碼表中。 1.7 OutPut() 1.功能:輸出識別出的單詞,包括: 2.若單詞為標識符或常數(shù)再查,填符號表。 1.8 Error() 1.功能:判斷錯誤原因。 2.在由詞法分析程序?qū)語言源程序分析產(chǎn)生的token,符號表文件的基礎上,從完成語法語義分析,并產(chǎn)生相應的中間代碼-四元式序
8、列。 2.1 paser() 1.功能:主模塊,完成初始化,并調(diào)用復合語句分析模塊和說明語句分析模塊,完成分析任務。 2.算法描述如下: void paser() { 初始化; 從Token文件讀取第一個單詞; if (單詞= =program) { 讀取下一單詞; if (單詞= =標識符) { 讀取下一單詞; if(單詞為‘;’) { 行數(shù)加一;
9、讀取下一單詞; if (單詞為var) declear( ); if (單詞為begin) { S_Begin(); if (code 不是等于號) Error(49); } else 出錯處理; } else 出錯處理; } else出錯處理; } else 出錯處理; 2.2 S_Begin() 1.功能:完成復合語句的分析。 2.算法描述 S_
10、Begin() { if (當前字符為begin) { 讀取下一字符; 調(diào)用L_Analize(); if(當前字符為end) 結束; else 非正常結束,返回0; } 讀取下一字符; 返回; } 2.3 L_Analize() 1.功能:完成語句序列分析。 2.算法描述 L_Analize() { int rtn; switch(當前字符) { case IF:調(diào)用S_IF()函數(shù);break;
11、 case BEGIN :調(diào)用S_Begin()函數(shù);braek; case 標識符:調(diào)用 S_Let()函數(shù);break; case WHILE:調(diào)用 S_While();break; } if (當前字符為‘:’) { 行數(shù)加一; 讀取下一字符; 遞歸調(diào)用L_Analize() } else return rtn; } 2.4 S_Let() 1.功能:完成賦值語句的分析。 2.算法分析 S_Let(int a) { if (當前字符為標識符) { if
12、(需要記錄變量的地址) 記錄賦值變量的地址; 讀取下一個單詞; if(當前單詞為賦值號) { 調(diào)用表達式分析函數(shù)L_Analize(); if(表達式正確) 生成賦值句四元式; } } else 賦值句出錯; return四元式序號; } 2.5 S_IF() 1.功能:完成條件語句的分析。 2.算法描述: Int S_IF() { int a; int rtn=0; 定義一個真出口True_ad
13、dress和一個假出口Flase_address; if(當前單詞為if) { 布爾表達式初始化; 調(diào)用布爾表達式分析函數(shù)B_Analize(); rtn=布爾表達式的四元式首址; 產(chǎn)生無條件跳轉(zhuǎn)四元式; if (當前單詞為then) { 讀取下一單詞; switch(當前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函
14、數(shù);braek; case 標識符:調(diào)用 S_Let()函數(shù);break; case WHILE:調(diào)用 S_While();break; } BackPatch(); if(當前單詞為else) { 讀取下一單詞; switch(當前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函數(shù);braek;
15、 case 標識符:調(diào)用 S_Let()函數(shù);break; case WHILE:調(diào)用 S_While();break; } BackPatch(); } else rtn; } else 報錯;(缺少then) } rtn; } 2.6 S_While() 1.功能:完成while循環(huán)語句的分析。 2.算法描述; int S_While() { int rtn=0;boor_value,True_address,False_address; if (當
16、前單詞為while) { rtn=布爾表達式分析函數(shù)B_Analize(); boor_value=布爾表達式值地址; 產(chǎn)生跳轉(zhuǎn)四元式; if(當前單詞為do) { 讀取下一單詞; switch(當前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函數(shù);braek; case 標識符:調(diào)用 S_Let()函數(shù);bre
17、ak; case WHILE:調(diào)用 S_While();break; } BackPatch(); BackPatch(); } else 出錯,缺少do; } return rtn; } 2.7 gen() 該函數(shù)形成一個四元式,并將其輸出至四元式文件。 2.8 E_Analize() 1.該函數(shù)是算術分析表達式的主模塊,它調(diào)用算術表達式的子模塊,采用遞歸下降分析法完成算術表達式的分析。 2.算術表達式的各個子模塊: a.E_Init()將算術表達式讀入分析棧; b.
18、int E_AddSub()完成E->TE1|T的分析; c.int E1_AddSub(int a) 完成E1->+TE1|-TE1|^ d.T_MulDiv() 完成T->FT1|F的分析; e.T1_MulDiv(int a) 完成T1->*FT1|/FT1|^; f.F_Number() 完成F->i|(E)的分析; 2.9 B_Analize() 1.布爾表達式分析的主模塊,調(diào)用其他布爾表達式的子模塊,采用遞歸下降分析法完成布爾表達式的分析。并返回該布爾表達式的首個四元式地址。 a.B_OR()完成B->L
19、B|L的分析; b.B1_OR(int a) 完成B1->orLB1|^的分析; c.L_AND() 完成L->ML1|M的分析; d.L1_AND()完成L1->andM1|^的分析; e.M_NOT()完成M->notM|K的分析; f.K_END()完成K->i|false|true|(B)的分析; g.K_CMP()完成K->iSi,S-><>|=|<=|>=|>|<的分析。 三、課程設計總結 1、 實驗中遇到的問題 詞法分析器程序中要讀入一個單詞編碼文件,但是文件的格式在編寫的時候和程序有點
20、差異,因而導致輸出結果再三的錯誤。語法/語義分析器中,在修改符號表時,出現(xiàn)錯誤,最終沒有的到正確結果。 2、 對實驗原理有更深的理解 通過該課程設計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務,熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程,構造工具及其相關的技術對課本上的知識有了更深的理解,課本上的知識師機械的,表面的.通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。 3、 對該理論在實踐中的應用有深刻的理解 通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機上實現(xiàn),知道和理解了該理論在計算機中是
21、怎樣執(zhí)行的,對該理論在實踐中的應用有深刻的理解。 四、參考文獻 [1] 賀訊. 編譯方法學習指導與實踐.北京:機械工業(yè)出版社, 第一版. 2004年8月。 五、附錄 1.單詞編碼文件ni.txt and 1 or 11 begin 2 program 12 bool 3 real 13 + 23 <= 33 do 4 then 14 - 24 < 34 else 5 true 15 * 25 <> 35 end 6 var 16 / 26 > 36 false 7 while 17 . 27
22、
>= 37
if 8
標識符 18
, 28
integer 9
整數(shù) 19
: 29
not 10
實數(shù) 20
; 30
( 21
:= 31
) 22
= 32
char 38
2.測試代碼文件11.txt
program abc;
var a:real;
begin
if a<22.2 then x:=c+d;
end
3.詞法分析完整源代碼
#include
23、TH 61 #define N 100 /*********************************************************************/ typedef struct token { int label; char name[30]; int code; int addr; }token; typedef struct KeyWord { char name[30]; int code; }KeyWord; typedef struct symble { int number; int
24、type; char name[30]; }symble; /*********************************************************************/ char ch; int var_count; int error_count; int label_count; int code_count; int addr_count; int LineOfPro; char filename[30]; FILE*KeyFin; FILE*SourceFin; FILE*TokenFout; FILE*SymbleFo
25、ut; KeyWord key[LENGTH]; token CurrentToken; symble CurrentSimble; symble SymbleList[N]; /*********************************************************************/ void Scanner(); void ScannerInit(); void IsAlpha(); void IsNumber(); void IsAnotation(); void IsChar(); void IsOther(); void O
26、utPut(); void Error(int a); int WordHave(); int strcmp(char*s,char*t) { for(;*s==*t;s++,t++) if(*s==0)return 0; return 1; } /*********************************************************************/ int main() { int i=0,j=0; code_count=0; LineOfPro=0; var_count=0; addr_count=1
27、;
label_count=1;
for(i=0;i 28、ount=0;
ScannerInit();
printf(" *************************************** ");
printf(" *L語言詞法分析器);
printf(" *************************************** ");
printf("輸入原文件名:");
for(;;)
{
scanf("%c",&filename[i]);
if(filename[i]==10)
29、 break;
i++;
}
filename[i]=\0;
if((SourceFin=fopen(filename,"rt"))==NULL)
{
printf("無法打開文件 %s.\n",filename);
exit(1);
}
if((TokenFout=fopen("token.txt","wt+"))==NULL)
{
printf("無法打開文件 symble.txt\n");
exit(1);
}
if((SymbleFout=fopen("symble.txt","wt+"))==NULL)
{
30、printf("無法打開文件 symble.txt\n");
exit(1);
}
ch=fgetc(SourceFin);
while(ch!=EOF)
{
for(i=0;i<30;i++)CurrentToken.name[i]=\0;
if((ch>47)&&(ch<58))IsNumber();
else
{
if(((ch>64)&&(ch<90))||((ch>96)&&(ch<123))||(ch==_))IsAlpha();
else{ if(ch==\)IsChar();
31、else IsOther();
}
}
}
fclose(SourceFin);
fclose(TokenFout);
fclose(SymbleFout);
printf("分析完畢/\n");
}
/********************************初始化*******************************/
void ScannerInit()
{
int i=1;
int k=0;
if((KeyFin=fopen("ni.txt","rt"))==NULL)
{
printf("ca 32、nnot open ni.txt\n");
exit(1);
}
for(i=0;i<60;i++)
for(k=0;k<30;k++)key[i].name[k]=\0;
for(i=0;i<60;i++)
{
/*讀入編碼表*/
fscanf(KeyFin,"%s%d",key[i].name,&key[i].code);
}
fclose(KeyFin);
}
/*****************************數(shù)字處理******************** 33、************/
void IsNumber()
{
int k=0;
int flag=0;
char ch1;
while(((ch>47)&&(ch<58)))
{
CurrentToken.name[k++]=ch;
ch=fgetc(SourceFin);
if(ch==.)
{
flag=1;
break;
}
}
CurrentToken.code=19;
CurrentToken.addr=addr_count++;
CurrentToken.label=label_count++; 34、
if(flag)
{
ch1=fgetc(SourceFin);
if((ch1>47)&&(ch<58))CurrentToken.name[k++]=ch;
else Error(2);
ch=ch1;
while((ch>47)&&(ch<58))
{
CurrentToken.name[k++]=ch;
ch=fgetc(SourceFin);
}
CurrentToken.code=20;
if(ch==.)
{
Error(2);
ch=fgetc(SourceFin);
35、while((ch>47)&&(ch<58))ch=fgetc(SourceFin);
}
}
if(((ch>64)&&(ch<90))||((ch>96)&&(ch<123)))
{
Error(2);
while(((ch>64)&&(ch<90))||((ch>96)&&(ch<123)))
{
ch=fgetc(SourceFin);
while((ch>47)&&(ch<58))ch=fgetc(SourceFin);
}
}
OutPut();
}
/*************************字 36、母處理************************************/
void IsAlpha()
{
int i,h;
h=0;
i=0;
while(((ch>64)&&(ch<90))||((ch>96)&&(ch<123))||(ch==_))
{
CurrentToken.name[i++]=ch;
ch=fgetc(SourceFin);
}
for(i=1;i 37、
}
if(!h)
{
CurrentToken.code=key[i].code;
CurrentToken.addr=-1;
}
else
{
CurrentToken.code=18;
CurrentToken.addr=addr_count++;
}
CurrentToken.label=label_count++;
OutPut();
}
/****************************字符串處理*******************************/
void IsChar()
{
in 38、t i=0;
for(;;)
{
ch=fgetc(SourceFin);
CurrentToken.code=20;
if(ch!=\) CurrentToken.name[i++]=ch;
else break;
}
CurrentToken.addr=addr_count++;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
}
/*******************************其他情況********************** 39、********/
void IsOther()
{
char ch1;
int i;
for(i=0;i<30;i++)CurrentToken.name[i]=\0;
switch(ch)
{
case(:
CurrentToken.name[0]=(;
CurrentToken.code=21;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case):
Current 40、Token.name[0]=);
CurrentToken.code=22;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case*:
CurrentToken.name[0]=*;
CurrentToken.code=25;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(S 41、ourceFin);
break;
case+:
CurrentToken.name[0]=+;
CurrentToken.code=23;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case,:
CurrentToken.name[0]=1;
CurrentToken.code=28;
CurrentToken.addr=-1;
CurrentToken.labe 42、l=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case-:
CurrentToken.name[0]=-;
CurrentToken.code=24;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case.:
CurrentToken.name[0]=.;
CurrentToken.code=27;
Cu 43、rrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case::
ch1=ch;
ch=fgetc(SourceFin);
if(ch!==)
{
CurrentToken.name[0]=:;
CurrentToken.code=29;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
44、 OutPut();
}
else{
CurrentToken.name[0]=:;
CurrentToken.name[1]==;
CurrentToken.code=31;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
}
break;
case;:
CurrentToken.name[0]=;;
CurrentToken.code=3 45、0;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case<:ch1=fgetc(SourceFin);
if(ch1===)
{
CurrentToken.name[0]=<;
CurrentToken.name[1]==;
CurrentToken.code=33;
CurrentToken.addr=-1;
CurrentToken.la 46、bel=label_count++;
OutPut();
ch1=fgetc(SourceFin);
}
else
{
if(ch1==>)
{
CurrentToken.name[0]=<;
CurrentToken.name[1]=>;
CurrentToken.code=35;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
47、 ch1=fgetc(SourceFin);
}
else
{
CurrentToken.name[0]=<;
CurrentToken.code=34;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
}
}
ch=ch1;
break;
case=:
CurrentToken.name[0]==;
CurrentToken.code 48、=32;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
ch=fgetc(SourceFin);
break;
case>:ch1=fgetc(SourceFin);
if(ch1===)
{
CurrentToken.name[0]=>;
CurrentToken.name[1]==;
CurrentToken.code=37;
CurrentToken.addr=-1;
CurrentToken. 49、label=label_count++;
OutPut();
ch1=fgetc(SourceFin);
}
else
{
CurrentToken.name[0]=>;
CurrentToken.code=36;
CurrentToken.addr=-1;
CurrentToken.label=label_count++;
OutPut();
}
ch=ch1;
break;
case 10: LineOfPro++;
50、 ch=fgetc(SourceFin);
break;
case 13: LineOfPro++;
ch=fgetc(SourceFin);
break;
case : ch=fgetc(SourceFin);
break;
case EOF: Error(1);
ch=fgetc(SourceFin);
break;
}
}
/****************************輸出模塊*******************************/
void OutPu 51、t()
{
int flag,i=0;
int k;
/*查填符號模塊*/
if((CurrentToken.code==18)||(CurrentToken.code==19)||(CurrentToken.code==20))
{
CurrentSimble.number=CurrentToken.addr;
CurrentSimble.type=CurrentToken.code;
strcpy(CurrentSimble.name,CurrentToken.name);
flag=WordHave();
if(((CurrentTok 52、en.code==18)&&(flag==1))||(CurrentToken.code==20)||(CurrentToken.code==19))
fprintf(SymbleFout,"%3d %3d %s\n",CurrentSimble.number,CurrentSimble.type,CurrentSimble.name);
}
/*輸出到token表*/
for(;;)
if(CurrentToken.name[i++]==\0)
break;
fprintf(TokenFout,"%3d %s",CurrentToken.label, 53、CurrentToken.name);
printf("%3d %s",CurrentToken.label,CurrentToken.name);
for(k=20-i;k>0;k--)
{
fprintf(TokenFout," ");
printf(" ");
}
fprintf(TokenFout,"%3d %3d\n",CurrentToken.code,CurrentToken.addr);
printf("%3d %3d\n",CurrentToken.code,CurrentToken.addr);
} 54、
void Error(int a)
{
error_count++;
switch(a)
{
case 1: printf("error %2d 非法字符于 %3d 行.\n",
error_count,LineOfPro+1);break;
case 2: printf("error %2d 實常數(shù)出過于 %3d 行.\n",
error_count,LineOfPro+1);break;
case 3: printf("error %2d 沒有匹配的注釋符 */ \n",error_count);break;
case 4: print 55、f("error %2d 非正常結束!\n",error_count);break;
default: break;
}
return;
}
int WordHave()
{
int flag,i=0;
for(i=0;i 56、t[var_count].number=CurrentToken.addr;
SymbleList[var_count].type=CurrentToken.code;
strcpy(SymbleList[var_count].name,CurrentToken.name);
var_count++;
return 1;
}
4.詞法分析的結果
5.詞法分析產(chǎn)生的Token文件
6.詞法分析產(chǎn)生的符號表文件
7.語法/語義分析器的完整代碼
#include 57、ude 58、ONE 50001
#define ZERO 50000
#define E_EXPR 7
#define IF 8
#define WHILE 9
#define FOR 10
#define B_EXP 12
FILE *TokenFin;
FILE *SymbleFin;
FILE *EquFout;
int code ;
int address;
int LineOfPro;
int LineOfEqu;
stack var_list[EXP_LEN];
stack expr[EXP_LEN];
equ Equ 59、[EQU_LEN];
var TempList[EQU_LEN];
char ID[20];
int var_count;
int len_count;
int pos;
int now_addr;
int temp_count;
int error_count;
int let_count;
int E_Contrl;
int E_rtn;
int True_address;
int False_address;
int gen_pos;
int EquPush(int op,int a,int b,int r);
void GetNext();
void 60、Error(int num);
int Num(char cc);
int gen(int op,int a,int b,int r);
void Declear();
void InitStack();
void Push(int cod,int addr);
int NewTemp();
void BackPatch(int addr,int addr2);
//布爾表達式分析函數(shù)
int B_Analize();
void B_Init();
int B_OR();
int B1_OR(int a);
int L_AND();
int L1_AND(int a 61、);
int M_NOT();
int K_END();
int K_CMP();
//算術表達式分析函數(shù)
int E_Analize();
void E_Init();
int E_AddSub();
int E1_AddSub(int a);
int T_MulDiv();
int T1_MulDiv(int a);
int F_Number();
//語句分析函數(shù)
void parser();
int S_Let(int a);
int S_If();
int S_While();
int S_Begin();
int L_Analize();
/* 62、****************************/
int main()
{
parser();
system("pause");
return 0;
}
void parser()
{
int gen_pos=0;
int Line ;
int i;
char ch1;
pos=0;
let_count=0;
error_count=0;
LineOfPro=0;
address=0;
LineOfEqu=0;
temp_count=0;
now_addr=0;
len_count=0;
InitSt 63、ack();
for(i=0;i 64、intf("*****************************");
printf("語法分析開始:\n");
GetNext();
if(code==12)
{
GetNext();
if(code==18)
{
GetNext();
if(code==30)
{
GetNext();
LineOfPro++;
}
if(code==16)
Declear();
if(code==2)
{
S_Begin();
if(code!=27)
65、 Error(49);
}
else
Error(50);
}
else Error(2);
}
else Error(1);
Line=LineOfEqu;
LineOfEqu=0;
while(gen_pos 66、n",error_count);
else
printf("沒有錯誤,分析成功!");
fclose(TokenFin);
printf("結果如下:\n");
rewind(EquFout);
ch1=fgetc(EquFout);
while(ch1!=EOF)
{
printf("%c",ch1);
ch1=fgetc(EquFout);
}
fclose(EquFout);
}
void GetNext()
{
int d1,d2,d3;
fscanf(TokenFin,"%d %s %d %d\n",&d1,ID,&d2,&d3);
code=d2;
address=d3;
}
void Error(int k)
{
switch(k)
{
case 1: pri
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。