编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)

上传人:第*** 文档编号:57352752 上传时间:2018-10-21 格式:DOC 页数:19 大小:304.57KB
返回 下载 相关 举报
编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)_第1页
第1页 / 共19页
编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)_第2页
第2页 / 共19页
编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)_第3页
第3页 / 共19页
编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)_第4页
第4页 / 共19页
编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)》由会员分享,可在线阅读,更多相关《编译原理课程设计:二---十进制的语法分析及语义分析程序设计(lr法)(19页珍藏版)》请在金锄头文库上搜索。

1、学学 号:号: 课课 程程 设设 计计 课程名称课程名称编译原理 论文题目论文题目 二-十进制的语法分析及语义分析程序 设计(LR 法) 学学 院院计算机科学与技术学院 专专 业业软件工程 班班 级级 姓姓 名名 指导教师指导教师 武汉理工大学编译原理课程设计 2015 年1月14日 课程设计任务书课程设计任务书 学生姓名:学生姓名: 专业班级:专业班级: 指导教师:指导教师: 工作单位:工作单位: 计算机科学与技术学院计算机科学与技术学院 题目题目: 二-十进制的语法分析及语义分析程序设计(LR 法) 1目的:通过设计、编制、调试语法及语义分析程序,加深对语法及语义 分析原理的理解。 2设计

