⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 do.txt

📁 do-while循环编译器设计,用C++语言编写的源代码.
💻 TXT
字号:
#define MAX 100 
#include<iostream.h> 
#include<stdio.h> 
#include<string.h> 

char str[MAX]; 
char ch; 
int turn; 


char strToken[MAX]; 
int kind; 
int n=0;//存放strtoken[]元素的个数 

struct Word//结构体 存放单词 
{ 
int sort; 
char word[MAX];//存放strtoken[]的内容 
}; 
//record[x]=new Word; 
Word *record[12];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标 

////////////////////词法分析/////////////////////// 
int buffer()//载入 
{ 
int i=0; 

cout<<"输入程序,以“#”作为结束标志。"<<endl; 

for(int n=0;n<=MAX;n++) 
{ 
for(;i<=MAX;i++) 
{ 
scanf("%c",&str[i]); 
/////////////cin>>str[i]不可用,用C语言读入字符。 
if(str[i]=='#') 
break;///////如果尾数为识别码#,则表示程序读完,跳出循环. 
} 
break; 
} 

return(i); 
} 

bool IsLetter(char ch)///////////判断是否是字母 
{ 
if(ch>=65&&ch<=90||ch>=97&&ch<=122) 
return(true); 
else 
return(false); 
} 

bool IsDigit(char ch)//////////判断是否是数字 
{ 
if(ch>=48&&ch<=57) 
return(true); 
else 
return(false); 
} 

char GetChar(int i)///////读取字符 
{ 
char ch; 
ch=str[i]; 

return(ch); 
} 

char GetBC(char ch)////判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止 
{ 
if(ch==32||ch==10) 
{ 
turn++; 
ch=GetChar(turn); 
ch=GetBC(ch);/////////递归实现 

return(ch); 
} 
else 
return(ch); 
} 

void Concat()/////////////连接,即为strtoken[]赋值 
{ 
strToken[n]=ch; 
n++; 
} 

int Reserve()/////以单词为单位查找保留字,是则返回编码,不是则返回0,用来区分标志符和保留字 
{ 
if(strcmp(strToken," DIM\0")==0)///////调用strcmp函数实现, 
return(1); 

else if(strcmp(strToken,"for\0")==0) 
return(2); 

else if(strcmp(strToken,"step\0")==0) 
return(3); 

else if(strcmp(strToken,"until\0")==0) 
return(4); 

else if(strcmp(strToken,"do\0")==0) 
return(5); 

else 
return(6); 
} 

void clear() 
{ 
n=0; 
} 


/////////////*语法递归分析*///////////////// 
int A(int * c,int & q) 
{ 
if(c[q++]==3) 
{ 
if(c[q]==7) 
{ q++; 
return 1; 
} 
else {cout<<"step右部出错"<<endl;return 0;} 
}else {cout<<"error 'step'"<<endl;return 0;} 
} 


int B(int * b,int & o) 
{ 
if(b[o++]==4) 
{ 
if(b[o]==7) 
{ o++; 
return 1; 
} 
else {cout<<"until右部出错"<<endl;return 0;} 
}else {cout<<"error 'until'"<<endl;return 0;} 
} 


int S2(int * d,int & h) 
{ 
if(d[h++]==6) 
{ 
if(d[h++]==8) 
{ 
if((d[h]==6||d[h]==7)) {h++; return 1;} 
else {cout<<"赋值语句右部出错 "<<endl;return 0;} 
}else {cout<<"赋值语句缺少赋值运算符 "<<endl;return 0;} 
}else {cout<<"赋值语句左部出错 "<<endl;return 0;} 
} 

int S1(int * m,int & n) 
{ 
if(S2(m,n)) 
{ 
if(A(m,n)) 
{ 
if(B(m,n)) return 1; 
else return 0; 
}else return 0; 
}else return 0; 
} 

int S(int *a,int & z) 
{ 
if (a[z++]==2) 
{ 
if (S1(a,z)) 
{ 
if(a[z++]==5) 
{ 
if(S2(a,z)) 
{ 
cout<<"succeed!"<<endl;return 1; 
}else return 0; 
}else {cout<<"error 'do'"<<endl; return 0;} 
}else return 0; 
}else {cout<<"error 'for'"<<endl; return 0;} 
} 




