您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页范缤予

范缤予

来源:华佗健康网


运城学院

一、实验题目

编译原理实验报告

实验三

实验题目:语法分析实验

实验类型:设计

实验地点: 第二软件实验室 指导老师:任姚鹏

专业班级:计算机科学与技术系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符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0; } for(i=0;i'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'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{ char text[20][10]; int i,j,k,t,l,x=0,y=0; int m,n; x=0; for(i=0;i//输出每个非终结符的LASTVT集

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;ifor(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;kfor(t=0;tvoid firstvt(char c) { int i,j,k,m,n; for(i=0;i//求FIRSTVT集

{firstvt(st[i][m+1]); for(j=0;jvoid lastvt(char c) { int i,j,k,m,n; for(i=0;i//求LASTVT集

{int t; for(t=0;t{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(\"%c\ 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//输入串的长度 //栈置初值 //计算输入串的长度

{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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务