编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告报告完成日期 2018.5.30
一.组内分工与贡献介绍
二.系统功能概述;
我们使用了自动生成系统来完成我们的实验内容。我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。
三.分系统报告;
一、词法分析子系统
词法的正规式:
标识符<字母>(<字母>|<数字字符>)*
十进制整数0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制整数
0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符+ - * / > < = ( ) ;
关键字if then else while do
变换后的正规文法:
对于十进制数:
I1—〉0|A1
A1—〉B1C1|ε
C1—〉E1D1|ε
D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9
B1—〉1|2|3|4|5|6|7|8|9
对于八进制数:
I2—〉0A2
A2—〉0|B2
B2—〉C2D2
D2—〉F2E2|ε
E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7
F2—〉0|1|2|3|4|5|6|7
对于十六进制数:
I3—〉0xA3
A3—〉B3C3
B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f
C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
对于运算符和分隔符:
A4—〉+ | - | * | / | > | < | = | ( | ) | <=|>=|==;对于标识符和关键字:
A5—〉 B5C5
B5—〉a | b |⋯⋯| y | z
C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
综上正规文法为:
S—〉I1|I2|I3|A4|A5
I1—〉0|A1
A1—〉B1C1|ε
C1—〉E1D1|ε
D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9
B1—〉1|2|3|4|5|6|7|8|9
I2—〉0A2
A2—〉0|B2
B2—〉C2D2
D2—〉F2E2|ε
E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7
F2—〉0|1|2|3|4|5|6|7
I3—〉0xA3
A3—〉B3C3
B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f
C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ | - | * | / | > | < | = | ( | ) | <=|>=|==;A5—〉 B5C5
B5—〉a | b |⋯⋯| y | z
C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
状态图
流程图:
词法分析程序的主要数据结构与算法
考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现
另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。
以下是我们的主要代码:
进制的识别:
结果展示:
二、语法分析子系统
根据选择的语法分析方法进行描述
我们使用了递归子程序发,并且对原有的产生式进行了改写,改写后的结果如下:P→LP1|L
L→S
S→id=E|{P}|if C then S | if C then S1else S2 | while C do S1
C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 简化的语法图:S的语法图: C的语法图: E的语法图: T的语法图: F的语法图: 流程图: 语法分析子系统的主要数据结构与算法 我们采用了自动生成技术,同样在这里也是展示主要的核心功能代码,全部的代码展示在压缩包中: 我们在设计时,实现了产生式对应的字符串同时标识产生式定义的int值 辅助程序: 生成语法树的程序: 1.树节点: 2.创建新节点 3.创建实数类型新节点 4.创建标识符类型新节点 5.输出语法树 三、三地址码生成器 算法的基本思想: 我们增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。 在报错的时候,我们会呈现类型、作用域和赋值三种的问题的报错信息。