#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<iomanip.h>
#define MAX 100
static char INPUT[MAX]; /*存放输入的语句*/
static char str[MAX]; /*存放构成单词符号的字符串*/
static int mark[MAX];
static int i=0;
static int j=0;
static int m;
static int n;
/*struct Wd//结构体 存放单词
{
char word[MAX];//存放str[]的内容
};
Wd *record[MAX];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标
*/
char record[MAX][MAX];
int word()
{
if((INPUT[i]>=65&&INPUT[i]<=90)||(INPUT[i]>=97&&INPUT[i]<=122))/* 识别标识符和关键字*/
{
str[j]=INPUT[i];
i++;
j++;
while((INPUT[i]>=65&&INPUT[i]<=90)||(INPUT[i]>=97&&INPUT[i]<=122 )||(INPUT[i]>=48&&INPUT[i]<=57))
{
str[j]=INPUT[i];
i++;
j++;
}
if(INPUT[i]!=' ')i--;/*使i回调*/
if(strcmp(str,"if")==0||strcmp(str,"IF")==0)return(1);
else if(strcmp(str,"then")==0||strcmp(str,"THEN")==0)return(2);
else if(strcmp(str,"else")==0||strcmp(str,"ELSE")==0)return(3);
else return(0);
}
else if(INPUT[i]>=48&&INPUT[i]<=57)/*识别常数*/
{
str[j]=INPUT[i];
i++;
j++;
while((INPUT[i]>=48&&INPUT[i]<=57)&&i<MAX)
{
str[j]=INPUT[i];
i++;
j++;
}
if(INPUT[i]!=' ')i--;
return(4);
}
else if(INPUT[i]=='<')
{
str[j]=INPUT[i];
i++;
j++;
if(INPUT[i]=='=')
{
str[j]=INPUT[i];
return(5);
}
else{
i--;
return(6);
}
}
else if(INPUT[i]=='>')
{
str[j]=INPUT[i];
i++;
j++;
if(INPUT[i]=='=')
{
str[j]=INPUT[i];
return(7);
}
else
{
i--;
return(8);
}
}
else if(INPUT[i]=='!')
{
str[j]=INPUT[i];
i++;
j++;
if(INPUT[i]=='=')
{
str[j]=INPUT[i];
return(9);
}
else
{
i--;
return(-1);
}
}
else if(INPUT[i]=='=')
{
str[j]=INPUT[i];
i++;
j++;
if(INPUT[i]=='=')
{
str[j]=INPUT[i];
return(10);
}
else
{
i--;
return(11);
}
}
else if(INPUT[i]=='+')
{
str[j]=INPUT[i];
return(12);
}
else if(INPUT[i]=='-')
{
str[j]=INPUT[i];
return(13);
}
else if(INPUT[i]=='*')
{
str[j]=INPUT[i];
return(14);
}
else if(INPUT[i]=='/')
{
str[j]=INPUT[i];
return(15);
}
else if(INPUT[i]==' ')return(16);
else return (-1);
}
int _mark()
{
int len=0;
while(len<strlen(INPUT))
{
mark[n]=word();
if(mark[n]==16)//空格跳过、连接
{
i++;
len=i;
n--;
}
else if(mark[n]!=-1)//错误标记、跳过
{
i++;
len=i;
strcpy(record[n],str);
cout<<n<<')'<<setw(10)<<str<<setw(10)<<mark[n]<<";"<<endl;
}
else
{
cout<<endl;
cout<<"error!词法分析器分析到第"<<n+1<<"个单词符号这里发现错误!"<<endl;
return (-1);
break;
}
n++;
for(m=0;m<MAX;m++)
str[m]='\0';
j=0;
}
cout<<"单词的总数:"<<n<<endl;
}
int S(int *a,int &z);
int E(int *s,int &x);
int A(int *d,int &c);
int B(int *f,int &v);
int C(int *q,int &w);
int D(int *g,int &b);
int S(int *a,int &z)
{
if(a[z++]==1){
if(E(a,z)){
if(a[z++]==2){
if(B(a,z)){
if(a[z++]==3){
if(B(a,z)){cout<<"文法分析成功"<<endl;return 1;}
else return 0;
}
else {cout<<"出错在else"<<endl;return 0;}
}
else return 0;
}
else {cout<<"出错在then"<<endl;return 0;}
}
else return 0;
}
else {cout<<"出错在if"<<endl;return 0;}
}
int E(int *s,int &x)
{
if(D(s,x)){ //不合理s[x++]==0&&(s[x]==5||s[x]==6||s[x]==6||s[x]==8||s[x]==9||s[x]==10)
if(A(s,x)){
if(D(s,x)){
cout<<"E成功"<<endl;
return 1;
}
else {cout<<"E失败在id2"<<endl;return 0;}
}
else return 0;
}
else if(s[--x]==0){x++;cout<<"E成功"<<endl;return 1;}
else {cout<<"E失败"<<endl;return 0;}
}
int A(int *d,int &c)
{
if(d[c]==5){c++;cout<<"A成功"<<endl;}
else if(d[c]==6){c++;cout<<"A成功"<<endl;return 1;}
else if(d[c]==7){c++;cout<<"A成功"<<endl;return 1;}
else if(d[c]==8){c++;cout<<"A成功"<<endl;return 1;}
else if(d[c]==9){c++;cout<<"A成功"<<endl;return 1;}
else if(d[c]==10){c++;cout<<"A成功"<<endl;return 1;}
else {cout<<"A失败"<<endl;return 0;}
}
int B(int *f,int &v)
{
if(f[v++]==0){
if(f[v++]==11){
if(f[v]==4){v++;cout<<"B成功"<<endl;return 1;}
else if(D(f,v)){
if(C(f,v)){
if(D(f,v)){cout<<"B成功"<<endl;return 1;}
else {cout<<"B失败在D"<<endl;return 0;}
}
else {cout<<"B失败在C"<<endl;return 0;}
}
else {cout<<"B失败在D"<<endl;return 0;}
}
else {cout<<"B失败在="<<endl;return 0;}
}
else {cout<<"B失败在id1"<<endl;return 0;}
}
int D(int *g,int &b)
{
if(g[b]==0){b++;cout<<"D成功"<<endl;return 1;}
else if(g[b]==4){b++;cout<<"D成功"<<endl;return 1;}
else {cout<<"D失败"<<endl;return 0;}
}
int C(int *q,int &w)
{
if(q[w]==12){w++;cout<<"C成功"<<endl;return 1;}
else if(q[w]==13){w++;cout<<"C成功"<<endl;return 1;}
else if(q[w]==14){w++;cout<<"C成功"<<endl;return 1;}
else if(q[w]==15){w++;cout<<"C成功"<<endl;return 1;}
else {cout<<"C失败"<<endl;return 0;}
}
int main()
{
int value=0;
int sd=1,bj;
char xh;
cout<<"*********if_else产生式*********"<<endl;
cout<<"S→if E then B else B"<<endl;
cout<<"E→D A D | id1"<<endl;
cout<<"D→id1 | num"<<endl;
cout<<"A→< | > | == | != | >= | <= "<<endl;
cout<<"B→id1=num | id1=D C D"<<endl;
cout<<"C→+ | - | * | / "<<endl;
cout<<"非终结符(S|E|D|A|B|C)"<<endl;
cout<<"终结符(if|then|else|id1|num|<|>|==|!=|<=|>=|+|-|*|/)"<<endl;
cout<<"*******************************"<<endl;
cout<<endl;
for(int ii=0;ii<MAX;ii++)
for(int jj=0;jj<MAX;jj++)
record[ii][jj]='\0';
cout<<"请输入条件语句:"<<endl;
gets(INPUT); //输入一个句子
cout<<endl;
cout<<"词法分析分析出的单词及其对应的编码如下:"<<endl;
_mark();
cout<<endl;
cout<<"******************************"<<endl;
cout<<"递归分析过程"<<endl;
if(!S(mark,value))
cout<<"语法分析失败"<<endl;
else {
cout<<"语法分析成功"<<endl;
//for(int ii=0;ii<n;ii++)cout<<record[ii]<<endl;
cout<<endl;
cout<<"***********************"<<endl;
cout<<"输出三地址"<<endl;
cout<<'('<<"100"<<')'<<setw(15);
while(strcmp(record[sd],"then")){
cout<<record[sd];sd++;
}
cout<<setw(10)<<"goto"<<'('<<"102"<<')'<<endl;
cout<<'('<<"101"<<')'<<setw(15);
sd++;
bj=sd;
while(strcmp(record[sd],"else"))sd++;
sd++;
while(sd<n){
cout<<record[sd];sd++;
}
cout<<setw(10)<<"goto"<<'('<<"103"<<')'<<endl;
cout<<'('<<"102"<<')'<<setw(15);
sd++;
while(strcmp(record[bj],"else")){
cout<<record[bj];bj++;
}
cout<<endl;
cout<<'('<<"103"<<')'<<setw(10)<<"……"<<endl;
}
return 0;
}
if else 循环语句的程序设计
需积分: 13 119 浏览量
2010-01-04
10:40:58
上传
评论
收藏 209KB RAR 举报
zhangqitian
- 粉丝: 0
- 资源: 5
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 关于mybatis的一些相关资源
- 关于mybatist的一些相关资源
- uni-app实战社区交友类app开发&带视频教程
- mybatis动态sql的一些相关资源
- 隐马尔可夫模型在期货市场的应用_曾琦裕 (1).caj
- 极域解控和极域反控!!!
- 安卓android-serialport-api 串口demo源代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