📄 if_thenyufafenxi.cpp
字号:
#include<stdio.h>//定义I/O库所用的某些宏和变量
#include<string.h>//定义字符串库函数
#include<iostream.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk;//p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
char *RWTAB[6]={"BEGIN","IF","THEN","WHILE","DO","END"};
void Irparser();
void yucu();
void statement();
void expression();
void term();
void factor();
int scaner()
{
for(n=0;n<8;n++)
token[n]=NULL;
sum='\0';
ch=prog[p++];//读下一个字符;
while(ch==' '||ch=='\n')ch=prog[p++];//读下一个字符;
m=0;
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//(ch是字,母字符)
{
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))//(ch为字母字符或数字字符)
{
token[m]=ch;
m++;//ch→token;
ch=prog[p++];//读下一个字符;
}
p--;//回退一个字符;
token[m++]='\0';
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}//给出syn值;
if(syn==10)
for(n=0;n<6;n++)
if(strcmp(token,RWTAB[n])==0)
{
syn=n+1;
break;
}//给出syn值;
}
else
if(ch>='0'&&ch<='9')//(ch是数字字符)
{
while(ch>='0'&&ch<='9')//(ch为数字字符)
{
sum=sum*10+ch-'0';
ch=prog[p++];//读下一个字符;
}
p--;//回退一个字符;
syn=11;
}
else
switch(ch)
{
case '<':m=0;token[m++]=ch;
ch=prog[p++];//读下一个字符;
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;//回退一个字符;
}
break;
case '>':token[m++]=ch;//ch→token;
ch=prog[p++];//读下一个字符;
if(ch=='=')
{
syn=24;//将>=的种别码→syn;
token[m++]=ch;//ch→token;
}
else
{
syn=23;//将>的种别码→syn;
p--;//回退一个字符;
}
break;
case ':':token[m++]=ch;//ch→token;
ch=prog[p++];//读下一个字符;
if(ch=='=')
{
syn=18;//将:=的种别码→syn;
token[m++]=ch;//ch→token;
}
else
{
syn=17;//将:的种别码→syn;
p--;//回退一个字符;
}
break;
case '+':syn=13;token[0]=ch;
break;
case '-':syn=14;token[0]=ch;
break;
case '*':syn=15;token[0]=ch;
break;
case '/':syn=16;token[0]=ch;
break;
case '=':syn=25;token[0]=ch;
break;
case ';':syn=26;token[0]=ch;
break;
case '(':syn=27;token[0]=ch;
break;
case ')':syn=28;token[0]=ch;
break;
case '#':syn=0;token[0]=ch;
break;
default:syn=-1;
}
return syn;
}
void Irparser()
{
if(syn==2)
{
scaner();//读下一个单词符号;
yucu();//调用yucu函数;
if(syn==3)
{
scaner();//读下一个单词符号;
yucu();
if(syn==0&&kk==0)
cout<<"success"<<endl;//输出("success");
}
else
{
if(kk!=1)
cout<<"缺then"<<endl;//输出'缺end'错误;
kk=1;
}
}
else
{
cout<<"if错误"<<endl;//输出'begin'错误;
kk=1;
}
return;
}
void yucu()
{
statement();//调用statement函数;
while(syn==26)
{
scaner();//读下一个单词符号;
statement();//调用statement函数;
}
return;
}
void statement()
{
if(syn==10)
{
scaner();//读下一个单词符号;
if(syn==18)
{
scaner();//读下一个单词符号;
expression();//调用expression函数;
}
else if(syn==20||syn==22||syn==23||syn==24){scaner();if(syn!=10&&syn!=11)cout<<"if 表达式错误!"<<endl;else factor();}
else
{
cout<<"赋值号错误"<<endl;//输出赋值号错误;
kk=1;
}
}
else
{
cout<<"语句错误"<<endl;//输出语句错误;
kk=1;
}
return;
}
void expression()
{
term();//调用term函数;
while(syn==13||syn==14)
{
scaner();//读下一个单词符号;
term();//调用term函数;
}
return;
}
void term()
{
factor();//调用factor函数;
while(syn==15||syn==16)
{
scaner();//读下一个单词符号;
factor();//调用factor函数;
}
return;
}
void factor()
{
if(syn==10||syn==11)
scaner();//读下一个单词符号;
else if(syn==27)
{
scaner();//读下一个单词符号;
expression();//调用expression函数;
if(syn==28)
scaner();//读下一个单词符号;
else
{
cout<<"')'错误"<<endl;//输出')'错误;
kk=1;
}
}
else
{
cout<<"表达式错误"<<endl;//输出表达式错误;
kk=1;
}
return;
}
void main()
{
cout<<"*************IF THEN 条件语句的语法分析*************\n";
int i=1;
char j;
while(i)
{
p=-1;
cout<<"please input a string:"<<endl;
do
{
prog[p++]=ch;//输入源程序字符串,送到缓冲区prog[p++]中;
}while((ch=getchar())!='#');
prog[p]='#';
p=0;
scaner();
Irparser();
cout<<"是否继续?(Y/N):";
cin>>j;
cout<<endl;
if(j=='n'||j=='N')i=0;
}
cout<<"Byebye! ^_^\n";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -