📄 语法分析.cpp
字号:
# include <string.h> //引用字符串库函数
# include "iostream.h" //引用I/O所用的的某些库函数
char prog[80],token[80]; //prog[80]为源程序字符串,
//token[8]为存放的单词自身字符串
char ch; //ch为当前扫描到的字符
int syn,p,m,n,sum,kk; //syn用来存放单词符号的种别码
//p是缓冲区prog[80]的指针
//m是token[8]的指针
//n是初始化token[8]的for循环变量
//sum用来存放整型单词
//kk是出错判定标志
char * rwtab[6]={"begin","if","then","while","do","end"};
//rwtab[6]为关键字数组
int fl(char x); //判断是否字母
int fld(char x); //判断是否字母或数字
void scaner(); //单词扫描函数,返回一个单词的syn
void lrparser(); //递归下降分析函数
void yucu(); //语句串分析函数
void statement(); //语句分析函数
void expression(); //表达式分析函数
void term(); //项分析函数
void factor(); //因子分析函数
void main()
{
char s[80]; int i,k;
cout<<" 语法分析器"<<endl<<endl;
k=1; //用于循还标识
while(k==1)
{
p=0;
i=0;
kk=0;
for(n=0;n<80;n++)
s[n]=NULL;
for(n=0;n<80;n++)
prog[n]=NULL;
cout<<"请输入源程序字符串:";
cin.getline(s,80);
do
{
prog[p++]=s[i];
ch=s[i];
i++;
}while(ch!='#'&& ch!='\0');
p=0;
scaner();
lrparser();
cout<<endl<<endl;
cout<<"继续进行语法分析请按按'1'"<<endl;
cout<<"如需退出程序请按其它键";
cin>>k;
cin.get();
cout<<"*******************************************";
cout<<endl<<endl;
}
}
void scaner()
{
int j=0; char t[80]; sum=0;m=0;
for(n=0;n<8;n++)token[n]=NULL;
t[j]= prog[p];
ch= prog[p];
p++;
while(ch==' ') //读入下一个字符
{
j++;
t[j]=prog[p] ;
ch= prog[p];
p++;
}
if(fl(t[j])) //字符为字母读入下一个字符
{
token[m++]=t[j];
j++;
t[j]=prog[p];
p++;
while(fld(t[j])) //字符为字母或数字读入下一个字符
{
token[m++]=t[j];
j++;
t[j]=prog[p];
p++;
}
p--; //回退一个字符
token[m++]='\0'; // 数组结束标志
m--;
syn=10;
//若token为关键字,给出种别码
if(strcmp(token,rwtab[0])==0)
syn=1;
if(strcmp(token,rwtab[1])==0)
syn=2;
if(strcmp(token,rwtab[2])==0)
syn=3;
if(strcmp(token,rwtab[3])==0)
syn=4;
if(strcmp(token,rwtab[4])==0)
syn=5;
if(strcmp(token,rwtab[5])==0)
syn=6;
}
else if(t[j]>=48 && t[j] <=57) //如果字符为数字
{
while(t[j]>=48 && t[j] <=57)
{
sum=sum*10+t[j]-'0'; //转换为十进制数
j++;
t[j]=prog[p];
p++;
}
p--; //回退一个字符
syn=11;
}
else
switch(t[j])
{
case'<' : m=0;token[m++]=t[j];
j++;
t[j]=prog[p];
p++;
if(t[j]=='>')
{
syn=21;
token[m]=t[j];
}
else if(t[j]=='=')
{ syn=22;
token[m]=t[j];
}
else
{ syn=20; p--;}
break;
case'>' : m=0; token[m++]=t[j];
j++;
t[j]=prog[p];
p++;
if(t[j]=='=')
{ syn=24;
token[m]=t[j];
}
else
{ syn=23; p--;}
break;
case ':' : m=0; token[m++]=t[j];
j++;
t[j]=prog[p];
p++;
if(t[j]=='=')
{ syn=18;
token[m]=t[j];
}
else
{ syn=17; p--;}
break;
case'+': syn=13;token[0]=t[j];break;
case'-': syn=14;token[0]=t[j];break;
case'*': syn=15;token[0]=t[j];break;
case'/': syn=16;token[0]=t[j];break;
case'=': syn=25;token[0]=t[j];break;
case';': syn=26;token[0]=t[j];break;
case'(': syn=27;token[0]=t[j];break;
case')': syn=28;token[0]=t[j];break;
case'#': syn=0;token[0]=t[j];break;
default: syn=-1; //否则令种别码为-1
}
}
void lrparser() //递归下降分析函数
{
if(syn==1)
{
scaner(); //读入下一个单词
yucu();
if(syn==6)
{
scaner();
if(syn==0 && (kk==0))
cout<<"语法正确";
if(syn==-1)
{
cout<<"缺'#'错误"; kk=1;
}
}
else if (syn==10)
{
cout<<"缺分号错误";kk=1;
}
else
{
if(kk!=1) cout<<"缺end错误"; kk=1;
}
}
else{ cout<<"缺begin错误"; kk=1;}
return;
}
void yucu() //语句串分析函数
{
statement();
while(syn==26) //是否为';'
{
scaner();
statement();
}
return;
}
void statement()
{
if(syn==10) //是否为标识符
{
scaner();
if(syn==18)
{
scaner();
expression();
}
else{ cout<<"赋值号错误"; kk=1;}
}
else if(syn==6)
{
cout<<"end前面多了分号";kk=1;
}
else{ cout<<"语句错误"; kk=1;}
return;
}
void expression()
{
term();
while(syn==13||syn==14) //字符是否为+或-
{
scaner();
term();
}
return;
}
void term()
{
factor();
while(syn==15||syn==16) //字符是否为*或/
{
scaner();
factor();
}
return;
}
void factor()
{
if(syn==10||syn==11) //是否为标识符或整常数
scaner();
else if(syn==27) //是否为'('
{
scaner();
expression();
if(syn==28) //是否为')'
scaner();
else{ cout<<"缺少)错误" ;kk=1;}
}
else { cout<<"表达式错误" ; kk=1;}
return;
}
int fl(char x)
{
if(x>=65 && x<=90 ) return 1;
else if(x>=97 && x<=122) return 1;
else return NULL;
}
int fld(char x)
{
if(x>=65 && x<=90 ) return 1;
else if(x>=97 && x<=122) return 1;
else if(x>=48 && x<=57) return 1;
else return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -