編譯原理的課程設(shè)計
《編譯原理的課程設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《編譯原理的課程設(shè)計(48頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、二、課程設(shè)計正文 1. 編寫一個L-語言的詞法分析器,從左到右逐個字符地對L-語言的源程序進(jìn)行掃描,產(chǎn)生一個個單詞符號的機(jī)內(nèi)表示。程序結(jié)構(gòu)如圖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()進(jìn)行初始化; 讀入源程序的第一個字符; while (字符!=EOF) { if (字符= =字母)IsAlPha(); else if ( 字符= = 數(shù)字) IsNumber(); else if (字符= =‘’’)IsC
3、har(); else IsOther(); } 打印結(jié)束信息; 結(jié)束操作; } 1.2 IsAlPha() 1.功能:識別保留字和標(biāo)識符。 2.算法描述如下: Void IsAlPha() {while(字符為字母或數(shù)字或’_’) { 記錄當(dāng)前字符; 讀取下一字符; } 判斷當(dāng)前字符串是否為保留字,并設(shè)置標(biāo)志位h; 調(diào)用OutPut()函數(shù)輸出保留字或標(biāo)識符; } 1.3 IsNumber() 1.功能:識別整數(shù)和實數(shù)。 2.算法描述如下:
4、 void IsNumber() { int flag=0; while (字符為數(shù)字) { 記錄當(dāng)前字符; 讀取下一字符; If(字符為’.’號) { 記錄當(dāng)前字符; flag=1; 讀下一字符; 跳出循環(huán); } } 記單詞編碼為整數(shù)的編碼(當(dāng)前Token為整數(shù)); If(flag=1)
5、 { if (當(dāng)前字符為數(shù)字) { 記錄當(dāng)前數(shù)字; while(當(dāng)前字符為數(shù)字) { 記錄字符; 讀取下一字符; } 記單詞編碼為實數(shù)的編碼(當(dāng)前Token為實數(shù)); } else Error(2); if (當(dāng)前字符為’.’)刪除余下數(shù)字; } if (當(dāng)前字符為字母) 舍去后面的部分; OutPut(); } 1.4 IsChar() 1.功能:識別字符串。 2.算法描述: void IsChar() { for (;;;) { 讀取下一字符;
6、 現(xiàn)行Token為字符串; If(當(dāng)前字符不是‘.’號) 記錄字符; Else break; } OutPut(); 讀下一字符; } 1.5 IsOther() 1.功能:識別其他單詞。 2.算法描述如下: void IsOther() { switch(當(dāng)前字符) {對于不同字符做出不同處理,主要有: 1、符號內(nèi)容的記??; 2、查出機(jī)內(nèi)碼; 3、調(diào)用OutPut()輸出至Token()文件;
7、 4、讀取下一字符; 5、對于錯誤符號將其刪除,并報錯;} } 1.6 ScannerInit() 1.功能:進(jìn)行初始化,主要包括: 1、建立單詞編碼表、token表、符號表,并將它們清空。 2、打開單詞編碼文件,并將單詞編碼讀到編碼表中。 1.7 OutPut() 1.功能:輸出識別出的單詞,包括: 2.若單詞為標(biāo)識符或常數(shù)再查,填符號表。 1.8 Error() 1.功能:判斷錯誤原因。 2.在由詞法分析程序?qū)語言源程序分析產(chǎn)生的token,符號表文件的基礎(chǔ)上,從完成語法語義分析,并產(chǎn)生相應(yīng)的中間代碼-四元式序
8、列。 2.1 paser() 1.功能:主模塊,完成初始化,并調(diào)用復(fù)合語句分析模塊和說明語句分析模塊,完成分析任務(wù)。 2.算法描述如下: void paser() { 初始化; 從Token文件讀取第一個單詞; if (單詞= =program) { 讀取下一單詞; if (單詞= =標(biāo)識符) { 讀取下一單詞; if(單詞為‘;’) { 行數(shù)加一;
9、讀取下一單詞; if (單詞為var) declear( ); if (單詞為begin) { S_Begin(); if (code 不是等于號) Error(49); } else 出錯處理; } else 出錯處理; } else出錯處理; } else 出錯處理; 2.2 S_Begin() 1.功能:完成復(fù)合語句的分析。 2.算法描述 S_
10、Begin() { if (當(dāng)前字符為begin) { 讀取下一字符; 調(diào)用L_Analize(); if(當(dāng)前字符為end) 結(jié)束; else 非正常結(jié)束,返回0; } 讀取下一字符; 返回; } 2.3 L_Analize() 1.功能:完成語句序列分析。 2.算法描述 L_Analize() { int rtn; switch(當(dāng)前字符) { case IF:調(diào)用S_IF()函數(shù);break;
11、 case BEGIN :調(diào)用S_Begin()函數(shù);braek; case 標(biāo)識符:調(diào)用 S_Let()函數(shù);break; case WHILE:調(diào)用 S_While();break; } if (當(dāng)前字符為‘:’) { 行數(shù)加一; 讀取下一字符; 遞歸調(diào)用L_Analize() } else return rtn; } 2.4 S_Let() 1.功能:完成賦值語句的分析。 2.算法分析 S_Let(int a) { if (當(dāng)前字符為標(biāo)識符) { if
12、(需要記錄變量的地址) 記錄賦值變量的地址; 讀取下一個單詞; if(當(dāng)前單詞為賦值號) { 調(diào)用表達(dá)式分析函數(shù)L_Analize(); if(表達(dá)式正確) 生成賦值句四元式; } } else 賦值句出錯; return四元式序號; } 2.5 S_IF() 1.功能:完成條件語句的分析。 2.算法描述: Int S_IF() { int a; int rtn=0; 定義一個真出口True_ad
13、dress和一個假出口Flase_address; if(當(dāng)前單詞為if) { 布爾表達(dá)式初始化; 調(diào)用布爾表達(dá)式分析函數(shù)B_Analize(); rtn=布爾表達(dá)式的四元式首址; 產(chǎn)生無條件跳轉(zhuǎn)四元式; if (當(dāng)前單詞為then) { 讀取下一單詞; switch(當(dāng)前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函
14、數(shù);braek; case 標(biāo)識符:調(diào)用 S_Let()函數(shù);break; case WHILE:調(diào)用 S_While();break; } BackPatch(); if(當(dāng)前單詞為else) { 讀取下一單詞; switch(當(dāng)前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函數(shù);braek;
15、 case 標(biāo)識符:調(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 (當(dāng)
16、前單詞為while) { rtn=布爾表達(dá)式分析函數(shù)B_Analize(); boor_value=布爾表達(dá)式值地址; 產(chǎn)生跳轉(zhuǎn)四元式; if(當(dāng)前單詞為do) { 讀取下一單詞; switch(當(dāng)前單詞) { case IF:調(diào)用S_IF()函數(shù);break; case BEGIN :調(diào)用S_Begin()函數(shù);braek; case 標(biāo)識符:調(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ù)是算術(shù)分析表達(dá)式的主模塊,它調(diào)用算術(shù)表達(dá)式的子模塊,采用遞歸下降分析法完成算術(shù)表達(dá)式的分析。 2.算術(shù)表達(dá)式的各個子模塊: a.E_Init()將算術(shù)表達(dá)式讀入分析棧; 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.布爾表達(dá)式分析的主模塊,調(diào)用其他布爾表達(dá)式的子模塊,采用遞歸下降分析法完成布爾表達(dá)式的分析。并返回該布爾表達(dá)式的首個四元式地址。 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-><>|=|<=|>=|>|<的分析。 三、課程設(shè)計總結(jié) 1、 實驗中遇到的問題 詞法分析器程序中要讀入一個單詞編碼文件,但是文件的格式在編寫的時候和程序有點(diǎn)
20、差異,因而導(dǎo)致輸出結(jié)果再三的錯誤。語法/語義分析器中,在修改符號表時,出現(xiàn)錯誤,最終沒有的到正確結(jié)果。 2、 對實驗原理有更深的理解 通過該課程設(shè)計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務(wù),熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程,構(gòu)造工具及其相關(guān)的技術(shù)對課本上的知識有了更深的理解,課本上的知識師機(jī)械的,表面的.通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。 3、 對該理論在實踐中的應(yīng)用有深刻的理解 通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),知道和理解了該理論在計算機(jī)中是
21、怎樣執(zhí)行的,對該理論在實踐中的應(yīng)用有深刻的理解。 四、參考文獻(xiàn) [1] 賀訊. 編譯方法學(xué)習(xí)指導(dǎo)與實踐.北京:機(jī)械工業(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
標(biāo)識符 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 非正常結(jié)束!\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.詞法分析的結(jié)果
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);
//布爾表達(dá)式分析函數(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ù)表達(dá)式分析函數(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("結(jié)果如下:\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)系上傳者。文件的所有權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案