算符优先分析算法c语言

上传人:hs****ma 文档编号:474228788 上传时间:2022-09-25 格式:DOCX 页数:13 大小:30.29KB
返回 下载 相关 举报
算符优先分析算法c语言_第1页
第1页 / 共13页
算符优先分析算法c语言_第2页
第2页 / 共13页
算符优先分析算法c语言_第3页
第3页 / 共13页
算符优先分析算法c语言_第4页
第4页 / 共13页
算符优先分析算法c语言_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《算符优先分析算法c语言》由会员分享,可在线阅读,更多相关《算符优先分析算法c语言(13页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验一 实验目的设计、编制并调试一个算符优先分析算法,加深对此分析法的理解二 实验过程先在算符栈置“”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操 作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符9 2则将当前处于运算符栈顶的运算符01的入栈优先数f与e 2的比较优先函数g进行比较。2.2 各种单词符号对应的种别码单词符号种别码单词符号种别码Main1*17Int2/18Char3=39if4!=40else523while7=37letter (letter digit) *10=21digit digit*2034=14(26+15

2、)27-16等等 等等 2.3 算符优先程序的功能完成一个交互式面向对象的算符优先分析程序,而一个交互式面向对象的算符 优先分析程序基本功能是:(1) 输入文法规则(2) 对文法进行转换(3) 生成每个非终结符的FirstVT和LastVT(4) 生成算符优先分析表(5) 再输入文法符号(6) 生成移进规约步骤三 设计源码算符优先分析器#include stdio.h#include stdlib.h#include iostream.hchar data2020;/算符优先关系char s100;/模拟符号栈schar lable20;/文法终极符集char input100;/文法输入符号

3、串char string2010;/用于输入串的分析int k;char a;int j;char q;int r;/文法规则个数int r1;int m,n,N;/转化后文法规则个数char st1030;/用来存储文法规则char first1010;/文法非终结符FIRSTVT集char last1010;/文法非终结符LASTVT集intfflag10=0;/标志第i个非终结符的FIRSTVT集是否已求出int lflag10=0;/标志第i个非终结符的LASTVT集是否已求出int deal();/对输入串的分析int zhongjie(char c);/判断字符c是否是终极符int

4、 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,&r);printf(请输入文法规则:n); for(i=0;ir;i+)scanf(s,sti);/存储文法规则,初始化FIRSTVT集和LASTVT集*/firstiO

5、=O;/*firstiO和 lastiO分别表示 st i0非终极符的FIRSTVT集和LASTVT集中元素的个数*/ lasti0=0;for(i=0;ir;i+)/判断文法是否合法for(j=0;stij!=0;j+)if(sti0Z)prin tf(不是算符文法!n);exit(-1); if(stij=A&stij=A&stij+1=Z)prin tf(不是算符文法!n);exit(-1);for(i=0;ir;i+)for(j=0;stij!=0;j+)if(stijZ)&stij!=-&stij!=&stij!=| )lablek+=stij;lablek=#;lablek+1=0

6、;table();printf(每个非终结符的FIRSTVT集为:n);/输出每个非终结符的FIRSTVT集for(i=0;ir;i+)printf(%c: ,sti0);for(j=0;jfirsti0;j+)printf(%c ,firstij+1);printf(n);printf(每个非终结符的LASTVT集为:n);/输出每个非终结符的LASTVT集for(i=0;ir;i+)printf(%c: ,sti0);for(j=0;jlasti0;j+)printf(%c ,lastij+1); printf(n);prin tf(算符优先分析表如下:n);for(i=0;lablei!

7、=0;i+) printf(t%c,lablei);printf(n); for(i=0;ik+1;i+)printf(%ct,lablei);for(j=0;jk+1;j+)printf(%ct,dataij);printf(n);prin tf(请输入文法输入符号串以#结束:); scanf(%s,input);deal();void table()char text2010;int i,j,k,t,l,x=0,y=0;int m,n;x=0;for(i=0;ir;i+)firstvt(sti0); lastvt(sti0);for(i=0;i;elsetextxy=stij; y+;te

8、xtxy=0;x+;y=0;r1=x;prin tf(转化后的文法为:n);/输出转化后的文法规则串/*求每个终结符的推导结果(去掉-后的转化文法,用于最后的规约)*/for(i=0;ix;i+)printf(%sn,texti); for(i=0;ix;i+) stringi0=texti0;for(j=3,l=1;textij!=0;j+,l+)stringil=textij; stringil=0;for(i=0;ix;i+) for(j=1;textij+1!=0;j+) if(zhongjie(textij)&zhongjie(textij+1) m=xiabiao(textij);

9、 n=xiabiao(textij+1); datamn=;if(textij+2!=0&zhongjie(textij)&zhongjie(textij+2)&!zhong jie(textij+1) m=xiabiao(textij); n=xiabiao(textij+2); datamn=; if(zhongjie(textij)&!zhongjie(textij+1) for(k=0;kr;k+)if(stk0=textij+1) break; m=xiabiao(textij); for(t=0;tfirstk0;t+)n=xiabiao(firstkt+1); datamn=;i

10、f(!zhongjie(textij)&zhongjie(textij+1) for(k=0;kr;k+)if(stk0=textij) break; n=xiabiao(textij+1); for(t=0;t;m=xiabiao(#);for(t=0;tfirst00;t+) n=xiabiao(first0t+1); datamn=;n=xiabiao(#);for(t=0;t; datann=;/求 FIRSTVT 集void firstvt(char c)int i,j,k,m,n; for(i=0;ir;i+) if(sti0=c) break; if(fflagi=0) n=firsti0+1; m=0;do if(m=2|stim=|) if(zhongjie(stim+1) firstin=stim+1; n+;else if(zhongjie(stim+2) firstin=stim+2; n+; if(stim+1!=c) firstvt(stim+1); for(j=0;jr;j+) if(stj0=stim+1) break; for(k=0;kfirstj0;k+)int t; for(t=0;tn;t+) if(firstit=firstjk+1) break;if(t=n)firstin=firstjk+1; n+;m+;wh

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号