2、内容及要求: (1)学号 19-22 的同学按顺序分别选择递归下降法、LL(1)、算符优先 分析法(或简单优先法)、LR 法完成以下任务。 (2)写出二-十进制的符合分析方法要求的文法,给出分析方法的思想, 完成分析程序设计。 (3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程 序。 课程设计进度安排:课程设计进度安排: 序 号 阶段内容所需用时间 1给出语法分析方法及中间代码形式的描述、文法和属性 文法的设计;或者词法分析方法及符号表和 TOKEN 代码的设 计。 1 天 2简要的分析与概要设计、算法设计与程序设计3 天 3撰写课程设计报告书1 天 合计5 天 目 录 1 系

3、统描述1 1.1 目的1 1.2 设计内容及步骤1 2 翻译方法概述2 2.1 语法分析2 2.2 属性文法2 3 LR 分析法2 3.1 LR 分析器的逻辑结构3 3.2 LR 分析算法3 4 系统的详细设计4 4.1 LR 分析过程4 4.2 LR 分析表6 5 详细的算法描述6 5.1 判别二进制数6 5.2 LR 语法分析部分6 5.3 进制转换函数8 6 源程序清单9 7 测试结果14 8 设计的评价及心得体会15 8.1 设计评价15 8.2 心得体会15 9 参考文献15 二-十进制的语法分析及语义分析程序设计 LR 法 1 系统描述 1.1 目的 通过设计、编制、调试一个二-十

4、进制的语法及语义分析程序,加深对语 法及语义分析原理的理解。 1.2 设计内容及步骤 本次实验使用 windows 7 的 Visual C+软件,设计一个二-十进制的翻译 程序设计,语法分析采用 LR 分析法。 主要流程图如下: (1)写出 LR 分析方法要求的文法和属性文法描述。 (2)描述 LR 语法分析方法的思想。 武汉理工大学编译原理课程设计 (3)给出结构设计。 (4)完成相应的语法分析和语义分析程序设计。 (5)测试用例和测试结果。 2 翻译方法概述 2.1 语法分析 语法分析是编译过程的一个逻辑阶段。语法分析的任务是在的基础上将单 词序列组合成各类语法短语,如“程序”,“语句”

5、,“表达式”等等。语法 分析程序判断源程序在结构上是否正确,源程序的结构由上下文无关文法描述。 语法分析程序可以用 YACC 等工具自动生成。 语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错 误,报告错误的性质和位置,并进行适当的纠错工作。语法分析的主要工作: 是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。语法分析 常用的方法:自顶向下的语法分析和自底向上的语法分析两大类。此次设计中 语法分析中主要通过递归下降分析法对语法分析处理过程进行控制,使输出的 三地址表示的翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。 2.2 属性文法 对于文法的每个产生式

6、都配备了一组属性的计算规则,称为语义规则。所 谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作, 从而实现语义处理。一个属性文法包含一个上下文无关文法和一系列语义规则, 这些语义规则附在文法的每个产生式上。 3 LR 分析法 LR 分析法是一种有效的自底向上的语法分析技术,它给出一种能根据当前 分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的 K 个(K0) 符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而 也就能唯一地确定句柄。 LR 分析法的归约过程是规范推导的逆过程,所以 LR 分析过程是一种规范 武汉理工大学编译原理课程设计 归约过程,每一

7、步归约的都是真正的句柄。 3.1 LR 分析器的逻辑结构 (1)在总控程序的控制下,从左到右扫描输入串根据分析栈和输入符号的 情况,查分析表确定分析动作; (2)分析表是 LR 分析器的核心,它跟文法有关,它包括动作表(Action)和 状态转换表(Goto)两部分,总控程序据分析表确定分析动作; (3)分析栈包括文法符号栈 Xi和相应的状态栈 Si两部分(状态是指能识 别活前缀的自动机状态),LR 分析器通过判断栈顶元素和输入符号查分析表确 定下步分析动作。 3.2 LR 分析算法 (1)将初始状态 S0 和输入串的左边界(#) 分别进分析栈; (2)根据状态栈栈顶和当前输入符号查动作表进行

8、移进、规约、接受或者 出错操作; (3)重复以上(2)的工作直到接受或出错为止。 武汉理工大学编译原理课程设计 4 系统的详细设计 4.1 LR 分析过程 (1)二进制文法 S - L S - L.L L - B L - LB B - 0 B - 1 (2)拓展文法 S - S S - L r1 S - L.L r2 L - B r3 L - LB r4 B - 0 r5 B - 1 r6 I0 S - *S S - *L S - *L.L L - *B L - *LB B - *0 B - *1 I1 S - S* I2 S - L* S - L*.L L - L*B B - *0 B -

9、*1 I3 L - B* I4 B - 0* I5 B - 1* I6 S - L.*L L - *B L - *LB B - *0 B - *1 I7 L - LB* I8 S - L.L* L - L*B B - *0 B - *1 4.2 LR 分析表 ACTIONGOTO 状态01.# S LB 0S4S5123 1acc 2S4S5S6r167 3r3r3 r3r3 4r5r5r5r5 5r6r6r6r6 6S4S583 7r4r4r4r4 8S4S5r27 5 详细的算法描述 5.1 判别二进制数 void Syntax() printf(“判别二进制数的文法n“); printf

10、(“ (0) S - Ln (1) S - L.Ln (2) L - Bn (3) L - LBn (4) B - 0n (5) B - 1n“); printf(“-n“); 5.2 LR 语法分析部分 do y=z;m=0;n=0; /y,z 指向状态栈栈顶 g=top;j=0;k=0; x=ctop; /将输入符号赋给 x 武汉理工大学编译原理课程设计 count+; p+; printf(“%dt“,count);/输出步骤序号 while(m #include #include void Syntax(); double change(char a); /ACTION 表 char

11、*action94=NULL, “S3#“, “S4#“, NULL, /0 NULL, NULL, NULL, “acc“, /1 “S5#“, NULL, NULL, “r1#“, /2 “r5#“, “S3#“, “S4#“, “r5#“, /3 “r5#“, “S3#“, “S4#“, “r5#“, /4 “r5#“, “S3#“, “S4#“, “r5#“, /5 “r3#“, “r3#“, “r3#“, “r3#“, /6 “r4#“, “r4#“, “r4#“, “r4#“, /7 武汉理工大学编译原理课程设计 “r2#“, “r2#“, “r2#“, “r2#“ /8 ; /G

12、OTO 表 int goto192= 1,2,0,0,0,0,0,6, 0,7, 0,8, 0,0,0,0,0,0; char vt4=.,0,1,#; /存放终结符 char vn2=E,A; /存放非终结符 char*LR9=“S-E#“,“E-A#“,“E-A.A#“,“A-0A#“,“A-1A#“,“A-#“; /存放产生式 int a20;/数组 a 实现状态栈 char b20,c20,d20,c1,d1;/数组 b 实现符号栈,数组 c 存放输入的字符串 int top1,top2,top3,top,m,n; void main() Syntax(); int g,h,i,j,k

13、,l,p,y,z,count; char x,copy20,copy120; top1=0; top2=0; top3=0;top=0; a0=0;y=a0; b0=#; count=0; z=0; /输入要识别的字符串 printf(“输入二进制表达式,注意以 # 结束n“); do scanf(“%c“, d1=c1; if(c1!=0 武汉理工大学编译原理课程设计 return; ctop3=c1; /字符数组 c20存放输入的字符串 dtop3=d1; top3=top3+1;/字符串的总个数 while(c1!=#); /输出分析结果 printf(“-对给定的字符串的分析结果-n“

14、); printf(“步骤t 状态栈tt 符号栈tt 输入串ttACTIONtGOTOn“); do y=z;m=0;n=0; /y,z 指向状态栈栈顶 g=top;j=0;k=0; x=ctop; /将输入符号赋给 x count+; p+; printf(“%dt“,count);/输出步骤序号 while(m Ln (1) S - L.Ln (2) L - Bn (3) L - LBn (4) B - 0n (5) B - 1n“); printf(“-n“); double change(char a) /进制转换函数 int n; n = strlen(a) - 1; /strlen()为系统给出的函数,用作返回数组元素个数, 返回元素不回空的个数 double result=0; char *str; str = new charn; strn=0; for(int i=0;i n;i+) stri=ai; printf(“二进制数“); for(int j=0;(size_t)j strlen(str);j+) printf(“%d“,strj-48);result=result+(strj-48)*pow(2,n-j-1); return result; 武汉理工大学编译原理课程设计 7 测试结果 (1)输入一个二进制数,程序运行结果如下: (2

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

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