📄 语法分析.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<fstream.h>
struct Accidence //保存词法分析结果
{
int nType;
int nValue;
char Word[20]; //单词
};
class Analyse{
public:
void YuFaAnalyse(); //语法分析
void CiFaAnalyse(); //词法分析
// void shuzi();
char str[20000];
Accidence *accidence[1000]; //词法分析结果
protected:
void init();
int now; //用于语法分析中,指示词法分析结果表中当前的位置
int N; //用于词法分析中,用于指示词法分析结果的个数
char KW[50][20]; //关键词表
int FindInKWTab(char *);
bool GuanXi(); //关系
bool TiaoJian(); //条件
bool YinZi(); //因子
bool Xiang(); //项
bool BiaoDaShi(); //表达式
bool Read(); //读语句
bool Write(); //写语句
bool Circulate(); //循环语句
bool Condition(); //条件语句
bool FuZhiYuJu(); //赋值语句
bool FuHeYuJu(); //复合语句
bool YuJu(); //语句
bool ZhiXingYuJu(); //执行语句
bool ShuoMing(); //说明
bool ShuoMingChuan(); //说明串
bool BianLiang(); //变量组
bool ChangLiang(); //常量组
bool ChengXuTi(); //程序体
bool ChengXuShouBu(); //程序首部
bool ChengXu(); //程序
};
char shu[60][100];
int l=0;
void Analyse::init()
{
strcpy(KW[0],"");
strcpy(KW[1],"program"); strcpy(KW[2],"const");
strcpy(KW[3],"var"); strcpy(KW[4],"integer");
strcpy(KW[5],"long"); strcpy(KW[6],"procedure");
strcpy(KW[7],"if"); strcpy(KW[8],"then");
strcpy(KW[9],"while"); strcpy(KW[10],"do");
strcpy(KW[11],"read"); strcpy(KW[12],"write");
strcpy(KW[13],"begin"); strcpy(KW[14],"end");
strcpy(KW[15],"odd");
strcpy(KW[16],"+"); strcpy(KW[17],"-");
strcpy(KW[18],"*"); strcpy(KW[19],"/");
strcpy(KW[20],"="); strcpy(KW[21],"<>");
strcpy(KW[22],"<"); strcpy(KW[23],"<=");
strcpy(KW[24],">"); strcpy(KW[25],">=");
strcpy(KW[26],"."); strcpy(KW[27],",");
strcpy(KW[28],";"); strcpy(KW[29],":");
strcpy(KW[30],":="); strcpy(KW[31],"(");
strcpy(KW[32],")"); strcpy(KW[35],"#");
strcpy(KW[34],"");//标识符
strcpy(KW[33],"");//正整数
}
int isCharacter(char E)
{
if((int)E>96&&(int)E<123)//字母
return 1;
else return 0;
}
int isDigit(char E)
{
if((int)E>47&&(int)E<58)//数字
return 1;
else return 0;
}
int isSign(char E)//符号
{
if(E=='+'||E=='-'||E=='*'||E=='/'||E=='='||E=='.'||E==','||E==';'||E=='('||E==')')
return 1;
if(E=='<'||E=='>'||E==':')
return 2;
else return 0;
}
int Analyse::FindInKWTab(char *p)//查找关键字表
{
for(int i=0;i<36;i++)
if(strcmp(KW[i],p)==0)
return i;
return 0;
}
void Analyse::CiFaAnalyse()
{
int k,x,q=0,n=0,i=0;
char E[50];
init();
while(str[n])
{
while((int)str[n]==32||(int)str[n]==10||str[n]=='\t')//如果是空格,换行,Table
n++;
if(isCharacter(str[n]))//如果是字母
{
k=0;
while(1)
{
E[k]=str[n];
if(!(isCharacter(str[n+1])||isDigit(str[n+1])))//如果不是字母也不是数字
break;
k++;
n++;
}
E[k+1]=0;
x=FindInKWTab(E);
if(x)//如果是关键字
{
accidence[q]=new Accidence;
accidence[q]->nValue=x;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
}
else{//如果是普通标识符
accidence[q]=new Accidence;
int y=1;
int j=0;
accidence[q]->nValue=1;
for(i=0;i<q;i++)
{
if(accidence[i]->nType==34)
{
if(stricmp(accidence[i]->Word,E)==0)
{
accidence[q]->nValue=accidence[i]->nValue;//如果前面出现过就取前面的值
break;
}
else {accidence[q]->nValue++;}
}
}
accidence[q]->nType=34;
strcpy(accidence[q]->Word,E);
q++;
}
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
else if(isSign(str[n])==1)//如果是符号1
{
E[0]=str[n];
E[1]=0;
x=FindInKWTab(E);
accidence[q]=new Accidence;
accidence[q]->nValue=0;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
else if(str[n]=='<')
{
if(str[n+1]=='='||str[n+1]=='>')
{
E[0]=str[n];
n++;
E[1]=str[n];
E[2]=0;
x=FindInKWTab(E);
accidence[q]=new Accidence;
accidence[q]->nValue=0;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
else{
E[0]=str[n];
E[1]=0;
x=FindInKWTab(E);
accidence[q]=new Accidence;
accidence[q]->nValue=0;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
}
else if(str[n]=='>'||str[n]==':')
{
if(str[n+1]=='=')
{
E[0]=str[n];
n++;
E[1]=str[n];
E[2]=0;
x=FindInKWTab(E);
accidence[q]=new Accidence;
accidence[q]->nValue=0;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
else{
E[0]=str[n];
E[1]=0;
x=FindInKWTab(E);
accidence[q]=new Accidence;
accidence[q]->nValue=0;
accidence[q]->nType=x;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
}
else if(isDigit(str[n]))//如果是数字
{
k=0;
while(1)
{
E[k]=str[n];
if(!isDigit(str[n+1]))//不是数字
break;
k++;
n++;
}
E[k+1]=0;
accidence[q]=new Accidence;
accidence[q]->nValue=1;
for(i=0;i<q;i++)
{
if(accidence[i]->nType==33)
{
if(stricmp(accidence[i]->Word,E)==0)
{
accidence[q]->nValue=accidence[i]->nValue;//如果前面出现过就取前面的值
break;
}
else
{accidence[q]->nValue++;}
}
}
accidence[q]->nType=33;
strcpy(accidence[q]->Word,E);
q++;
// cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
// cout<<accidence[q-1]->Word<<'\n';
}
else{cout<<"第"<<n<<"个字符或者数字处出错 : 非法字符"<<str[n]<<'\n';}
n++;
}//while结束
N=q;
}
void Analyse::YuFaAnalyse()
{
if(N==0) //词法分析结果总数
return;
now=0; //第now个词法分析结果
ChengXu();
return;
}
bool Analyse::ChengXu()
{
if(!ChengXuShouBu())return false;
if(!ShuoMingChuan())return false;
if(!ChengXuTi())return false;
cout<<'\n'<<"<程序> --> <程序首部> <说明部分> <程序主体>\n";
cout<<'\n'<<"分析成功\n";
return true;
}
bool Analyse::ChengXuShouBu()
{
if(accidence[now]->nType!=1)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少program\n";
return false;
}
now++;
if(accidence[now]->nType!=34)
{
cout<<"第"<<now<<"个字符或者数字处出错 : program后缺少标识符\n";
return false;
}
now++;
if(accidence[now]->nType!=28)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 ;\n";
return false;
}
now++;
cout<<'\n'<<"<程序首部> --> program <标识符>;\n";
return true;
}
bool Analyse::ShuoMingChuan()
{
if(!ShuoMing())return false;
while(accidence[now]->nType==2)
{
if(!ShuoMing())
return false;
}
cout<<'\n'<<"<说明部分>-->var<变量组>:int;┃const <常量组>;┃var<变量组>:int;const<常量组>;\n";
return true;
}
bool Analyse::ShuoMing()
{
switch(accidence[now]->nType)
{
case 3://var
now++;
if(!BianLiang())
return false;
if(accidence[now]->nType!=29)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 :\n";
return false;
}
now++;
if(accidence[now]->nType!=4)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 integer\n";
return false;
}
now++;
break;
case 2://const
now++;
if(!ChangLiang())
return false;
break;
default:
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 var或者 const\n";
return false;
}
now++;
return true;
}
bool Analyse::BianLiang()
{
if(accidence[now]->nType!=34)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符 \n";
return false;
}
now++;
while(accidence[now]->nType==27)
{
now++;
if(!BianLiang())
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少变量 \n";
return false;
}
}
cout<<'\n'<<"<变量组> --> <标识符>┃<标识符>,<变量组>\n";
return true;
}
bool Analyse::ChangLiang()
{
if(accidence[now]->nType!=34)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符 \n";
return false;
}
now++;
if(accidence[now]->nType!=20)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 =\n";
return false;
}
now++;
if(accidence[now]->nType!=33)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少整数\n";
return false;
}
now++;
while(accidence[now]->nType==27)
{
now++;
if(!ChangLiang())
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少常量\n";
return false;
}
}
cout<<'\n'<<"<常量组> --> <标识符>=<整数>┃<标识符>=<整数>,<常量组>\n";
return true;
}
bool Analyse::ChengXuTi()
{
if(accidence[now]->nType!=13)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 begin\n";
return false;
}
now++;
if(!ZhiXingYuJu())return false;
if(accidence[now]->nType!=14)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 end\n";
return false;
}
now++;
if(accidence[now]->nType!=26)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 .\n";
return false;
}
now++;
cout<<"\n<程序主体> --> begin <执行语句> end.\n";
return true;
}
bool Analyse::ZhiXingYuJu()
{
if(!YuJu())return false;
while(accidence[now]->nType==28)
{
now++;
if(!ZhiXingYuJu())
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少执行语句 \n";
return false;
}
}
cout<<"\n<执行语句> --> <语句>┃<语句> ; <执行语句>\n";
return true;
}
bool Analyse::YuJu()
{
switch(accidence[now]->nType)
{
case 34://标识符
if(!FuZhiYuJu())return false;
break;
case 7://if
if(!Condition())return false;
break;
case 9://while
if(!Circulate())return false;
break;
case 11://read
if(!Read())return false;
break;
case 12://write
if(!Write())return false;
break;
case 13://begin
if(!FuHeYuJu())return false;
break;
default:
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少语句\n";
return false;
}
cout<<"\n<语句>--> <赋值语句>┃<条件语句>┃<循环语句>┃<读语句>┃<写语句>┃<复合语句>\n";
return true;
}
bool Analyse::FuZhiYuJu()
{
if(accidence[now]->nType!=34)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符\n";
return false;
}
now++;
if(accidence[now]->nType!=30)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 :=\n";
return false;
}
now++;
if(!BiaoDaShi())return false;
return true;
}
bool Analyse::Condition()
{
if(accidence[now]->nType!=7)//!=if
return false;
now++;
if(!TiaoJian())
return false;
if(accidence[now]->nType!=8)//!=then
return false;
now++;
if(!YuJu())
return false;
return true;
}
bool Analyse::Circulate()
{
if(accidence[now]->nType!=9)//while
return false;
now++;
if(!TiaoJian())
return false;
if(accidence[now]->nType!=10)//do
return false;
now++;
if(!YuJu())
return false;
return true;
}
bool Analyse::Read()
{
if(accidence[now]->nType!=11)
return false;
now++;
if(accidence[now]->nType!=31)
return false;
now++;
if(!BianLiang())return false;
if(accidence[now]->nType!=32)
return false;
now++;
return true;
}
bool Analyse::Write()
{
if(accidence[now]->nType!=12)
return false;
now++;
if(accidence[now]->nType!=31)
return false;
now++;
if(!BiaoDaShi())return false;
if(accidence[now]->nType!=32)
return false;
now++;
cout<<"\n<写语句> --> write (<表达式>)\n";
return true;
}
bool Analyse::FuHeYuJu()
{
if(accidence[now]->nType!=13)
return false;
now++;
if(!ZhiXingYuJu())
return false;
if(accidence[now]->nType!=14)
return false;
now++;
cout<<"\n<复合语句> --> begin <执行语句> end\n";
return true;
}
bool Analyse::BiaoDaShi()
{
if(!Xiang())return false;
while(accidence[now]->nType==16||accidence[now]->nType==17)
{
now++;
if(!Xiang())return false;
}
return true;
}
bool Analyse::Xiang()
{
if(!YinZi())return false;
while(accidence[now]->nType==18||accidence[now]->nType==19)
{
now++;
if(!YinZi())return false;
}
return true;
}
bool Analyse::YinZi()
{
switch(accidence[now]->nType)
{
case 33:now++;break;//整数
case 34:now++;break;//标识符
case 31:now++;//"("
if(!BiaoDaShi())return false;
if(accidence[now]->nType!=32)
{
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 )\n";
return false;
}
now++;
break;
default:cout<<accidence[now]->Word<<'\n';
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少因子\n";
return false;
}
return true;
}
bool Analyse::GuanXi()
{
switch(accidence[now]->nType)
{
case 20://=
case 24://>
case 22://<
case 25://>=
case 23://<=
case 21://<>
break;
default:
cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关系符\n";
return false;
}
now++;
return true;
}
bool Analyse::TiaoJian()
{
if(!BiaoDaShi())
return false;
if(!GuanXi())
return false;
if(!BiaoDaShi())
return false;
return true;
}
void main()
{ char t;
Analyse analyse;
ifstream infile("20032320.txt",ios::in|ios::nocreate);
int i=0;
infile.unsetf(ios::skipws);
while(infile>>t!='\0')
{
analyse.str[i]=t;
i++;
}
analyse.str[i]=0;
analyse.CiFaAnalyse();
cout<<"语法分析结果为:\n";
analyse.YuFaAnalyse();
infile.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -