编译原理第一次实验报告1614010102曹妍
更新时间:2024-05-01 17:26:01 阅读量: 综合文库 文档下载
哈尔滨理工大学
软件与微电子学院
实 验 报 告
(2017-2018第二学期)
课程名称: 编译原理
班 级: 软件16-1班
学 号: 1614010102
姓 名: 曹妍
实验名称 姓 名 实验一、算符优先分析表的构造程序 曹妍 学 号 1614010102 专 业 班 级 软件工程 软件16-1班 一、实验目的:
通过设计编制调试构造FIRSTVT集、LASTVT集和构造算符优先表,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法。
二、实验内容:
1.编写算符优先分析表的构造程序,求出给定的算符优先文法中的非终结符的FirstVT集合和LastVT集合。
2.构造算符优先表。
三、实验设备及软件环境:
PC机,主机操作系统为windows;C编译器等软件
四、实验过程及结果:
在存放文法的文件in.txt内输入待判断文法产生式(文件已输入教材116页文法),格式E->a|S,注意左部和右部之间是“->”,每个产生式一行,ENTER键换行。文法结束再输入一行G->#E#。
1.先做文法判断,即可判断文法情况。
2.若是算符优先文法,则在优先表栏显示优先表。
实验样例:图中给出了终结符号表,非终结符号表,计算FirstVT和LastVT集合,并给出 了算符优先关系矩阵。
代码和实验结果分析:
#include
char data[20][20]; //算符优先关系 char s[100]; //模拟符号栈s char lable[20]; //文法终极符集 char input[100]; //文法输入符号串 char string[20][10]; //用于输入串的分析 int k; char a; int j; char q;
int r; //文法规则个数
int r1; //转化后文法规则个数 char st[10][30]; //用来存储文法规则 char first[10][10]; //文法非终结符FIRSTVT集 char last[10][10]; //文法非终结符LASTVT集
int fflag[10]= {0}; //标志第i个非终结符的FIRSTVT集是否已求出
int lflag[10]= {0}; //标志第i个非终结符的LASTVT集是否已求出
int deal(); //对输入串的分析 int zhongjie(char c); //判断字符c是否是终极符
int xiabiao(char c); //求字符c在算符优先关系表中的下标 void out(int j,int k,char *s); //打印s栈
void firstvt(char c); //求非终结符c的FIRSTVT集 void lastvt(char c); //求非终结符c的LASTVT集 void table(); //创建文法优先关系表 int main() {
int i,j,k=0;
printf(\请输入文法规则数:\ scanf(\
printf(\请输入文法规则:\\n\ for(i=0; i scanf(\ //存储文法规则,初始化FIRSTVT集和LASTVT集 first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极符的FIRSTVT集和LASTVT集中元素的个数*/ last[i][0]=0; } for(i=0; i for(j=0; st[i][j]!='\\0'; j++) { if(st[i][0]<'A'||st[i][0]>'Z') { printf(\不是算符文法!\\n\ exit(-1); } if(st[i][j]>='A'&&st[i][j]<='Z') { if(st[i][j+1]>='A'&&st[i][j+1]<='Z') { printf(\不是算符文法!\\n\ exit(-1); } } } } for(i=0; i for(j=0; st[i][j]!='\\0'; j++) { if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|') lable[k++]=st[i][j]; } } lable[k]='#'; lable[k+1]='\\0'; table(); printf(\每个非终结符的FIRSTVT集为:\\n\ //输出每个非终结符的FIRSTVT集 for(i=0; i printf(\ for(j=0; j printf(\ } printf(\ } printf(\每个非终结符的LASTVT集为:\\n\ LASTVT集 for(i=0; i printf(\ for(j=0; j printf(\ } printf(\ } printf(\算符优先分析表如下:\\n\ for(i=0; lable[i]!='\\0'; i++) printf(\ printf(\ for(i=0; i printf(\ //输出每个非终结符的 for(j=0; j printf(\ } printf(\ } printf(\请输入文法输入符号串以#结束:\ scanf(\ deal(); } void table() { char text[20][10]; int i,j,k,t,l,x=0,y=0; int m,n; x=0; for(i=0; i firstvt(st[i][0]); lastvt(st[i][0]); } for(i=0; i text[x][y]=st[i][0]; y++; for(j=1; st[i][j]!='\\0'; j++) { if(st[i][j]=='|') { text[x][y]='\\0'; x++; y=0; text[x][y]=st[i][0]; y++; text[x][y++]='-'; text[x][y++]='>'; } else { text[x][y]=st[i][j]; y++; } } text[x][y]='\\0'; x++; y=0; } r1=x; printf(\转化后的文法为:\\n\ for(i=0; i printf(\ } for(i=0; i string[i][0]=text[i][0]; for(j=3,l=1; text[i][j]!='\\0'; j++,l++) string[i][l]=text[i][j]; //输出转化后的文法规则串 /*求每个终结符的推导结果(去掉 string[i][l]='\\0'; } for(i=0; i for(j=1; text[i][j+1]!='\\0'; j++) { if(zhongjie(text[i][j])&&zhongjie(text[i][j+1])) { m=xiabiao(text[i][j]); n=xiabiao(text[i][j+1]); data[m][n]='='; } if(text[i][j+2]!='\\0'&&zhongjie(text[i][j])&&zhongjie(text[i][j+2])&&!zhongjie(text[i][j+1])) { m=xiabiao(text[i][j]); n=xiabiao(text[i][j+2]); data[m][n]='='; } if(zhongjie(text[i][j])&&!zhongjie(text[i][j+1])) { for(k=0; k if(st[k][0]==text[i][j+1]) break; } m=xiabiao(text[i][j]); for(t=0; t n=xiabiao(first[k][t+1]); data[m][n]='<'; } } if(!zhongjie(text[i][j])&&zhongjie(text[i][j+1])) { for(k=0; k if(st[k][0]==text[i][j]) break; } n=xiabiao(text[i][j+1]); for(t=0; t m=xiabiao(last[k][t+1]); data[m][n]='>'; } } } } m=xiabiao('#'); for(t=0; t n=xiabiao(first[0][t+1]); data[m][n]='<'; } n=xiabiao('#'); for(t=0; t { m=xiabiao(last[0][t+1]); data[m][n]='>'; } data[n][n]='='; } void firstvt(char c) //求FIRSTVT集 { int i,j,k,m,n; for(i=0; i if(st[i][0]==c) break; } if(fflag[i]==0) { n=first[i][0]+1; m=0; do { if(m==2||st[i][m]=='|') { if(zhongjie(st[i][m+1])) { first[i][n]=st[i][m+1]; n++; } else { if(zhongjie(st[i][m+2])) { first[i][n]=st[i][m+2]; n++; } if(st[i][m+1]!=c) { } } } firstvt(st[i][m+1]); for(j=0; j if(st[j][0]==st[i][m+1]) break; } for(k=0; k for(t=0; t if(first[i][t]==first[j][k+1]) break; } if(t==n) { first[i][n]=first[j][k+1]; n++; } } m++; } while(st[i][m]!='\\0'); first[i][n]='\\0'; first[i][0]=--n; fflag[i]=1; } } void lastvt(char c) //求LASTVT集 { int i,j,k,m,n; for(i=0; i if(st[i][0]==c) break; } if(lflag[i]==0) { n=last[i][0]+1; m=0; do { if(st[i][m+1]=='\\0'||st[i][m+1]=='|') { if(zhongjie(st[i][m])) { last[i][n]=st[i][m]; n++; } else { if(zhongjie(st[i][m-1])) { last[i][n]=st[i][m-1]; n++; } if(st[i][m]!=c) { lastvt(st[i][m]); for(j=0; j if(st[j][0]==st[i][m]) break; } for(k=0; k for(t=0; t if(last[i][t]==last[j][k+1]) break; } if(t==n) { last[i][n]=last[j][k+1]; n++; } } } } } m++; } while(st[i][m]!='\\0'); last[i][n]='\\0'; last[i][0]=--n; lflag[i]=1; } } int deal() { int i,j; int x,y; int z; k=1; s[k]='#'; for(i=0; input[i]!='\\0'; i++); z=i--; i=0; while((a=input[i])!='\\0') { if(zhongjie(s[k])) j=k; else j=k-1; x=xiabiao(s[j]); y=xiabiao(a); if(data[x][y]=='>') //输入串的长度 //栈置初值 //计算输入串的长度 { out(1,k,s); printf(\ out(i+1,z,input); printf(\规约\\n\ do { q=s[j]; if(zhongjie(s[j-1])) j=j-1; else j=j-2; x=xiabiao(s[j]); y=xiabiao(q); } while(data[x][y]!='<'); int m,n,N; for(m=j+1; m<=k; m++) { for(N=0; N for(n=1; string[N][n]!='\\0'; n++) { if(!zhongjie(s[m])&&!zhongjie(string[N][n])) { if(zhongjie(s[m+1])&&zhongjie(string[N][n+1]) &&s[m+1]==string[N][n+1]) { s[j+1]=string[N][0]; break; } } else if(zhongjie(s[m])) if(s[m]==string[N][n]) { s[j+1]=string[N][0]; break; } 的定义 } } k=j+1; if(k==2&&a=='#') { out(1,k,s); printf(\ out(i+1,z,input); printf(\结束\\n\ printf(\输入串符合文法的定义!\\n\ return 1; } } else if(data[x][y]=='<'||data[x][y]=='=') { //移进 out(1,k,s); printf(\ out(i+1,z,input); printf(\移进\\n\ k++; s[k]=a; i++; //输入串符合文法 } else { printf(\ return 0; } } printf(\ return 0; } void out(int j,int k,char *s) { int n=0; int i; for(i=j; i<=k; i++) { printf(\ n++; } for(; n<15; n++) { printf(\ } } int xiabiao(char c) 的下标 { int i; for(i=0; lable[i]!='\\0'; i++) { //求字符c在算符优先关系表中 if(c==lable[i]) return i; } return -1; int zhongjie(char c) //判断字符c是否是终极符 { int i; for(i=0; lable[i]!='\\0'; i++) { if(c==lable[i]) return 1; } return 0; } 实验成绩: 指导教师: 年 月 日
正在阅读:
肿瘤疫苗研究进展介绍08-24
难忘的第一次滑雪作文800字06-21
形式与内容共融 感性与理性并重05-01
鼓风炉炼铅故障排除方法01-11
谈自律01-25
电商扶贫存在的问题及对策建议04-19
2017-2022年中国低端手机市场发展趋势研究报告(目录)08-30
阅读《理想国》优秀笔记合集03-24
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 编译
- 1614010102
- 原理
- 第一次
- 实验
- 报告
- 曹妍