运城学院
一、实验题目
编译原理实验报告
实验三
实验题目:语法分析实验
实验类型:设计
实验地点: 第二软件实验室 指导老师:任姚鹏
专业班级:计算机科学与技术系1102班 姓 名:范缤予(2011100228)
2014年 5月 7日
语 法 分 析 实 验
二、实验目的和任务:
• 熟悉文法的机内表示;
• 掌握利用预测分析法进行语法分析的原理; • 掌握语法分析器的设计与调试。
三、实验内容及要求
• 语法分析和词法分析合在一起实现。 • 把语法分析器设计成一个的过程。
• 根据已建立的分析表,对下列输入串:i+i*i#进行语法分析,判断其是否符合文法。
要求: 1.根据已有的文法规则建立LL(1)分析表; 2. 输出分析过程。
四、实验原理
LL(1)文法——select集合的求得 预测分析表的构造 预测分析程序流程图
五、实验代码
#include \"stdio.h\" #include \"stdlib.h\" #include \"iostream.h\"
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(); //创建文法优先关系表 void main() { int i,j,k=0;
printf(\"请输入文法规则数:\"); scanf(\"%d\ printf(\"请输入文法规则:\\n\"); for(i=0;i last[i][0]=0; } for(i=0;i lable[k+1]='\\0'; table(); printf(\"每个非终结符的FIRSTVT集为:\\n\"); //输出每个非终结符的FIRSTVT集 for(i=0;i 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 后的转化文法,用于最后的规约)*/ {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 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 void firstvt(char c) { int i,j,k,m,n; for(i=0;i {firstvt(st[i][m+1]); for(j=0;j {int t; for(t=0;t {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(\"%c\ out(i+1,z,input); printf(\"结束\\n\"); printf(\"输入串符合文法的定义!\\n\"); return 1; }} else if(data[x][y]=='<'||data[x][y]=='=') { out(1,k,s); printf(\"%c\ out(i+1,z,input); printf(\"移进\\n\"); k++; s[k]=a; i++; } else {printf(\"\\nflase\"); return 0; }} printf(\"\\nflase\"); return 0;} void out(int j,int k,char *s) {int n=0;int i; for(i=j;i<=k;i++) {printf(\"%c\ n++;} for(;n<15;n++) //输入串符合文法的定义 //移进 {printf(\" \"); }} int xiabiao(char c) //求字符c在算符优先关系表中的下标 { int i; for(i=0;lable[i]!='\\0';i++) {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; } 六、实验截图 七、实验总结 通过本次实验运用自底向上分析法的思想,语法分析和词法分析合在一起实现,把语法分析器设计成一个的过程。在老师和同学们的帮助下,受益匪浅。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务