编译原理课程设计--将FOR语句转换成四元式的程序实现Word文档下载推荐.docx
《编译原理课程设计--将FOR语句转换成四元式的程序实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计--将FOR语句转换成四元式的程序实现Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
3.2各模块设计 8
第4章 程序测试 9
4.1测试方法 9
4.2测试结果 9
第五章 结论 16
参考文献 17
附录 程序清单 17
18
合肥工业大学课程设计任务书
设计题目
将FOR语句转换成四元式的程序实现
成绩
主要内容
设计内容及要求:
设计一个语法制导翻译器,将FOR语句翻译成四元式。
要求:
先确定一个定义FOR语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的FOR语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。
指导教师意见
该生能按时完成课程设计任务书所规定的程序设计,综合运用所学知识独立分析和解决问题的能力。
程序设计方案。
论文论述,文理,格式。
程序运行结果。
程序验收时回答问题。
签名:
第一章概述
1.1设计内容
1.2设计要求
对用户输入的任意一个正确的FOR语句,程序将其转换成四元式输出
(可按一定格式输出到指定文件中)。
第二章设计的基本原理
2.1词法分析
设计词法分析算法,每当语法分析程序需要一个单词时,则调用该算法函数。
词法分析程序每调用一次,便从源程序文件中读入一些字符,直到识别出一个单词,送给语法分析器
2.2语法分析
采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。
若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子。
2.3语义分析
在语法分析的同时可由语法分析程序调用相应的语义子程序进行语义处理,完成附加在所使用的产生式上的语义规则描述,并生成四元式的中间代码形式。
2.4文法描述
递归下降法要求文法满足LL
(1)文法,则消除左递归后的文法如下:
start→spsceof
spsc→for[parse;
parse;
parse]{spsclist}
| e
list→parse;
list
parse→cdexprmorecdexprsmorecdexprs→=cdexprmorecdexprs
cdexpr→cdsexprmorecdsexprsmorecdsexprs→||cdsexprmorecdsexprs
cdsexpr→cdtermmorecdtermsmorecdterms→&
&
cdtermmorecdterms
cdterm→cdstermmorecdstermsmorecdsterms→==cdstermmorecdsterms
|!
=cdstermmorecdsterms
cdsterm→exprmoreexprsmoreexprs→<
exprmoreexprs
|<
=exprmoreexprs
|>
expr→termmoretermsmoreterms→+termmoreterms
|-termmoreterms
term→factormorefactorsmorefactors→*factormorefactors
|/factormorefactors
factor→!
factor
|(cdexpr)
|id
|num
图1FOR循环语句文法描述
2.5属性文法描述
将语义规则附加在文法产生式的合适位置上,构成属性文法如下:
start→spsceof
parse→cdexprmorecdexprs
morecdexprs→=cdexpr{print(“=”)}morecdexprs
cdexpr→cdsexprmorecdsexprs
morecdsexprs→||cdsexpr {print(“||”)} morecdsexprs
cdsexpr→cdtermmorecdterms
morecdterms→&
cdterm {print(“&
”)}morecdterms
cdterm→cdstermmorecdsterms
morecdsterms→==cdsterm{print(“==”)}morecdsterms
=cdsterm{print(“!
=”)}morecdsterms
cdsterm→exprmoreexprs
moreexprs→<
expr{print(“<
”)}moreexprs
=expr{print(“<
=”)}moreexprs
expr{print(“>
=expr{print(“>
expr→termmoreterms
moreterms→+term{print(“+”)}moreterms
|-term{print(“-”)}moreterms
|e
term→factormorefactors
morefactors→*factor{print(“*”)}morefactors
|/factor{print(“/”)}morefactors
factor {print(“!
”)}
|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
parse3
parse2
END
图3中间代码序列结构设计
第三章程序设计
3.1总体方案设计
源文件
中间代码
语法分析
出错处理
语义分析
词法分析
本程序采用递归下降的方法实现FOR循环语句的翻译,并以四元式的中间代码形式输出。
经过词法分析,语法分析,同时执行语法制导翻译将中间结果表达出来,然后通过一个函数转化成要求的四元式结构的中间代码。
上述的这个过程在一遍扫描过程中完成:
在语法分析的过程中调用词法分析来不断的分解出下一个句柄;
在用递归下降方法进行语法分析的同时进行中间形式数据的保存,在分析出操作符号的同时结合当前栈中的数据输出四元式。
3.2各模块方案设计
程序中各阶段的功能如下:
(1)词法分析阶段
对源程序流进行扫描,每识别出一个单词,若是标识符,则到符号表中查找,如果符号表中没有此标识符的记录,那么将此标识符插入符号表。
最后按照单词其所属的类别,把类标识返回,作为语法分析阶段的输入。
词法分析算法在symr.h头文件中:
voidsymbolnum();
voidsymbolchar();
voidsymbolothers();
intSymbolanalysis();
(2)语法及语义分