void main() 
{ 


cout<<"*************产生式***************"<<endl;// for step until do i j = 
cout<<" S ->for S1 do S2"<<endl; // 编号 2 3 4 5 6 7 8 
cout<<" S1 ->S2AB"<<endl; 
cout<<" S2 ->i=j"<<endl; 
cout<<" A ->stepj"<<endl; 
cout<<" B ->untilj"<<endl; 
int num; 

turn=0; 
num=buffer()-1; 
int x=0;//计识别的单词的个数 

for(;turn<=num;turn++)//总循环,ch存放刚读入的字符,strtoken[]存放已识别的标志付或保留字,turn是数组str[]的下标 
{ 
ch=GetChar(turn); 
ch=GetBC(ch); 

if(IsLetter(ch)) 
{ 
while(IsLetter(ch)&&turn<=num||IsDigit(ch)&&turn<=num) 
{ 
Concat(); 
ch=GetChar(++turn); 
} 

strToken[n]='\0'; 
ch=NULL;//此ch不是标志符中的符号 
turn=turn-1; 

kind=Reserve(); 
record[x]=new Word; record[x]->sort=kind;//12345或6 
//cout<<kind; //测试 
cout<<"("; 
for(int i=0;i<n;i++) 
{ 
record[x]->word[i]=strToken[i]; 
cout<<record[x]->word[i];//输出识别的标志符或保留字 
} 
cout<<","<<kind<<")"<<endl; 
record[x]->word[i]='\0'; 
clear(); 
x++; 

} 

else if(IsDigit(ch)) 
{ 
while(IsDigit(ch)&&turn<=num) 
{ 
Concat(); 
ch=GetChar(++turn); 
} 

ch=NULL; 
turn=turn-1; 

kind=7; 
////////////// 
record[x]=new Word; 

record[x]->sort=kind; 
//////////////// 

cout<<"("; 

for(int i=0;i<n;i++) 
{ 

record[x]->word[i]=strToken[i]; 
cout<<record[x]->word[i]; 
} 
cout<<","<<kind<<")"<<endl; 
record[x]->word[i]='\0'; 
clear();x++; 

} 

else if(ch=='=') 
{ 
kind=8; 
/////// 
record[x]=new Word; 
record[x]->word[0]='='; 
record[x++]->sort=kind; 
cout<<"(=,"<<kind<<")"<<endl; 

} 

else 
cout<<"error input!"<<endl; 
} 

//////////////////////*语法分析*//////////////// 
//int y; 

/*for(y=0;y<x;y++) 
{cout<<record[y]->sort<<" ";//打印单词的编号 。 

}cout<<endl;*/ 


int ana[MAX];//存放词法分析得到的单词序列的编号的序列 
int m; 
for(m=0;m<x;m++) 
{ 
ana[m]=record[m]->sort;//将sort作为数组保存起来 

} 
/////////语法分析/////// 
int j=0; 


///////////////////制导翻译////////////////// 
if(!S(ana,j)) cout<<"语法出错!"<<endl; 
else 
{ cout<<"三地址码如下:"<<endl; 
cout<<"100 "; 
int i=0; 
while(record[1]->word[i]!='\0') 
cout<<record[1]->word[i++];cout<<record[2]->word[0]; 
i=0; 
while(record[3]->word[i]!='\0') 
cout<<record[3]->word[i++];cout<<endl; 
cout<<"101 goto 103"<<endl; 
cout<<"102 "; 
i=0; 
while(record[1]->word[i]!='\0') 
cout<<record[1]->word[i++];cout<<":="; 
i=0; 
while(record[1]->word[i]!='\0') 
cout<<record[1]->word[i++];cout<<"+"; 
i=0; 
while(record[5]->word[i]!='\0') 
cout<<record[5]->word[i++];cout<<endl; 
cout<<"103 if "; 
i=0; 
while(record[1]->word[i]!='\0') 
cout<<record[1]->word[i++];cout<<"<"; 
i=0; 
while(record[7]->word[i]!='\0') 
cout<<record[7]->word[i++]; 
cout<<" goto 105"<<endl; 
cout<<"104 goto 107"<<endl; 
cout<<"105 "; 
i=0; 
while(record[9]->word[i]!='\0') 
cout<<record[9]->word[i++];cout<<":="; 
i=0; 
while(record[11]->word[i]!='\0') 
cout<<record[11]->word[i++];cout<<endl; 
cout<<"106 goto 102"<<endl; 
cout<<"107 end"<<endl; 

} 



}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -