华北电力大学编译试验报告
课程设计报告课程设计报告 ( 2013 -- 2014 年度第 1 学期) 名称:编译技术课程设计 题目:词法分析器设计 算符优先分析程序设计 基于算符优先分析方法的语法制导翻译程序设计 院系:计算机系 班级: 学号: 学生姓名: 指导教师: 设计周数:1 周 成绩: 日期:2014年 1 月3 日 一、课程设计的目的与要求一、课程设计的目的与要求 1.词法分析器设计的目的与要求 1.1 词法分析器设计的实验目的 本实验是为计算机科学与技术专业、 网络工程专业、信息安全专业的学生在学习 《编译 技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。 通过这个实验, 使学生应用编译程序设计的原理和技术设计出词法分析器, 了解扫描器的组 成结构, 不同种类单词的识别方法。 能使得学生在设计和调试编译程序的能力方面有所提高。 为将来设计、分析编译程序打下良好的基础。 1.2 词法分析器设计的实验要求 设计一个扫描器,该扫描器是一个子程序, 其输入是源程序字符串, 每调用一次识别并 输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设 计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没 有确定的运算符或界符作间隔,则用空白作间隔。 单词符号及其内部表示如表1-1 所示, 单词符号中标识符由一个字母后跟多个字母、 数 字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式: (种别编码,单词的属性值) 。 表 1-1单词符号及其内部表示 单词符号 BEGIN IF THEN ELSE END 标识符 整型常数 + * ** ( 种别编码 1 2 3 4 5 6 7 8 9 10 11 单词的属性值 — — — — — 在名字表中的地址 十进制整数 — — — — )12— 2.算符优先分析程序设计的目的和要求 2.1 算符优先分析程序设计的实验目的 本实验是为计算机科学与技术等专业的学生在学习 《编译技术》课程后,为加深对课堂 教学内容的理解,培养解决实际问题能力而设置的实践环节。 通过这个实验,使学生应用编 译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的 组成结构, 掌握实现通用算符优先分析算法的方法。 能使得学生在设计和调试编译程序的能 力方面有所提高。为将来设计、分析编译程序打下良好的基础。 2.2 算符优先分析程序设计的实验要求 算符优先分析属于自下而上的分析方法, 该语法分析程序的输入是终结符号串 (即单词 符号串,以一个“#”结尾) ,如果输入串是句子则输出“YES” ,否则输出“NO”和错误 信息。 算符优先分析过程与非终结符号无关, 当由文法产生了优先关系之后文法也就失去了作 用,本题目给出文法的目的是为了便于对语法分析结果进行验证。 (1)文法文法设算符优先文法G为: E E T |T T T F | F F P F | P P (E)|i 说明:i 为整型常数或者为标识符表示整型变量;使用中↑用**表示。 (2)优先关系表优先关系表设优先关系表如表 1-2 所示。 表 1-2优先关系表 + * ↑ i ( ) # + *↑ i ( ) # 3.基于算符优先分析方法的语法制导翻译程序设计的目的和要求 3.1 基于算符优先分析方法的语法制导翻译程序设计的实验目的 本实验是为计算机科学与技术等专业的学生在学习 《编译技术》课程后,为加深对课堂 教学内容的理解,培养解决实际问题能力而设置的实践环节。 通过这个实验,使学生应用编 译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语 法和语义出发, 构造相应的语义子程序, 实现基于算符优先分析方法的语法制导翻译的方法。 能使得学生在设计和调试编译程序的能力方面有所提高。 为将来设计、 分析编译程序打下良 好的基础。 3.2 基于算符优先分析方法的语法制导翻译程序设计的实验要求 算符优先分析方法是通过反复把输入符号移进分析栈, 使用优先关系表在分析栈顶寻找 最左素短语,将其归约为一个非终结符号而实现的。 这个分析过程与非终结符号无关, 当由 文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法) 。 基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作 (即语义分析) ,每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语 义子程序,去完成相应的语义翻译工作, 这步归约使用的产生式对非终结符号不加区分 (即 将所有的非终结符号用一个通用的非终结符号表示) 。 语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾) ,如果输 入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出) 。 二、课程设计正文二、课程设计正文 1. 词法分析器设计 1.1 以键盘输入的方式输入句子。 (1) 标识符和常数的属性值 (a) 标识符和常数的属性值为该单词在名次表或常数表中登记项的相对地址; (b) 当识别出一个标识符或常数时,要查名字表或常数表,若表中有其登记项,则把 得到的登记项地址作为其属性值; (c)若表中没有其登记项,则建立一个新登记项,该记录项地址作为其属性值,此处 的地址为在表中的下标。 1.2 实验分析 实验分析:对于输入的句子,使用cin.get 函数转换为数组。分析过程首先要进行对空格、回 车、Tab的判断,若为之一则指针向后移动。如果是字母,继续判断后面的是否为字母或者数字, 如果是,则加入arr 中,继续判断arr 是否为关键字,对于已经存入的关键字,需要通过查表操作 来完成;若不是关键字,则构成标识符,将其存入地址记录表。如果开始是数字,则判断它后边 紧接着的是否为数字或者小数点加数字,若满足之一,则为实数,将其存入地址记录表;若两条 均不满足,则表明为常数的单词已经结束, 进行下一步单词的分析。 对于界符和运算符的的分析, 只需判断单个字符即可,对于双目运算符,要在当前位置的基础上指针后移,再进行判断。 算法简要概述: 关键字表、 输出串用 string 数组存储。 采用一个字符串 arr 来存储分析的单词, 若未分析完,则将正在处理的字符连接到arr 后面,若当前单词分析完,则重新对arr 进行赋值, 直至整个句子全部分析完成。 数组 remember[],类型为 int,为变量的地址记录表;re 为 remember 的指针;jjj()函数用于将变量或常量存入地址记录表,iii()函数用于读取输入串中的下一个字符。 2.算符优先分析程序设计 2.1 以键盘输入的方式输入句子。 2.2 实验分析 实验分析:优先关系表用一个数组 chart[]表示,是一个8*8 的二维矩阵;分析栈用数组 stacks []表示,表示的元素为终结符号、 “#” 、非终结符N, ;数组record [],用于存放输入字符串。算符 优先分析属于自下而上的分析方法,在分析的过程中需要借助于优先关系表,在分析过程中通过 查找优先关系表和分析栈的共同作用来进行分析。 算法简要概述