算符优先分析算法c语言.docx
- 文档编号:1412233
- 上传时间:2022-10-22
- 格式:DOCX
- 页数:18
- 大小:42.74KB
算符优先分析算法c语言.docx
《算符优先分析算法c语言.docx》由会员分享,可在线阅读,更多相关《算符优先分析算法c语言.docx(18页珍藏版)》请在冰豆网上搜索。
算符优先分析算法c语言
编译原理实验
一实验目的
设计、编制并调试一个算符优先分析算法,加深对此分析法的理解
二实验过程
先在算符栈置“$”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操作数栈,然后继续读下一个单词符号。
分析过程从头开始,并重复进行;若读来的是运算符θ2则将当前处于运算符栈顶的运算符θ1的入栈优先数f与θ2的比较优先函数g进行比较。
2.2各种单词符号对应的种别码
单词符号
种别码
单词符号
种别码
Main
1
*
17
Int
2
/
18
Char
3
==
39
if
4
!
=
40
else
5
<=
38
for
6
>
23
while
7
>=
37
letter(letter\digit)*
10
=
21
digitdigit*
20
;
34
=
14
(
26
+
15
)
27
-
16
等等
…
2.3算符优先程序的功能
完成一个交互式面向对象的算符优先分析程序,而一个交互式面向对象的算符优先分析程序基本功能是:
(1)输入文法规则
(2)对文法进行转换
(3)生成每个非终结符的FirstVT和LastVT
(4)生成算符优先分析表
(5)再输入文法符号
(6)生成移进规约步骤
三设计源码
算符优先分析器
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
chardata[20][20];//算符优先关系
chars[100];//模拟符号栈s
charlable[20];//文法终极符集
charinput[100];//文法输入符号串
charstring[20][10];//用于输入串的分析
intk;
chara;
intj;
charq;
intr;//文法规则个数
intr1;
intm,n,N;//转化后文法规则个数
charst[10][30];//用来存储文法规则
charfirst[10][10];//文法非终结符FIRSTVT集
charlast[10][10];//文法非终结符LASTVT集
intfflag[10]={0};//标志第i个非终结符的FIRSTVT集是否已求出
intlflag[10]={0};//标志第i个非终结符的LASTVT集是否已求出
intdeal();//对输入串的分析
intzhongjie(charc);//判断字符c是否是终极符
intxiabiao(charc);//求字符c在算符优先关系表中的下标
voidout(intj,intk,char*s);//打印s栈
voidfirstvt(charc);//求非终结符c的FIRSTVT集
voidlastvt(charc);//求非终结符c的LASTVT集
voidtable();//创建文法优先关系表
voidmain()
{
inti,j,k=0;
printf("请输入文法规则数:
");
scanf("%d",&r);
printf("请输入文法规则:
\n");
for(i=0;i { scanf("%s",st[i]);//存储文法规则,初始化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("%c: ",st[i][0]); for(j=0;j { printf("%c",first[i][j+1]); } printf("\n"); } printf("每个非终结符的LASTVT集为: \n");//输出每个非终结符的LASTVT集 for(i=0;i { printf("%c: ",st[i][0]); for(j=0;j { 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 { printf("%c\t",lable[i]); for(j=0;j { printf("%c\t",data[i][j]); } printf("\n"); } printf("请输入文法输入符号串以#结束: "); scanf("%s",input); deal(); } voidtable() { chartext[20][10]; inti,j,k,t,l,x=0,y=0; intm,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("%s\n",text[i]); } 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]='='; } voidfirstvt(charc)//求FIRSTVT集 { inti,j,k,m,n; for(i=0;i { if(st[i]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优先 分析 算法 语言