算符优先词法分析器_编译原理完整课程设计.doc

上传人:牧羊曲112 文档编号:4295898 上传时间:2023-04-14 格式:DOC 页数:18 大小:141KB
返回 下载 相关 举报
算符优先词法分析器_编译原理完整课程设计.doc_第1页
第1页 / 共18页
算符优先词法分析器_编译原理完整课程设计.doc_第2页
第2页 / 共18页
算符优先词法分析器_编译原理完整课程设计.doc_第3页
第3页 / 共18页
算符优先词法分析器_编译原理完整课程设计.doc_第4页
第4页 / 共18页
算符优先词法分析器_编译原理完整课程设计.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《算符优先词法分析器_编译原理完整课程设计.doc》由会员分享,可在线阅读,更多相关《算符优先词法分析器_编译原理完整课程设计.doc(18页珍藏版)》请在三一办公上搜索。

1、 目 录一、 设计目的 1二、 设计原理 1三、 设计思想 2四、 设计要求 3五、 设计流程图及程序 4六、 运行结果及分析14七、 设计总结16八、 参考文献16算符优先词法分析器 一、设计目的 算符优先算法是自底而上分析方法的一种。所谓自底向上分析,也称移进规约分析,粗略地说他的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出的栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或可规约串是,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一部规约。重复这一过程直到规约到栈中只剩文法的开始符号是则为分析成功,也就确认输入串是文法的句子。而算符优先分析的基本

2、思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。 本课程设计的主要目的: 1、通过本次课程设计,全面系统的了解编译原理程序构造的一般原理和基本实现方法,尤其是对自底向上的优先分析方法的认识和理解; 2、提高对编译程序工作基本过程及其各阶段基本任务的分析技能; 3、加强对编译程序的生成过程、构造工具及编译程序总流程框图的理解,巩固所学的课本知识。 二、设计原理 算符优先分析法是一种有效的自底向上的分析方法。自底向上分析方法面临的主要问题是如何确定可归约串,而算符优先分析法根据两个终结符号之间的优先关系比较,成功的解决了可归约串的问题。算符优先分析法是采用最左素短语进行归约的,严

3、格来讲不属于规范规约的范畴。因此,在设计以前我们必须要知道什么是素短语和最左素短语。所谓素短语就是指句型中具有这样性质的短语:至少含有一个终结符,且除了自身之外,不再含有任何更小的素短语的短语。最左素短语,是指在句型的所有素短语中,处于句型最左边的素短语。了解了素短语和最左素短语,那么如何构造这种算法呢?首先,根据非终结符的FIRSTVT集和LASTVT集找出它们之间的优先关系,构造算符优先矩阵。然后,由此矩阵构造相应符号串的算符优先分析表并编写程序。 三、设计思想 在算符优先算法中,存在定理: 一个算符优先文法G的任何句型 # N1 a1 N2 a2 Nn an Nn+1 #(aVT,NjV

4、N,i=1, 2, ,n, n+1,Nj可有可无)的最左素短语是满足下列条件的最左子串: Nj aj Nj+1 aj+1 Ni ai Ni+1其中,aj-1 ai+1由该定理可以看出,在算符优先文法的句型中,任何素短语中最相近的两个终结符的优先级相等,且素短语中位于最前面的终结符的优先级高于在句型中紧临其前的终结符的优先级,而素短语中处于最后面的终结符的优先级高于在句型中紧随其后的终结符的优先级。设有算符优先文法GS=(VN, VT, P, S),则得出如下步骤: 1、根据GS文法构造优先关系矩阵;2、设置一个符号栈S,存放已经归约的或待形成最左素短语的符号串,另设一个工作单元R,存放当前的待

5、输入符号;3、采用移进归约的方法,当符号栈S的栈顶形成可归约串最左素短语时,进行归约。具体方法如下:分析开始时,符号栈S中只有一个符号“#”,工作单元R中存放输入串的第一个终结符;查优先关系矩阵,比较符号栈中最靠栈顶的终结符号(假设为a)与工作单元R中的终结符(假设为b)的优先关系; )若a,b之间无优先关系,则出错并退出分析程序; )若ab,则表明此时栈顶已经形成最左素短语,转; 从符号栈中最靠栈顶的终结符Xn开始,依次向前(向栈底方向)与最近的终结符比较,若Xn-1=Xn,则继续比较Xn-2和Xn-1如此反复,直至 Xi-1 *i(#=2、程序流程图 图1 算符优先算法流程图 3、程序:

6、#include #include #include #include #include #include #include #define SIZE 128 char youxian77; /算符优先关系数组 char lexbufSIZE; /存放输入的要进行分析的句子 char lexSIZE; /存放剩余串 char fenxizhanSIZE; /分析栈 void fenxi(); int panduanyou(char x); void shengyuchuan(); int k; void zengjia(); void main() /将算符优先关系存放在算符优先关系数组里 y

