编译原理实验三:中间代码生成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)再通过一些语义规则,大致就可以做出来。在控制流语句跳转过程中,因为考虑到要修改文法所以我并没有采用回填技术,因此在填跳转状态需要多次遍历四元式序列。在本学期编译原理实践中,花了很多时间写程序,但是收获也是很大的,自身写程序的能力也得到了一定的锻炼,也对编译原理这门课也有了深刻的体会。实验虽然做的不是很完美,但是我们已经尽力了,总之,受益匪浅。

相关文档
最新文档