logo资料库

编译原理实验课程设计算符优先分析.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
编译原理实验
一 实验目的
二 实验过程
2.2 各种单词符号对应的种别码
三 设计源码
四 实验结果
编译原理实验 一 实验目的 设计、编制并调试一个算符优先分析算法,加深对此分析法的理解 二 实验过程 先在算符栈置“$”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操 作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符 θ2 则将当前处于运算符栈顶的运算符θ1的入栈优先数 f 与θ2的比较优先函数 g 进行比较。 2.2 各种单词符号对应的种别码 单词符号 种别码 单词符号 种别码 Main Int Char if else for while letter(letter \digit)* digit digit* = + - 1 2 3 4 5 6 7 10 20 14 15 16 * / == != <= > >= = ; ( ) 等等 17 18 39 40 38 23 37 21 34 26 27 … 2.3 算符优先程序的功能 完成一个交互式面向对象的算符优先分析程序,而一个交互式面向对象的算符 优先分析程序基本功能是: (1) 输入文法规则 (2) 对文法进行转换 (3) 生成每个非终结符的 FirstVT 和 LastVT (4) 生成算符优先分析表 (5) 再输入文法符号 (6) 生成移进规约步骤 三 设计源码 #include "stdio.h" 算符优先分析器
//算符优先关系 //模拟符号栈 s //文法终极符集 //文法输入符号串 //用于输入串的分析 //文法规则个数 //转化后文法规则个数 //用来存储文法规则 //文法非终结符 FIRSTVT 集 //文法非终结符 LASTVT 集 //标志第 i 个非终结符的 FIRSTVT 集是否已求出 //标志第 i 个非终结符的 LASTVT 集是否已求出 //对输入串的分析 //判断字符 c 是否是终极符 //求字符 c 在算符优先关系表中的下标 //打印 s 栈 //求非终结符 c 的 FIRSTVT 集 //求非终结符 c 的 LASTVT 集 //创建文法优先关系表 #include "stdlib.h" #include "iostream.h" char data[20][20]; char s[100]; char 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 lflag[10]={0}; int deal(); int zhongjie(char c); int xiabiao(char c); void out(int j,int k,char *s); void firstvt(char c); void lastvt(char c); void table(); void main() { int i,j,k=0; printf("请输入文法规则数:"); scanf("%d",&r); printf("请输入文法规则:\n"); for(i=0;i
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'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"); for(i=0;i
{ printf("%c ",last[i][j+1]); } printf("\n"); } printf("算符优先分析表如下:\n"); for(i=0;lable[i]!='\0';i++) printf("\t%c",lable[i]); printf("\n"); for(i=0;i
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
jie(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
//求 FIRSTVT 集 { m=xiabiao(last[0][t+1]); data[m][n]='>'; } data[n][n]='='; } void firstvt(char c) { int i,j,k,m,n; for(i=0;i
{ int t; for(t=0;t
分享到:
收藏