7、ouxian00=;youxian01=;youxian02=;youxian03=;youxian04=; youxian06=;/_youxian10=;youxian11=;youxian12=;youxian13=;youxian14=;youxian16=;/_youxian20=;youxian21=;youxian22=;youxian23=;youxian24=;youxian26=;/_youxian30=;youxian31=;youxian32=;youxian33=$;/无优先关系的用$表示youxian34=$;youxian35=;youxian36=; /_you

8、xian40=; youxian41=;youxian42=; youxian43=; youxian44=; youxian51=; youxian52=; youxian53=$; youxian54=$; youxian55=; youxian56=; /_ youxian60=; youxian61=; youxian62=; youxian63=; youxian64=; youxian65=$; youxian66=; /_ printf(将要进行算符优先分析,请做好准备n); printf(*n); printf(请输入要进行分析的句子n); cin.get(lexbuf,SIZ

9、E); /将输入的字符串存到数组 printf(步骤 栈 优先关系 当前符号 剩余输入串 移进或归约n); k=0; fenxizhank=#; fenxizhank+1=0; int lenth,i1; /初始化 剩余串数组为输入串 lenth=strlen(lexbuf); for(i1=0;i1lenth;i1+)lexi1=lexbufi1; lexi1=0; fenxi(); void fenxi() int i,j,f,z,z1,n,n1,z4,n4;int flag=0;/操作的步骤数char a; /存放正在分析的字符char p6,Q,p1,p4; f=strlen(lexb

10、uf); /测出数组的长度for(i=0;i) loop: Q=fenxizhanj; if(fenxizhanj-1=+|fenxizhanj-1=*|fenxizhanj-1=|fenxizhanj-1=i|fenxizhanj-1=(|fenxizhanj-1=)|fenxizhanj-1=#) j=j-1; else j=j-2; z1=panduanyou(fenxizhanj); n1=panduanyou(Q); p1=youxianz1n1; if(p1=) /fenxizhanj+1fenxizhank归约为N k=j+1; shengyuchuan(); flag+; pr

11、intf(%d) %s %c %c %s 归约n,flag,fenxizhan,p6,a,lex);i-; if(fenxizhank=i) fenxizhank=P;else if(fenxizhank+1=*) fenxizhank=T;else if(fenxizhank+1=+) fenxizhank=E;int hou,hou1;hou=strlen(fenxizhan); for(hou1=k+1;hou1hou;hou1+) fenxizhanhou1=0; /多个字符归约,把栈顶后面的舍弃 zengjia(); /归约剩余串没变化 else goto loop; else if

12、(p6=) /移进有一个问题就是如果上一步是不归约,剩余的字符串减少一个 shengyuchuan(); lexbuff=0; flag=flag+1; printf(%d) %s %c %c %s 移进n,flag,fenxizhan,p6,a,lex); k=k+1; fenxizhank=a; else if(p6=) z4=panduanyou(fenxizhanj); n4=panduanyou(#); p4=youxianz4n4; if(p4=) shengyuchuan(); flag+; printf(%d) %s %c %c %s接受 n,flag,fenxizhan,p6

13、,a,lex); printf(合法的句子); break; else k=k+1; fenxizhank=a; else printf(出错); break; int panduanyou(char x)int m; if(x=+) m=0; if(x=*) m=1; if(x=) m=2; if(x=i) m=3; if(x=() m=4; if(x=) m=5; if(x=#) m=6; return m;void shengyuchuan()int i4,i5; i4=strlen(lex); for(i5=0;i5i4;i5+) lexi5=lexi5+1; lexi4-1=0;vo

14、id zengjia() int h1,h2; h1=strlen(lex); for(h2=0;h2h1;h2+) lexh1-h2=lexh1-h2-1; lex0=$; /存入一字符个特殊六、运行结果及分析 1、对输入串进行举例,并得出如下运行结果:输入串为i+i*i#,运行结果为 图 2 输入串为i+i#,运行结果为 图 33输入串为i*(i)#,运行结果为 图 4 2、结合理论知识进行分析,1和2为合法的输入符号串(即是文法的句子),本设计中的程序也能对其进行正确的分析,并在图2和图3中 显示结果为“合法的句子”;但是3不是合法的输入符号串,此程序就不能进行正确的分析,且在运行后显示

15、“出错”,这说明理论与本设计的程序所要实现的结果相符。从上面的结果,我们可以看出算符优先分析法的优点:大大加快了分析过程,但这也是它的缺点:存在某种错误危险性,可能导致把本来不满足文法的输入串误认为是文法的句子。七、设计总结 1、通过编译原理课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识只是表面的,通过把该算法的内容,算法的执行顺序在计算机上实现,把深奥的书本知识变的更为简单与具体化。 2、通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解,通过实际动手做实验,从实践上认识了操作系统是如何处理命令的,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细有耐心。 3、本次课程设计程序部分是用C+语言编写的,把各个学科之间的知识融合起来 ,把各门课程的知识联系起来,理解了该知识点以及学科之间的渗透。使我加深了对编译原理,面向对象程序设计等课程的认识。 八、参考文献 编译技术王力红主编-重庆大学出版社,2001,9 C+程序设计谭浩强

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号