编译原理课程设计--将FOR语句转换成四元式的程序实现.docx

上传人:b****1 文档编号:264805 上传时间:2022-10-08 格式:DOCX 页数:22 大小:282.19KB
下载 相关 举报
编译原理课程设计--将FOR语句转换成四元式的程序实现.docx_第1页
第1页 / 共22页
编译原理课程设计--将FOR语句转换成四元式的程序实现.docx_第2页
第2页 / 共22页
编译原理课程设计--将FOR语句转换成四元式的程序实现.docx_第3页
第3页 / 共22页
编译原理课程设计--将FOR语句转换成四元式的程序实现.docx_第4页
第4页 / 共22页
编译原理课程设计--将FOR语句转换成四元式的程序实现.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

编译原理课程设计--将FOR语句转换成四元式的程序实现.docx

《编译原理课程设计--将FOR语句转换成四元式的程序实现.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计--将FOR语句转换成四元式的程序实现.docx(22页珍藏版)》请在冰豆网上搜索。

编译原理课程设计--将FOR语句转换成四元式的程序实现.docx

编译原理实验报告

设计题目 将FOR语句转换成四元式的程序实现

学生姓名 学号 专业班级计算机科学与技术08—3班

指导教师

2010 年 12 月 25日

目 录

引言 2

第一章 概述 3

1.1设计内容 3

1.2设计要求 3

第二章 设计的基本原理 3

2.1词法分析 3

2.2语法分析 3

2.3语义分析 3

2.4文法描述 3

2.5属性文法描述 4

2.6语法分析方法描述 5

2.7操作符优先级 6

2.8中间代码形式描述 6

2.9中间代码序列的结构设计 7

第三章 程序设计 7

3.1总体方案设计 7

3.2各模块设计 8

第4章 程序测试 9

4.1测试方法 9

4.2测试结果 9

第五章 结论 16

参考文献 17

附录 程序清单 17

18

合肥工业大学课程设计任务书

设计题目

将FOR语句转换成四元式的程序实现

成绩

主要内容

设计内容及要求:

设计一个语法制导翻译器,将FOR语句翻译成四元式。

要求:

先确定一个定义FOR语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。

对用户输入的任意一个正确的FOR语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。

指导教师意见

该生能按时完成课程设计任务书所规定的程序设计,综合运用所学知识独立分析和解决问题的能力。

程序设计方案。

论文论述,文理,格式。

程序运行结果。

程序验收时回答问题。

签名:

第一章概述

1.1设计内容

设计一个语法制导翻译器,将FOR语句翻译成四元式。

1.2设计要求

先确定一个定义FOR语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。

对用户输入的任意一个正确的FOR语句,程序将其转换成四元式输出

(可按一定格式输出到指定文件中)。

第二章设计的基本原理

2.1词法分析

设计词法分析算法,每当语法分析程序需要一个单词时,则调用该算法函数。

词法分析程序每调用一次,便从源程序文件中读入一些字符,直到识别出一个单词,送给语法分析器

2.2语法分析

采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。

若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子。

2.3语义分析

在语法分析的同时可由语法分析程序调用相应的语义子程序进行语义处理,完成附加在所使用的产生式上的语义规则描述,并生成四元式的中间代码形式。

2.4文法描述

递归下降法要求文法满足LL

(1)文法,则消除左递归后的文法如下:

start→spsceof

spsc→for[parse;parse;parse]{spsclist}

| e

list→parse;list

| e

parse→cdexprmorecdexprsmorecdexprs→=cdexprmorecdexprs

| e

cdexpr→cdsexprmorecdsexprsmorecdsexprs→||cdsexprmorecdsexprs

| e

cdsexpr→cdtermmorecdtermsmorecdterms→&&cdtermmorecdterms

| e

cdterm→cdstermmorecdstermsmorecdsterms→==cdstermmorecdsterms

|!

=cdstermmorecdsterms

| e

cdsterm→exprmoreexprsmoreexprs→< exprmoreexprs

|<=exprmoreexprs

|> exprmoreexprs

|>=exprmoreexprs

| e

expr→termmoretermsmoreterms→+termmoreterms

|-termmoreterms

| e

term→factormorefactorsmorefactors→*factormorefactors

|/factormorefactors

| e

factor→!

factor

|(cdexpr)

|id

|num

图1FOR循环语句文法描述

2.5属性文法描述

将语义规则附加在文法产生式的合适位置上,构成属性文法如下:

start→spsceof

spsc→for[parse;parse;parse]{spsclist}

| e

list→parse;list

| e

parse→cdexprmorecdexprs

morecdexprs→=cdexpr{print(“=”)}morecdexprs

| e

cdexpr→cdsexprmorecdsexprs

morecdsexprs→||cdsexpr {print(“||”)} morecdsexprs

| e

cdsexpr→cdtermmorecdterms

