1、 实 验 报 告 实验名称 算符优先文法 专 业 计算机科学与技术 课程名称 编译原理 指导老师 赵智超 班 级 计算机一班 姓 名 夏红涛 学 号 12103140102 评 分 实验地点 1C26217 实验日期 2014-05-27 一、实验目的 1.设计、编制并调试一个算符优先分析算法,加深对此分析法的理解。 二、实验原理 定义: 假定G是不含ε- 产生式的算符文法。对于任何一对终结符a、b,我们说: (1)a等于b 当且仅当文法G中含有形如P→ ···ab···或P→···aQb···的产生式; (2)a小于b
2、当且仅当G中含有形如P→···aR···的产生式,而R(+=>)b···或R(+=>)Qb···;
(3)a大于b 当且仅当G中含有形如P→···Rb···的产生式,而R(+=>)···a或R(+=>)···aQ;
如果一个算符文法G中的任何终结符对(a,b)最多满足下述三个条件之一: a=b,ab
则称G是一个算符优先文法
三、实验过程及步骤(程序源代码、算法说明及调试过程)
#include
3、r lable[20];char input[100]; char string[20][10]; int k; char a; int j; char q; int r; int r1; int m,n,N; char st[10][30]; char first[10][10]; char last[10][10]; int fflag[10]={0}; int deal();int zhongjie(char c); int xiabiao(char c); void out(int j,int k,char *s); void firstvt(char c); vo
4、id lastvt(char c);
void table();void main(){ int i,j,k=0;
printf("请输入文法规则数: "); scanf("%d",&r);
printf("请输入文法规则: \n"); for(i=0;i
5、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
6、'\0'; table();printf("每个非终结符的FIRSTVT集为:\n");
for(i=0;i 7、1]); printf("\n"); }
printf("算符优先分析表如下:\n");
for(i=0;lable[i]!='\0';i++) printf("\t%c",lable[i]); printf("\n");
for(i=0;i 8、e(){ char text[20][10]; int i,j,k,t,l,x=0,y=0; int m,n; x=0;
for(i=0;i 9、[y++]='>'; } else { text[x][y]=st[i][j]; y++; } }
text[x][y]='\0'; x++; y=0; }
r1=x; printf("转化后的文法为:\n"); for(i=0;i 10、0;i 11、 data[m][n]='='; }
if(zhongjie(text[i][j])&&!zhongjie(text[i][j+1])) { for(k=0;k 12、
{ if(st[k][0]==text[i][j]) break; }
n=xiabiao(text[i][j+1]);
for(t=0;t 13、[0][t+1]); data[m][n]='>'; } data[n][n]='='; }
void firstvt(char c) int i,j,k,m,n; for(i=0;i 14、
{ first[i][n]=st[i][m+2]; n++;}
if(st[i][m+1]!=c) { firstvt(st[i][m+1]);
for(j=0;j 15、t[i][m]!='\0');
first[i][n]='\0'; first[i][0]=--n; fflag[i]=1; } }
void lastvt(char c) { int i,j,k,m,n; for(i=0;i 16、se { 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 17、 }
m++; }while(st[i][m]!='\0'); last[i][n]='\0'; last[i][0]=--n; lflag[i]=1; } }
(1,k,s); printf("%c",a); 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",a); out(i+1,z,input); printf("移进\n"); k++; 18、
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",s[i]); n++;} for(;n<15;n++) { printf(" "); } }
int xiabiao(char c)
{ int i; for(i=0;lable[i]!='\0';i++) { if(c==lable[i]) return i; } return -1; }
int zhongjie(char c) { int i; for(i=0;lable[i]!='\0';i++) { if(c==lable[i])
return 1; } return 0; }
四、实验结果(含数据记录及分析等)
五、实验总结(含实验心得体会,收获与不足等)
这次实验让我更加熟悉了算符优先文法的工作流程以及构造方法。以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。






