logo资料库

吉首大学编译原理实验_莫礼平.pdf

第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
资料共36页,剩余部分请下载后查看
吉首大学数学与计算机科学学院 编译原理 课程设计指导书 作者:莫礼平 二零零六年四月
前 言 编译原理是介绍编译器构造的一般原理、 基本设计方法、 主要实现技术和一些自动构造 工具的课程,这些原理、方法和技术涉及到程序设计、离散数学、汇编语言、计算机体系结 构、数据结构、 算法设计、 软件工程等多门学科, 广泛应用于一般软件的设计和实现。 因此, 都会被反复用到, 是计算 它们具有普遍的意义, 在每一个计算机科技工作者的职业生涯中, 机科学技术的重要基础。 编译原理是对实践性要求较高的一门计算机专业课程, 课程设计的 目的是使学生掌握编译器的构造原理、 设计方法、 主要实现技术和一些自动构造工具的实际 应用。 根据大纲, 本课程设计指导书中安排了四个课程设计的题目, 据自己具体情况选定其他题目。 : 学生可从中选择也可根 本课程设计指导书中的课程设计题目环境主要为 工具 FLEX和一个语法分析器自动生成工具 录,如需更详细的介绍, 请参阅编译工具中帮助文件。本课程设计指导书中参考源程序,包 括 c 程序、 LEX/FLEX 和 YACC/BISON源程序均已在相应的课程设计题目环境下调试通过。 C 或 C++ 环境及词法分析器自动生成 BISON。关于 FLEX和 BISON的使用方法,参见附 莫礼平 2006 年 4 月
目 录 前言 --------------------------------------------------------------------1 题目一 基于语法制导翻译的表达式转换编译器 -----------------------------------3 题目二 题目三 说明语句的词法分析器 -------------------------------------------------5 基于预测分析方法的表达式语法分析器 -----------------------------------7 题目四 基于算符优先分析方法的表达式语法分析器 -------------------------------9 附 录 A 词 法 分 析 器 自 动 生 成 工 具 简 介 -------------------------------------------11 附 录 B 语 法 分 析 器 自 动 生 成 工 具 简 介 -------------------------------------------18 附 录 C 部 分 课 程 设 计 题 目 参 考 源 程 序 — — — — — — — -----------------------------24 C.1 基 于 语 法 制 导 翻 译 的 表 达 式 转 换 编 译 器 参 考 源 程 序 --------------------------24 C.2 说 明 语 句 的 词 法 分 析 器 参 考 源 程 序 ----------------------------------------30 C.3 基 于 预 测 分 析 方 法 的 表 达 式 语 法 分 析 器 参 考 源 程 序 --------------------------35 参考文献 ------------------ ——————————— ----------------------------39
题目一 基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、 过程和方法的感性认识, 全面掌握语法 制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、 语法分析、 符号表管理、 错误处理及输 出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start list expr term ε list eof expr;list | expr + term { print( | expr – term { print( | term term * factor { print( | term / factor { print( | term div factor { print( | term mod factor { print( factor ( expr ) | id { print( id.name ) } | num { print( num.value ) } ‘+’ ) } ‘ - ’ ) } ‘* ’ ) } ‘ / ’ ) } ‘ DIV’ ) } ‘ MOD’ ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中 包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式 的翻译,其中包括按前述翻译器的规格说明构建对应表达式、 和 factor 的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 项、因子的非终结符 expr、term 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。 四、运行结果 1、从键盘输入任意中缀表达式,如: 4 - 5 * 6 DIV 4 + 8 MOD 2 输出相应的后缀表达式: 456*4DIV-82MOD+ 1、 若键盘输入串为非中缀表达式时,如: 4 !+* 5 - 6 DIV 4 + 8 MOD 2 输出相应语法错误报告信息,并停止语法分析,如: line 1 : compiler error ! 五、提示 1、将各功能模块设计为独立的源程序文件; 2、建立一个全局头文件,将本设计所需要用到的系统头文件的打开、一些必要的宏定 义和全局变量的声明信息放在该全局头文件中; 3、将本设计所有文件加入一个工程文件。
六、分析与讨论 1、如何修改错误处理模块,使得编译器在发现错误后能跳过出错语句,继续进行语法 分析; 2、试使用手工构造和自动生成相结合的方法来完成本课程设计; 3、仔细研读附录 C 有关“ PL/0 语言词法分析器的手工构造和自动生成”的设计内容, 并通过借鉴 PL/0 语言词法分析器的设计方法和具体实现技术,对本课程设计的综合设计进 行优化。
题目二 说明语句的词法分析器 一、设计目的 了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造及自动构造方法。 二、设计内容 根据 PASCAL语言的说明语句形式,用手工及自动方法构造一个对说明语句进行词法分 析的程序。该程序能对从键盘输入或从文件读入的形如: “ const count=10,sum=81.5,char1= ’ f ’,string1= ” hj ” , max=169 ;” 的常量说明串进行处理, 分析常量说明串中各常量名、 常量类型及常量值, 并统计各种类型 常量个数。 三、设计要求 1、输入的常量说明串,要求最后以分号作结束标志; 2、根据输入串或读入的文本文件中第一个单词是否为 “ const ”判断输入串或文本文件 是否为常量说明内容; 3、识别输入串或打开的文本文件中的常量名。 常量名必须是标识符, 定义为字母开头, 后跟若干个字母,数字或下划线; 4、根据各常量名紧跟等号“ =”后面的内容判断常量的类型。其中:字符型常量定 义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定 义为带或不带 +、- 号,不以 0 开头的若干数字的组合; 实型常量定义为带或不带 +、- 号, 不以 0 开头的若干数字加上小数点再后跟若干数字的组合; 5、统计并输出串或文件中包含的各种类型的常量个数; 6、以二元组 ( 类型 , 值 ) 的形式输出各常量的类型和值; 7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编 译器对不同错误情况做出相应处理。 四、运行结果 1、输入如下正确的常量说明串: const count=10,sum=81.5,char1= ‘ f ’,max=169,str1= “ h*54 2..4S!AAsj ”, char2= ‘@’ ,str2= “ aa!+h ”; 输出: count(integer,10) sum(float,81.5) char1(char, ‘ f ’ ) max(integer,169) str1(string, char2(char, ‘ @’ ) str2(string, “ aa!+h ” ) “ h*54 2..4S!AAsj ” ) int_num=2; char_num=2; string_num=2; float_num=1. 2、输入类似如下的保留字 const 错误的常量说明串: Aconstt count=10,sum=81.5,char1= ‘f ’ ; 输出类似下面的错误提示信息:
It is not a constant declaration statement! Please input a string again! 3、输入类似如下含常量名或常量值错误的常量说明串: const count=10,12sum=81.5,char1= ‘ff ’ ,max=0016; 输出类似下面的错误提示信息: count(integer,10) 12sum(Wrong! It is not a identifier!) char1(Wrong! There are more than one char in max(Wrong! The integer can ’ t be started with ‘’ .) ‘ 0’.) int_num=1; char_num=0; string_num=0; float_num=0. 4、其他类型的错误处理情况(略) 。 五、提示 本课程设计重点有三个:一是作为常量名的标识符的识别;二是如何根据“ =”后出 现的内容来判断常量类型;三是对各种错误的处理。难点是对整型和实型常量的判断必 须综合考虑多种可能情况。 提示: 1、 用指针或数组与指针相结合来处理输入的常量说明串; 2、 对整型和实型常量处理时,重点考虑常数中‘ 0’的位置。 六、分析与讨论 1、若考虑用 E 或 e 的科学计数法来表示整数和实数,应该如何实现? 2、若考虑布尔型常量,且规定其值只能为 3、如何对手工构造的词法分析程序做进一步的优化,以提高代码质量和运行效率? true 或 false ,应该如何实现?
题目三 基于预测分析方法的表达式语法分析器 一、设计目的 了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法, 掌握预 测语法分析程序的手工构造方法。 二、设计内容 已知文法 G[S] : S->AT A->BU T->+AT|$ U->*BU|$ B->(S)|m 其中, $表示空串。对该文法构造预测分析表,并手工构造预测分析程序,对输入串 进行语法分析,并根据栈的变化状态输出分析过程。 m+m*m# 三、设计要求: 1、判断上述文法 G[S] 是否 LL(1) 文法,若不是,将其转变为 LL(1) 文法; 2、对转变后的 LL(1) 文法建立预测分析表; 3、根据清华大学出版、吕映之等编著的编译原理教材教材第五章 Page 88 的图 5.11 手工构造预测分析程序; 4、用预测分析程序对键盘输入串 m+m*m#进行语法分析,并根据栈的变化状态输出给定 串的具体分析过程。 四、运行结果 从键盘输入串: m+m*m#; 输出: 用预测分析法分析符号串 m+m*m#的过程 Step Stack String Rule Step 1 2 3 4 5 6 7 8 9 #S #TA #TUB #TUm #TU #T #TA+ #TA #TUB m+m*m# S->AT m+m*m# A->BU m+m*m# B->m m+m*m# M匹配 +m*m# +m*m# +m*m# m*m# m*m# U->$ T->+AT +匹配 A->BU B->m 10 11 12 13 14 15 16 17 Stack #TUm #TU #TUB* #TUB #TUm #TU #T # String m*m# *m# *m# m# m# # # # Rule M匹配 U->*BU * 匹配 B->m M匹配 U->$ T->$ 接受 五、提示 本课程设计重点有两个: 一是如何用适当的数据结构实现预测分析表存储和使用; 二是 如何实现各规则右部串的逆序入栈处理。 建议:使用结构体数组。
分享到:
收藏