morecdterms→&&cdterm {print(“&&”)}morecdterms

| e

cdterm→cdstermmorecdsterms

morecdsterms→==cdsterm{print(“==”)}morecdsterms

|!

=cdsterm{print(“!

=”)}morecdsterms

| e

cdsterm→exprmoreexprs

moreexprs→< expr{print(“<”)}moreexprs

|<=expr{print(“<=”)}moreexprs

|> expr{print(“>”)}moreexprs

|>=expr{print(“>=”)}moreexprs

| e

expr→termmoreterms

moreterms→+term{print(“+”)}moreterms

|-term{print(“-”)}moreterms

|e

term→factormorefactors

morefactors→*factor{print(“*”)}morefactors

|/factor{print(“/”)}morefactors

|e

factor→!

factor {print(“!

”)}

|(cdexpr)

|id {print(id.lexeme)}

|num {print(num.value)}

图2FOR循环语句属性文法描述

2.6语法分析方法描述

递归下降分析方法是一种自顶向下语法分析方法,其目的是从文法的开始符号开始,根据输入字符串进行最左推导,试图推导出给定的字符串。

或者说,从根节点(文法开始符号)开始,自上而下,从左到右地为输入字符串建立一棵语法树,并以预先确定的顺序创建语法树的节点。

递归下降分析法可能需要回溯,即需要重复地扫描输入。

递归子程序法的实现思想是对应每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,能够按照LL

(1)形式唯一地确定选择某个候选式进行推导,因此首先要消除左递归。

其文法及属性文法如图1和图2所示。

由于递归下降法对每个过程可能存在直接或间接的递归调用,所以对某个过程在退出之前可能又要被调用,因此有些信息需要保留,通常在入口时需保留某些信息,出口时需恢复。

由于递归过程是遵循先进后出规律,通常开辟栈来处理。

2.7操作符优先级

优先级

操作符

类型

操作对象的个数

结合性

1

()

逻辑运算符

——

左—>右

2

!

逻辑非运算符

单目运算符

右—>左

3

*,/

算术运算符

双目运算符

左—>右

4

+,-

算术运算符

双目运算符

左—>右

5

<,<=,>,>=

关系运算符

双目运算符

左—>右

在对for循环语句进行翻译时,涉及到对赋值表达式和布尔表达式语句的翻译。

在文法的描述中给出了算术运算符、关系运算符和逻辑运算符之间的优先级关系,其结合性由下表所示:

6

==,!

=

关系运算符

双目运算符

左—>右

7

&&

逻辑与运算符

双目运算符

左—>右

8

||

逻辑或运算符

双目运算符

左—>右

9

=

赋值运算符

双目运算符

右—>左

2.8中间代码形式的描述

常见的中间代码形式有逆波兰记号,三元式,四元式和树形表示。

本课题设计输出的中间代码的表示方法是四元式。

它是带有四个域的记录结构,这四个域分别称为算符op,第一运算对象arg1,第二运算对象arg2及结果

result。

域op包含一个代表运算符的内部码。

例如x=yopz的四元式表示为(op,y,z,x),即将y置于arg1域,

z置于arg2域,x置于result域,=置于算符域op,如果op是单目运算符,例如非‘!

’(x=!

y)的四元式表示形式中不用填arg2。

通常,四元式中的arg1,arg2和result的内容都是一个指针,此指针指向有关名字的符号表入口。

这样,临时变量名也要填入符号表中。

2.9中间代码序列的结构设计

parse1

型如for[ parse1;parse2;parse3]{list}的中间代码序列的结构设计如下:

TRUE

FALSE

list

parse3

parse2

END

图3中间代码序列结构设计

第三章程序设计

3.1总体方案设计

源文件

中间代码

语法分析

出错处理

语义分析

词法分析

本程序采用递归下降的方法实现FOR循环语句的翻译,并以四元式的中间代码形式输出。

经过词法分析,语法分析,同时执行语法制导翻译将中间结果表达出来,然后通过一个函数转化成要求的四元式结构的中间代码。

上述的这个过程在一遍扫描过程中完成:

在语法分析的过程中调用词法分析来不断的分解出下一个句柄;在用递归下降方法进行语法分析的同时进行中间形式数据的保存,在分析出操作符号的同时结合当前栈中的数据输出四元式。

3.2各模块方案设计

程序中各阶段的功能如下:

(1)词法分析阶段

对源程序流进行扫描,每识别出一个单词,若是标识符,则到符号表中查找,如果符号表中没有此标识符的记录,那么将此标识符插入符号表。

最后按照单词其所属的类别,把类标识返回,作为语法分析阶段的输入。

词法分析算法在symr.h头文件中:

voidsymbolnum();

voidsymbolchar();voidsymbolothers();intSymbolanalysis();

(2)语法及语义分

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1