编译原理实验三:中间代码生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理
——语义分析
成员:杨霞 030802107
王日日 030802139
方艳丽 030802102
实验三:语义分析:生成中间代码
一、实验目的
通过语法制导或翻译模式生成中间代码。
二、实验内容
在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出.
三、实验环境
Windows microsoft visual c++ 6.0
四.实验原理
三地址码的几种常见指令:
1.X=Y OP Z 的赋值指令,其中OP 是一个双目运算符或逻辑运算符。
2.X= Y 的复制指令。
3.无条件转移指令 GOTO L 把下一步要执行的带有标号L的三地址指令
4.IF X GOTO L 或 IF FALSE X GOTO L的条件转移指令
5.IF X RELOP Y GOTO L的条件转移指令。
三地址码四元式
实验环境:windows microsoft visual c++
语法制导定义:
控制流语句的语法制导定义:
实验代码分析:
struct midcode//四元式结构;
{
int label;//存放标号;
char op;//存放操作符;
char arg1;//存放操作数1;
char arg2;//存放操作数2;
char result;//存放目的操作数(转移标号)
}m_midcode[100];
如何实现语句的跳转:主要利用了语义规则与规约过程的结合;
例如:
Label为四元式产生的新标号;
Mnew 为四元式中最新的标号;
case 9:tab1=t-1;
while(tab1--)
{
if(m_midcode[tab1].op=='>'&& (int)(m_midcode[tab1].result)==0)
{
m_midcode[tab1].result=(char)m_midcode[tab1+2].label;/E.true=newlabel
m_midcode[tab1+1].result=(char)(m_midcode[tab1+2].label+1);/E.false=newlabel
tab2=tab1;
for(;tab2 if(m_midcode[tab2].op=='g'&&(int)m_midcode[tab2].result==0) m_midcode[tab2].result=(char)(mnew-1);//S1.next=s2.next=S.next break ; } 实验结果: 心得体会:四元式序列是编译原理最后一个实验,最后的实验也要建立在之前两个实验的基础上。但相对于之前的两个实验,语义分析比较简单一点,根据第二个实验语法分析LR(1)再通过一些语义规则,大致就可以做出来。在控制流语句跳转过程中,因为考虑到要修改文法所以我并没有采用回填技术,因此在填跳转状态需要多次遍历四元式序列。在本学期编译原理实践中,花了很多时间写程序,但是收获也是很大的,自身写程序的能力也得到了一定的锻炼,也对编译原理这门课也有了深刻的体会。实验虽然做的不是很完美,但是我们已经尽力了,总之,受益匪浅。