- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一 、 实验目的
通过在实验二的基础上,增加中间代码生成部分,使程序能够
对实验二中的识别出的赋值语句,if语句和while语句进行语义分析,生成四元式中间代码。
二 、 实验方法
实验程序由c语言完成,在Turboc 2.0环境中调试通过。
语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。当语法分析结束时,语义分析也就结束了。
在本实验程序中,当语法分析部分识别出语法正确的句子时,就进入content函数(当语法分析识别出不正确的句子时,不进入content函数,也就是不进行语义分析),然后根据句子的类型进行分类,进入不同的语义处理部分。
对于赋值语句,关键是产生正确的处理算术表达式E的四元式。程序中的ec函数的功能就是产生算术表达式的四元式,在ec函数中使用了两个栈idshed,opshed,分别是算术表达式的数据栈和符号栈。每次提取一个数字和一个算符,然后将算符与与栈顶算符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相等的话则将当前栈顶元素进行合并,产生四元式。直至整个算术表达式结束。其中还有一些细节问题,具体的做法可以参看程序。
对于实验给定的if语句的文法格式,条件判断式C只中可能是或者=两种关系,不可能是布尔表达式,这样程序就简单的多了。
通过ec函数可以产生条件判断式C中的E的四元式,然后只要加上转向四元式就可以了。本实验程序中只给出真出口的转向四元式,没有给出假出口的转向四元式,这在实际中是不可以的,但在本实验中,实际上是对每条独立的语句进行语法分析,给出假出口转向四元式实际上意义不大,而且假出口转向语句的转移目标必须要到整个语句分析结束以后才可以知道,这样就要建立栈,然后回填,这样会使程序复杂很多,所以没有加上假出口转向四元式。
对于while语句,具体的做法和if语句差不多,所不同的是当while语句结束时,要多出一条无条件转向四元式,重新转到条件判断式C的第一条四元式。当要产生无条件转向四元式时,它的转向目标C的第一条四元式已经产生了,所以具体的做起来是不太困难的。只要记下当前while中的C的第一条四元式的位置,填上就可以了。
整个程序的结束是当读入“ . ”时,程序就中止。
程序中还有很多细节问题,具体的可以后面的附录:程序的完整代码。
三 、 测试程序
ff:=6+6*6-;
if sl89+56*67
then f:=7*7+4;
ff:=6+6*6-6%4+8;
if sl+78*7689*56+67
then while a-798+45*45 do f:=7*7+4;
.
四 、 运行结果
首先对测试程序进行语法分析,识别出正确的句子,当识别出正确的句子时,就对当前句子进行语义分析,而语法不正确的句子不进行语义分析。
ff:=6+6*6- Error(4):Except ID or NUM
; Error(2):Syntax error
if sl89+56*67 then f:=7*7+4; success!!!
(1) [ *, 56, 67, T1 ]
(2) [ +, 89, T1, T2 ]
(3) [j, sl, T2, (4) ]
(4) [ *, 7, 7, T3 ]
(5) [ +, T3, 4, T4 ]
(6) [ :=, T4, -, f ]
ff:=6+6*6-6%4+8; success!!!
(7) [ *, 6, 6, T5 ]
(8) [ +, 6, T5, T6 ]
(9) [ %, 6, 4, T7 ]
(10) [ -, T6, T7, T8 ]
(11) [ +, T8, 8, T9 ]
(12) [ :=, T9, -, ff ]
if sl+78*7689*56+67 then while a-798+45*45 do f:=7*7+4; success!!!
(13) [ *, 78, 76, T10 ]
(14) [ +, sl,T10, T11 ]
(15) [ *, 89, 56, T12 ]
(16) [ +,T12, 67, T13 ]
(17) [j, T1
文档评论(0)