编辑: 颜大大i2 2019-09-12
《编译原理》课程设计 目录

1、课程设计的目的

1

2、课程设计的内容及要求

1 2.

1、课程设计的内容

1 2.

2、课程设计的要求

2 2.2.

1、设计符号表

2 2.2.

2、设计词法分析器

2 2.2.

3、语法分析与中间代码产生器

2

3、实现原理

3 3.

1、符号表

3 3.1.

1、字符集的定义

3 3.1.

2、单词集的定义

3 3.1.

3、程序定义

3 3.

2、词法分析

4 3.2.

1、填符号表

4 3.2.

2、识别单词

4 3.

3、语法分析

5 3.

4、语义分析

5

4、算法实现流程图

5 4.

1、词法分析流程图

5 4.

2、语法分析流程图

6 4.

3、语义分析流程图

8

5、测试数据

9 5.

1、测试数据1

9 5.

2、测试数据2

10

6、结果输出及分析

11 6.

1、测试数据1的结果

11 6.1.

1、词法分析:

11 6.1.

2、四元式

12 6.

2、测试数据2的结果

13 6.2.

1、词法分析

13 6.2.

2、语法分析

14 6.2.

3、四元式

15

7、软件运行环境及限制

15

8、心得体会

16

9、参考文献

16

1、课程设计的目的 计算机使用的语言可以分为3个层次:高级语言层、汇编语言层和机器语言层.而它们之间的转化都需要编译程序来翻译和解释.解释程序对源程序逐句的翻译执行,目标代码只执行一次,若需重新执行,则必须重新解释程序. 编译的阶段:词法分析、语法分析、语义分析与中间代码的生成、代码优化和目标代码生成等阶段.通常所说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序).如果源语言诸如C、VC++以及 java等这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序.所以说学会和掌握编译原理是我们计算机学子想在以后的计算机领域中游刃有余的一座宏伟的桥梁. 现在对于我们还处在大学摇篮里的学生来说,编译原理课程设计未尝不是一次检验和掌握计算机技能的机会,也为我们以后的人生工作有一定的帮助.

2、课程设计的内容及要求 2.

1、课程设计的内容 设计一个简单的Simple语言编译器,我们实现的是符号表的设计、词法分析的设计、语法分析和语义分析的设计,最终产生四元式.词法分析完成token串、查填符号表、检查词法错误以及判断其符号的Ascii码的范围,如:注释未封闭、非法字符(若中文方式的括弧())以及超过Ascii码范围的字符(若NULL)等;

并进行错误处理并定出错误的位置和符号.语法分析是为了检查语法错误:检查的有program语句、赋值语句(:=)、begin语句、for语句、while语句、if语句、call语句,以及integer程序体、real程序体、procedure程序体等,还有的是 符号的缺少:有了左括弧而没有右括弧等.并确定语法错误所在位置.语义分析可产生 中间代码和产生四元式:如for循环、while循环、if语句、call语句等. 2.

2、课程设计的要求 2.2.

1、设计符号表 确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字.要考虑能够存储有关名字的信息,并可以高效地完成如下操作: a.查找:根据给定的名字,在符号表中查找其信息.如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;

b.删除:从符号表中删除给定名字的表项. 2.2.

2、设计词法分析器 设计各单词的状态转换图,并为不同的单词设计种别码.将词法分析器设计成供语法分析器调用的子程序.功能包括: a.?具备预处理功能.将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;

b.? 能够拼出语言中的各个单词;

c.? 将拼出的标识符填入符号表;

d.? 返回(种别码, 属性值). 2.2.

3、语法分析与中间代码产生器 要求用LL1 、递归下降、算符优先分析法、SLR分析法等方法之一或若干方法,实现对表达式、各种说明语句、控制语句进行语法分析. 若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;

对可执行语句,应产生出四元式中间代码并填写到三地址码表中;

若语法错误,要求指出出错性质和出错位置(行号).出错处理应设计成一个出错处理子程序.

3、实现原理 3.

1、符号表 3.1.

1、字符集的定义

1 .::=|| 2.〈字母〉::=A|B|…|Z|a|b|…|z 3.::=0|1|2|…|9 4. 3.1.

2、单词集的定义 5.〈单词集〉::=|||| 6.::=and|begin|call|case|do|else|end|false|for| if|of|procedure|program|real|var|whie 7.<

双界符>

8.<

标识符>

::=|| 9.::=|||| 10.::=| 11.::=true|flase 12.::='

除{'

}外的任意字符串'

13.::= 14.::=. 3.1.

3、程序定义 15.::=program 3.

2、词法分析 3.2.

1、填符号表 查填符号表, 生成token字(种别码,符号表入口地址) 源程序 对上图进行解释: 1.1读一行源程序并打印1.2 读一个非空字符1.3 对单词分类1.4 识别标识符1.5 识别常数1.6 处理注释1.7 识别界限符1.8 识别字符常数1.9 输出token 3.2.

2、识别单词 对源程序进行识别单词:若是标识符和常数填入符号表,其他写入token文件,并提示错误信息. 编译程序首先要识别出源程序中每个单词,然后再分析每个语句并翻译其意义.而识别单词的任务是词法分析程序完成的.它把识别出来的单词变成机内表示形成式交给语法分析程序. 3.

3、语法分析 分析语言句子的方法,分为自顶向下和自底向上两种.语法分析过程就是为语句构造一颗倒立语法树的过程.若分析程序从属的根部开始,逐步为某语句构造出一颗语法树,并使得该语句内的各个单词(token字)都从左到右,依次地位于该书的叶结点上,此即自顶向下,与自底向上相反.编译程序在语法分析阶段应尽量发现更多的语法错误,并指出各错误的位置.而语法分析的错误处理方法有:忽略方式和删除符号. 3.

4、语义分析 在分析阶段的过程中,编译程序已记录了源程序中各种有用的信息(如符号表、语法树等),为代码生成打下了基础.中间代码生成的任务就是把源程序改造成个格式统一的中间代码形势.在此基础上才能进行优化和目标代码的生成.而在语法分析的过程中已经处理了错误,那么根据规定,指出错误的位置.

4、算法实现流程图 4.

1、词法分析流程图 void CCompiler::CiFaFengXi() 输入:m_aSourse 输出:m_tCifa 功能:从m_aSourse中依次取出字符,进行词法分析,结果保存于m_tCifa. 动态联系:m_pCurCh,m_ntCifaLen 4.

2、语法分析流程图 void CCompiler::YuFaFengXi() 输入:m_tCifa 输出:m_nErrorAddress,m_ErrorNum 功能:从m_tCifa中取出单词,进行语法分析,得到出错码. 动态联系:m_pCurSym 4.

3、语义分析流程图 void CCompiler::YuYiFengXi() 输入:m_tCifa 输出:m_nErrorAddress,m_ErrorNum,quad 功能:从m_tCifa中取出单词,进行语义分析,得到出错码,四元式表. 动态联系:m_pCurSym,yuyivar InterfaceType * CCompiler::GetTable() 功能:返回各种表. struct InterfaceType { CifaResult * * LexicalDuad;

//词法分析二元式,指向词法分析结果表(CiFaResult * table[10000])首结点(即=table),表从0开始,以type=-1的结点结束. quadtype * SemanticQuad;

//语义分析四元式,指向语义分析结果表(quadtype table[3000])首结点(即=table), 定义同指导书,表从1开始,以op=0的结点结束. char * SourseBuffer;

//源程序缓冲区,指向源文件缓冲区,缓冲区大小30'

000字节,NULL结尾,回车0dh,0ah占2字节. USER_TYPE_cha100 ........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题