1、课程设计报告( 20132014 年度第 一 学期)名 称: 编译技术课程设计 B 题 目:小型编译器的设计与实现院 系: 计算机系 班 级: 学 号: 学生姓名: 指导教师: 李继荣 黄建才 设计周数: 1 周 成 绩: 日期:2014 年 1 月 4 日编译技术课程设计 B课程设计任 务 书一、 目的与要求通过设计、编写和调试词法分析程序,了解词法扫描器的组成结构、不同种类单词的识别方法,掌握由单词的词法规则出发,通过识别单词的状态转换图、利用程序实现词法扫描器的方法。通过设计、编写和调试语法分析程序,了解语法分析器的组成结构以及对文法的要求,掌握基于表达式文法的语法分析程序的实现方法。通
2、过设计、编写和调试语法制导翻译程序,掌握从语句的语法出发,构造相应的语义子程序,实现基于算符优先分析的算术表达式的语法制导翻译。二、 主要内容1 词法分析器的设计与实现设计一个简单的词法扫描器。其输入是源程序字符串,输出是二元式(种别编码,单词的属性值) ,例如“”符号的输出形式为(8,) ,其中种别编码可参照书中单词表自拟某程序设计语言的单词表及其种别编码。实现方法参考书中函数和程序框架。2 语法分析器的设计与实现自上而下的语法分析方法:构造所用文法的预测分析表,实现方法参考书中算法描述。利用所得预测分析表采用自上而下的语法分析方法对输入串进行分析。例如,若根据书中算术表达式文法构造的预测分
3、析表,那么对输入表达式 i+i进行语法分析,输出为分析过程:E i+i ET iET i+i ETF iETF i+i ET i iETi i+i ET ET +i E E +i ET+ +i自下而上的语法分析方法:构造所用文法的算符优先关系表,实现方法参考书中程序框架。利用所得算符优先关系表采用自下而上的语法分析方法对输入串进行分析。例如,若根据书中算术表达式文法构造算符优先表,对输入表达式 i+i进行分析,输出为:i +iN +iN+ iN+ i N+ N N 3 语法制导翻译程序采用书中所示的翻译模式,对语法分析正确的程序在其语法分析的基础上,进行语义翻译工作。每当分析出某语法单位时,就
4、调用对应产生式的语义子程序,完成相应的翻译工作。例如,表达式文法各个产生式的语义动作表示如下:EE 1+E2 E.palce:=newtemp, gen(+, E1.palce , E2.palce , E.palce)EE 1*E2 E.palce:=newtemp, gen(*, E1.palce , E2.palce , E.palce)E(E 1) E.palce:= E1.palce Ei E.palce:=i 三、 进度计划序号 设计内容 完成时间 备注1 词法分析器的设计与实现 周一2 语法分析器的设计与实现 周二- 周四3 语法制导翻译器的实现 周五四、 设计(实验)成果要求1
5、 词法分析器:能够接收用户录入的一段源程序,并且通过语法分析正确输出此段程序中所包含的所有单词编码及其属性。2 语法分析器:对输入串进行自上而下或自下而上的语法分析,能够判断输入串是否某文法的句子。3 语义分析器:对输入源语言程序进行语法制导翻译工作。每当分析出某语法单位时,就调用相应产生式的语义子程序完成翻译工作。例如,输入 i+i,则输出为:(+, i, i, T1) 五、 考核方式根据进度计划的时间安排统一验收所有程序。可根据学生不同的进度提前验收时间,但不可滞后。验收时由学生讲解程序设计的思路和实现方法,教师根据讲解情况提出问题。其中,词法分析程序 30 分,语法分析程序 50 分,语
6、义分析程序 20 分。学生姓名:指导教师:李继荣 黄建才2013 年 12 月 29 日一、课程设计(综合实验)的目的与要求通过设计、编写和调试词法分析程序,了解词法扫描器的组成结构、不同种类单词的识别方法,掌握由单词的词法规则出发,通过识别单词的状态转换图、利用程序实现词法扫描器的方法。通过设计、编写和调试语法分析程序,了解语法分析器的组成结构以及对文法的要求,掌握基于 LL(1)文法或算符优先文法的语法分析程序的实现方法。通过设计、编写和调试语法制导翻译程序,掌握从语句的语法出发,构造相应的语义子程序,实现自定义语言的语法制导翻译。二、设计(实验)正文1、词法分析器的设计与实现1.1 待分
7、析的简单语言的词法(1)关键字:begin if then while do end (所有关键字都是小写字母)(2)运算符和界符:* / + : := = 24if 2 数字 11 := 18 = 25then 3 * 13 20 ; 26while 4 / 14 |(2)-|2.2 语法分析程序步骤(1)输入文法,根据文法求出非终结符的 FIRST 集和 LAST 集(2)求出终结符表(3)算出算符有限关系,得出优先关系表(4)输入单词串,以“#”结束,调用语法分析程序分析语法。如果是文法正确的句子,则输出成功信息,打印“结束” ,否则输出“false” 。2.3 语法分析程序的算法思想:
8、char data2020; /算符优先关系char s100; /模拟符号栈 s char lable20; /文法终极符集char input100; /文法输入符号串char str2010; /用于输入串的分析int r; /文法规则个数int r1; /转化后文法规则个数char st1030; /用来存储文法规则char first1010; /文法非终结符 FIRSTVT 集char last1010; /文法非终结符 LASTVT 集int fflag10=0; /标志第 i 个非终结符的 FIRSTVT 集是否已求出int lflag10=0; /标志第 i 个非终结符的 L
9、ASTVT 集是否已求出int deal(); /对输入串的分析int zhongjie(char c); /判断字符 c 是否是终极符int 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(); /创建文法优先关系表3、语法制导翻译程序该算法在语法分析的基础上,将规约后产生的 N 变为临时变量 Ei 或中间变量
10、 Ti,当产生中间变量的四元式时,则输出该四元式。为实现算法,这里用到词法分析的思想,将输入字符串先通过词法分析,转化为各单词的属性值或地址值。此做法便于实现数组的输出和查看。三、课程设计(综合实验)总结或结论结论:词法分析器虽然可以区分标识符与关键字,但是不能识别出长度大于一个的标识符,也不能通过程序调入和调出 txt 文件。语法分析器可以自己输入文法个数和每一种文法,同时还可以求出每个非终极符的 FIRST 集和 LAST 集,然后自动生成算符优先关系表,也可以对输入的字符串进行分析,并显示出每一步进栈出栈的情况。总结:通过这次实验,我对编译原理这门专业必修课有了进一步的深层次了解,把理论
11、知识应用于实验中,也让我重新熟悉了 C+语言的相关内容,加深了对 C+语言知识的深化和用途的理解。同时这次试验让我了解到如何设计、编制并调试词法、语法和语义分析程序,加深对词法分析,语法分析及语义分析原理的理解;熟悉构造词法分析,语法分析及语义分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用 C+直接编写分析程序。四、参考文献1 陈火旺 程序设计语言编译原理 国防工业出版社 第三版 2009 年 6 月2 鲁斌 编译技术基础教程 清华大学出版社 2011 年 10 月附录(设计流程图、程序、表格、数据等)1、流程图:(1)词法置初值调用扫描子程序输出单词二元组输入串结束开始结束是否变量初始化忽略空格是否文件结束? 拼数syn=1111对不同符号给出相应的 syn值报错拼字符串是否关键字?syn 为对应关键字的单词种别码syn=10是返回开始否字母数字运算符、界符等符号 其他符号否返回是(2)语法:输入文法规则数和文法规则判断是否为算符文法开始结束是求出终结符集求出非终结符的FIRST 和 LAST集根据终结符集,FIRST 集和 LASTA集利用 table 函数得出算符优先关系表否 返回输入要判断的字符串使用 deal 函数进行分析,输出处理栈,输入串,动作和所用的产生式2、表格见上3、数据:词法:语法及语义: