算符优先文法分析器
更新时间:2023-06-03 17:49:01 阅读量: 实用文档 文档下载
//文法为
//(0)E'→ #E#
//(1)E → E+T
//(2)E → T
//(3)T → T*F
//(4)T → F
//(5)F → P^F
//(6)F → P
//(7)P → (E)
//(8)P → i
//根据算符优先文法的分析规则求得终结符优先关系表
// + * ^ i ( ) #
// + > < < < < > >
// * > > < < < > >
// ^ > > < < < > >
// i > > > > >
// ( < < < < < =
// ) > > > > >
// # < < < < < =
#include<stdlib.h>
#include<stdio.h>
#include<dos.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<iostream.h>
#define SIZE 128
char youxian[7][7]; //算符优先关系数组
char lexbuf[SIZE]; //存放输入的要进行分析的句子
char lex[SIZE]; //存放剩余串
char fenxizhan[SIZE];//分析栈
void fenxi();
int panduanyou(char x);
void shengyuchuan();
int k;
void zengjia();
void main()
{
{ //将算符优先关系存放在算符优先关系数组里
youxian[0][0]='>';
youxian[0][2]='<';
youxian[0][3]='<';
youxian[0][4]='<';
youxian[0][5]='>';
youxian[0][6]='>';
//______________________________________________________________
youxian[1][0]='>';
youxian[1][1]='>';
youxian[1][2]='<';
youxian[1][3]='<';
youxian[1][4]='<';
youxian[1][5]='>';
youxian[1][6]='>';
//_______________________________________________________________
youxian[2][0]='>';
youxian[2][1]='>';
youxian[2][2]='<';
youxian[2][3]='<';
youxian[2][4]='<';
youxian[2][5]='>';
youxian[2][6]='>';
//_______________________________________________________________
youxian[3][0]='>';
youxian[3][1]='>';
youxian[3][2]='>';
youxian[3][3]='$';//无优先关系的用$表示
youxian[3][4]='$';
youxian[3][5]='>';
youxian[3][6]='>';
//_________________________________________________________________ youxian[4][0]='<';
youxian[4][1]='<';
youxian[4][2]='<';
youxian[4][3]='<';
youxian[4][4]='<';
youxian[4][5]='=';
youxian[4][6]='$';
//_________________________________________________________________ youxian[5][0]='>';
youxian[5][1]='>';
youxian[5][2]='>';
youxian[5][3]='$';
youxian[5][4]='$';
youxian[5][6]='>';
//__________________________________________________________________ youxian[6][0]='<';
youxian[6][1]='<';
youxian[6][2]='<';
youxian[6][3]='<';
youxian[6][4]='<';
youxian[6][5]='$';
youxian[6][6]='=';
//__________________________________________________________________ }
printf("现在就要进行算符优先分析,请做好准备 \n");
printf("***************************************************\n");
printf("请输入要进行分析的句子\n");
cin.get(lexbuf,SIZE); //将输入的字符串存到数组
printf("步骤 栈 优先关系 当前符号 剩余输入串 移进或归约\n"); k=0; fenxizhan[k]='#';
fenxizhan[k+1]='\0';
int lenth,i1; //初始化 剩余串数组为输入串
lenth=strlen(lexbuf);
for(i1=0;i1<lenth;i1++)
lex[i1]=lexbuf[i1];
lex[i1]='\0';
fenxi();
}
void fenxi()
{
int i,j,f,z,z1,n,n1,z4,n4;
int flag=0;//操作的步骤数
char a; //存放正在分析的字符
char p6,Q,p1,p4;
f=strlen(lexbuf); //测出数组的长度
for(i=0;i<f;i++)
{
a=lexbuf[i];
if(fenxizhan[k]=='+'||fenxizhan[k]=='*'||fenxizhan[k]=='^'||fenxizhan[k]=='i'||fenxizhan[k]=='('||fenxizhan[k]==')'||fenxizhan[k]=='#')
j=k;
else
j=k-1;
z=panduanyou(fenxizhan[j]);// 从优先关系表中查出s[j]和a的优先关系 if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||a==')'||a=='#')
n=panduanyou(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
printf("error!不合法的句子");
break;
}
p6=youxian[z][n];
if(p6=='>')
{
loop: Q=fenxizhan[j];
if(fenxizhan[j-1]=='+'||fenxizhan[j-1]=='*'||fenxizhan[j-1]=='^'||fenxizhan[j-1]=='i'||fenxizhan[j-1]=='('||fenxizhan[j-1]==')'||fenxizhan[j-1]=='#') j=j-1;
else
j=j-2;
z1=panduanyou(fenxizhan[j]);
n1=panduanyou(Q);
p1=youxian[z1][n1];
if(p1=='<') //fenxizhan[j+1]…fenxizhan[k]归约为N
{
k=j+1;
shengyuchuan();
flag++;
printf("(%d) %s %c %c %s 归约
\n",flag,fenxizhan,p6,a,lex);
i--;
fenxizhan[k]='N';
int hou,hou1;
hou=strlen(fenxizhan);
for(hou1=k+1;hou1<hou;hou1++)
fenxizhan[hou1]='\0';//多个字符归约,把栈顶后面的舍弃
zengjia();//归约剩余串没变化
}
else
goto loop;
}
else
{
if(p6=='<') //移进 有一个问题就是如果上一步是不归约,剩余的字符串减少一个
{
shengyuchuan();
lexbuf[f]='\0';
flag=flag+1;
printf("(%d) %s %c %c %s 移进\n",flag,fenxizhan,p6,a,lex);
//printf("1 ");
//printf(" %s ",fenxizhan);
//printf(" %c ",p);
// printf(" %c ",a);
//printf(" %s",lex);
//printf(" 移进\n");
// printf("%s",lex);
//printf("(i)");
k=k+1;
fenxizhan[k]=a;
}
else
{
if(p6=='=')
{
z4=panduanyou(fenxizhan[j]);
n4=panduanyou('#');
p4=youxian[z4][n4];
if(p4=='=')
{
shengyuchuan();
flag++;
printf("(%d) %s %c %c %s \n",flag,fenxizhan,p6,a,lex);
printf("合法的句子");
break;
}
else
{
k=k+1;
fenxizhan[k]=a;
}
}
else
{
printf("出错"); 接受
break;
}
}
}
}
}
int panduanyou(char x) {int m;
if(x=='+')
m=0;
if(x=='*')
m=1;
if(x=='^')
m=2;
if(x=='i')
m=3;
if(x=='(')
m=4;
if(x==')')
m=5;
if(x=='#')
m=6;
return m;
}
void shengyuchuan()
{
int i4,i5;
i4=strlen(lex);
for(i5=0;i5<i4;i5++) lex[i5]=lex[i5+1];
lex[i4-1]='\0';
}
void zengjia()
{
int h1,h2;
h1=strlen(lex);
for(h2=0;h2<h1;h2++)
lex[h1-h2]=lex[h1-h2-1];
lex[0]='$';//存入一字符个特殊 }
正在阅读:
算符优先文法分析器06-03
北京考察报告12-05
海富投资与甘肃世恒最高人民法院再审判决书06-20
杭州市老年人残疾人养护服务公司名录2018版540家07-10
设计概论章节11-25
2015山东省属事业单位岗位性质栏里的字母是什么意思04-12
热力学论文03-20
盘盈盘亏的会计处理06-05
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 算符
- 分析器
- 文法
- 优先
- 凝聚态物理导论0501
- 许崇德版宪法(章节习题及参考答案)
- 教师招聘考试之面试常见问题攻略:学生篇
- 河南-2012年活动营销方案
- 保洁公司公司层战略
- 贝克休斯英特 Answers While Drilling 技术介绍
- 急诊患者抢救过程中急诊护理流程的优化效果
- 基于DSP的OFDM系统的设计
- 2011年资源与运营管理作业
- 中国十大古代名曲简介
- 特殊教育学校建设标准(试行)
- 2017西城区高三语文二模试卷及答案
- 第十二章 国际市场产品策略
- PMP PMBoK 5th五大过程组十大知识领域ITTO输入输出工具与技术流程图
- 2009年四川省成都七中自主招生考试物理试卷
- 【刑事诉讼法学】案例分析
- 华锐3MW机组操作说明书
- 网络搜索教案设计—圆柱和圆锥的认识
- 简易销售面谈话术
- 节庆旅游产品研究