文档库 最新最全的文档下载
当前位置:文档库 › 中间代码生成具体实验过程含代码

中间代码生成具体实验过程含代码

中间代码生成具体实验过程含代码
中间代码生成具体实验过程含代码

实验三中间代码生成

学号:1152185;姓名:马小军

实验目的

1.了解并掌握中间代码的生成过程和作用

2.了解并掌握四元式

3.体会属性文法在中间代码生成过程中的作用

实验环境

Windows7操作系统vs2010编程环境

实验内容

从文件中读入表达式,输出其四元式的结果序列

本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式

实验原理

三、以逆波兰式为例的实验设计思想及算法

(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。

(2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。

(3)如果不是数字,该字符则是运算符,此时需比较优先关系。

做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。

(4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。

下面给出算法流程图

实验步骤

打开并运行软件

根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可)

运行输出结果

例如将以下源文件放入test.txt

运行结果

a:=b*c+b*d

思考

同样的思路对算法进行适当改动就可以生成其它形式的中间代码

【其他部分】

设计原理和算法思想参考

《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等

附录代码

#include

#include

#include

#include

using namespace std;

#define MAX 100

int m=0,sum=0;//sum用??于?¨2计?算?运?算?符¤?的ì?个?数oy

//m用??于?¨2标à¨o记?输o?入¨?表à¨a达??式o?中D字á?符¤?的ì?个?数oy

char JG='A';

char str[MAX];//用??于?¨2存??输o?入¨?表à¨a达??式o?

int token=0;//左á¨?括¤?§号?的ì?标à¨o志?

/***********用??于?¨2更¨1改?计?算?后¨?数oy组á¨|中D的ì?值|ì**************/

void change(int e)

{

int f=e+2;

char ch=str[f];

if(ch>='A'&&ch<='Z')

{

for(int l=0;l

{

if(str[l]==ch)

str[l]=JG;

}

}

if(str[e]>='A'&&str[e]<='Z')

{

for(int i=0;i

{

if(str[i]==str[e])

str[i]=JG;

}

}

}

void chengchuchuli(int i,int m)

{

i++;

for( ;i<=m-1;i++)//处?|理¤¨a乘?除y运?算?

{

if(str[i]=='*'||str[i]=='/')

{

cout<<"("<

change(i-1);

str[i-1]=str[i]=str[i+1]=JG;

sum--;

JG=(char)(int)JG++;

}

}

}

void jiajianchuli(int j,int m)

{

j++;

for( ;j<=m-1;j++)//处?|理¤¨a加¨?减?运?算?

{

if(str[j]=='+'||str[j]=='-')

{

cout<<"("<

change(j-1);

str[j-1]=str[j]=str[j+1]=JG;

sum--;

JG=(char)(int)JG++;

}

}

}

/*扫|?§描¨¨一??遍à¨|从?¨?文?件t中D读¨¢入¨?表à¨a达??式o?*/

void scan(FILE *fin)

{

int p[MAX];

char ch='a';

int c=-1,q=0;

while(ch!=EOF)

{

ch=getc(fin);

while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);//消?除y空?格?和¨a换?行D 符¤?

str[m++]=ch;

if(ch=='='||ch=='+'||ch=='-'||ch=='*'||ch=='/') sum++;

else if(ch=='(')

{

p[++c]=m-1;

}

else if(ch==')')

{

q=m-1;

chengchuchuli(p[c],q);//从?¨?左á¨?括¤?§号?处?|理¤¨a到ì?又??括¤?§号?

jiajianchuli(p[c],q);

JG=(char)(int)JG--;

str[p[c]]=str[m-1]=JG;

c--;

JG=(char)(int)JG++;

}

}

}

void sanyuanshi()

{

for(int i=0;i<=m-1;i++)//处?|理¤¨a乘?除y运?算?

{

if(str[i]=='*'||str[i]=='/')

{

cout<<"("<

change(i-1);

str[i-1]=str[i]=str[i+1]=JG;

sum--;

JG=(char)(int)JG++;

}

}

for(int j=0;j<=m-1;j++)//处?|理¤¨a加¨?减?运?算?

{

if(str[j]=='+'||str[j]=='-')

{

cout<<"("<

change(j-1);

str[j-1]=str[j]=str[j+1]=JG;

sum--;

JG=(char)(int)JG++;

}

}

for(int k=0;k<=m-1;k++)//处?|理¤¨a赋3值|ì运?算?

{

if(str[k]=='=')

{

JG=(char)(int)--JG;

cout<<"("<

sum--;

change(k+1);

str[k-1]=JG;

}

}

}

void main(){

char in[MAX]; //用??于?¨2接¨?收o?输o?入¨?输o?出?文?件t名?

FILE *fin; //用??于?¨2指?向¨?输o?入¨?输o?出?文?件t的ì?指?针?

cout<<"请?输o?入¨?源??文?件t名?(ê?§包?¨1括¤?§后¨?缀áo名?)ê?"<

// scanf("%s",in);

cin>>in;;

if ((fin=fopen(in,"r"))==NULL) //判D断?输o?入¨?文?件t名?是o?否¤?正y确¨?¤

{

cout<<"打?¨?开a词?¨o法¤?§分¤?析?输o?入¨?文?件t出?错?¨a!"<

}

cout<<"*********三¨y元a式o?如¨?下?:êo*********"<

scan(fin);//调ì??用??函?¥数oy从?¨?文?件t中D读¨¢入¨?表à¨a达??式o?

sanyuanshi();

if(sum==0) printf("成¨|功|!ê?");

else printf("有?D错?¨a误¨?!ê?");

//关?闭à?文?件t

fclose(fin);

system("pause");

}

从simulink模型到PLC代码的自动生成功能

从simulink模型到PLC代码的自动生成是MATLAB2010提供的功能,目前支持的PLC编程工具有: CoDeSys2.3, CoDeSys3.3, RSLogix5000, B&R Automation Studio 3.0, PLCOpen XML, BeckhoffTwinCat 2.11以及Generic。 本文介绍了MATLAB生成TwinCat 2.11的ST文档的方法,并使用TwinCat 2.11建立相应的工程项目。 2. 使用MATLAB/simulink生成PLC的st语言功能函数的方法 MATLAB提供了很多demo一备参考,本文以MATLAB demo中的plcdemo_simple.mdl为例。首先在MATLAB命令行中执行命令demo,选择simulink PLC coder->Demos->Basic Introductions and Examples->Generating Structured Text for a Simple Simulink Subsystem,然后打开该模型。 打开参数配置面板(Simulation->Configuration Parameters),进入PLC Coder的选项页,将Targer IDE选为BeckhoffTwinCat 2.11。然后应用。 回到模型,右键点击SimpleSystem,选择PLC Coder->Generate Code For Subsystem。如果没有错误,将在当前目录下生成plcdemo_simple.exp文件及诊断对话框。该文件即为ST语言的PLC文档。如下

实验五 编译 用语法制导方式生成中间代码生成器

实验5 用语法制导方式生成中间代码生成器 一、实验目的 掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。 二、实验内容 在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。 三、实验要求 1. 个人完成,提交实验报告。实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。 2. 实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。 例如,程序片断 对应的中间代码为:

四、实验过程 本次实验运用flex和bison工具进行中间代码的生成。并自动生成中间代码。 1.首先创建一个example文件夹,该文件夹中包含有flex.exe 2.用文本编译器编辑相应的flex文件mylex.l,此次mylex.l可以在上次实验的 l文件上做一些修改,再利用flex将l文件生成相应的lex.yy.c程序,mylex.l 的代码如下所示: mylex.l %{ #include "myyacc.tab.h" %} delim [ \t\n\r] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter}|{digit})* integer {digit}+ exponent E[+-]?{integer} number {integer}{exponent}? real integer(\.integer)?{exponent}? %option noyywrap %% "<"|"<="|">"|">="|"!="|"==" { filloperator(&yylval, yytext); return( REL); }

编译原理实验:目标代码的生成

5. 目标代码生成 本章实验为实验四,是最后一次实验,其任务是在词法分析、语法分析、语义分析和中间代码生成程序的基础上,将C 源代码翻译为MIPS32指令序列(可以包含伪指令),并在SPIM Simulator上运行。当你完成实验四之后,你就拥有了一个自己独立编写、可以实际运行的编译器。 选择MIPS作为目标体系结构是因为它属于RISC范畴,与x86等体系结构相比形式简单便于我们处理。如果你对于MIPS体系结构或汇编语言不熟悉并不要紧,我们会提供详细的参考资料。 需要注意的是,由于本次实验的代码会与之前实验中你已经写好的代码进行对接,因此保持一个良好的代码风格、系统地设计代码结构和各模块之间的接口对于整个实验来讲相当重要。 5.1 实验内容 5.1.1 实验要求 为了完成实验四,我们建议你首先下载并安装SPIM Simulator用于对生成的目标代码进行检查和调试,SPIM Simulator的官方下载地址为:https://www.wendangku.net/doc/42555788.html,/~larus/spim.html。这是由原Wisconsin-Madison的Jame Larus教授(现在在微软)领导编写的一个功能强大的MIPS32汇编语言的汇编器和模拟器,其最新的图形界面版本QtSPIM由于使用了Qt组件因而可以在各大操作系统平台如Windows、Linux、Mac等上运行,推荐安装。我们会在后面介绍有关SPIM Simulator的使用方法。 你需要做的就是将实验三中得到的中间代码经过与具体体系结构相关的指令选择、寄存器选择以及栈管理之后,转换为MIPS32汇编代码。我们要求你的程序能输出正确的汇编代码。“正确”是指该汇编代码在SPIM Simulator(命令行或Qt版本均可)上运行结果正确。因此,以下几个方面不属于检查范围: 1)寄存器的使用与指派可以不必遵循MIPS32的约定。只要不影响在SPIM Simulator中的 正常运行,你可以随意分配MIPS体系结构中的32个通用寄存器,而不必在意哪些寄存器应该存放参数、哪些存放返回值、哪些由调用者负责保存、哪些由被调用者负责保存,等等。 2)栈的管理(包括栈帧中的内容及存放顺序)也不必遵循MIPS32的约定。你甚至可以使 用栈以外的方式对过程调用间各种数据的传递进行管理,前提是你输出的目标代码(即MIPS32汇编代码)能运行正确。

程序代码自动生成系统的设计与实现

万方数据

万方数据

万方数据

万方数据

基于敏捷开发的高校网络评教系统 作者:吴衡, WU Heng 作者单位:天水师范学院物理与信息科学学院,甘肃天水,741001 刊名: 计算技术与自动化 英文刊名:Computing Technology and Automation 年,卷(期):2011,30(4) 被引用次数:1次 参考文献(8条) 1.丁增富;葛信勇构建教学质量监控体系努力提高教学质量[期刊论文]-高等农业教育 2004(03) 2.陈莉和谐校园构建于素质教育双效联动[期刊论文]-中国市场 2007(2-3) 3.成奋华;金敏基于敏捷过程的IT项目范围管理的研究与应用[期刊论文]-计算机技术与发展 2010(10) 4.徐诚斌;王金平MVC在ThinkPHP框架中的应用研究 2011(03) 5.赵国栋;黄永中开源软件在高校的应用与推广策略研究[期刊论文]-中国资源综合利用 2007(01) 6.马文龙;高宝成用php实现基于MVC模式的Web应用程序开发 2008(07) 7.原晓林基于B/S教学管理系统的开发与研究[期刊论文]-山西警官高等专科学校学报 2009(04) 8.蓝蔚青;曹剑敏;张帆高校学生网络评教系统的构建与完善[期刊论文]-高等农业教育 2006(06) 引证文献(1条) 1.蒋建洪电子商务系统协同开发实践教学研究[期刊论文]-中国教育信息化·基础教育 2013(5) 本文链接:https://www.wendangku.net/doc/42555788.html,/Periodical_jsjsyzdh201104028.aspx

代码自动生成系统

本钢ERP代码自动生成系统的开发 史洪波 (本钢信息自动化公司软件开发事业部) 摘要:本钢ERP系统维护的工作量大,大部分的页面功能类似。在新增业务需求的情况下,可以利用本系统自动修改和生成JSP、Java、XML、SQL、Properties类型的全部代码,生成的代码可以提供新增、修改、删除、导入、树、打印、查询等基本功能。本系统原理是利用各种页面风格的JSP、Java、XML、SQL等文件作为模板,利用配置参数替换掉文件中可变部分,从而形成多种页面风格通用的代码生成系统。本文总结了本钢ERP中常用的6种页面样式,并用Java语言实现了其代码的自动生成过程,只需书写好DAO文件并在系统中填写少许的配置信息,然后点击按钮即可完成代码的产生,节省时间,提高工作效率。 关键词:ERP Java 代码自动生成 Benxi Steel ERP automatic code generation system Shi Hongbo (Benxi Steel Information & Automation Co.Ltd Software Development Department) ABSTRACT:There are a great deal maintain work in Benxi Iron and Steel Co. Ltd. ERP system, most of the page features are similar. In the case of needing new business, the system can automatically generate and modify all of the codes in many types, such as JSP, Java, Xml, SQL, Properties. Codes provide new, modify, delete, import, tree, print, query, and other basic functions and pride many different page styles by replacing the parameter of file. There are 6 common page styles are summarized in the Benxi Iron and Steel Co. Ltd. ERP, and use java language to achieve the automatic code generation process, just to write the file of DAO in the system and a little configuration information, then click the button to complete the code, saved a lot of time and improved the work efficiency. KEY WORD: ERP Java automatic-code-generation 作者简介: 史洪波,男,出生于1974年7月28日,1998年7月毕业于华东冶金学院工业分析专业,同年到本钢技术中心从事钢铁检验工作。2006年3月调至本钢信息自动化公司软件开发事业部从事软件开发工作。Email:mynameshb@https://www.wendangku.net/doc/42555788.html, 1、引言 本钢ERP系统有着良好的开发规范,命名规则有规律可循,因此在新增业务需求的情况下非常适合用代码自动生成系统来减少开发过程中的工作量,减少了开发人员的Ctrl+C/Ctrl+V操作,节省时间,提高工作效率。本系统原理是利用各种页面风格的JSP、Java、XML、SQL等文件作为模板,利用配置参数替换掉文件中可变部分,从而形成多种页面风格通用的代码生成系统。本系统采用J2SE中的Awt和Swing技术来绘制整个系统的图形界面,使系统界面整洁美观,使用xml文件作为本系统的配置文件,并对XML文件设定了DTD的格式校验,保证XML的格式良好。在系统界面中输入少量的条件即可产生和修改JSP、Java、XML、SQL、Properites等类型的文件,并对已经存在的文件先备份成Bak文件,生成的代码可具有新增、修改、删除、查询、导入、树、打印等功能。由于XML具有便于阅读和理解,可扩展等优点,而DAO文件格式的不规范性,系统中还提供了DAO文件与XML格式的相互转换,转换中使用了XLST技术,简化了转

中间代码生成具体实验过程含代码

实验三中间代码生成 学号:1152185;姓名:马小军 实验目的 1.了解并掌握中间代码的生成过程和作用 2.了解并掌握四元式 3.体会属性文法在中间代码生成过程中的作用 。 实验环境 Windows7操作系统vs2010编程环境 实验内容 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式 实验原理 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。 (3)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。 下面给出算法流程图

实验步骤 打开并运行软件 根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可) 运行输出结果 例如将以下源文件放入test.txt 运行结果 a:=b*c+b*d 思考 同样的思路对算法进行适当改动就可以生成其它形式的中间代码 【其他部分】 设计原理和算法思想参考 《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等

java自动生成代码

1.与数据库建立连接 在DBUtil中设置数据库相关的参数 Class.forName(driverName); conn = DriverManager.getConnection(url, user, password); 2.获得数据库中的所有表 Mapmaps = new HashMap(); PreparedStatement pstate = conn.prepareStatement("show table status"); ResultSet results = pstate.executeQuery(); while (results.next()) { String tableName = results.getString("NAME"); String comment = results.getString("COMMENT"); maps.put(tableName, comment); } 3.获得每个表中的信息

封装一个实体来存储表中的信息 PreparedStatement pstate = conn.prepareStatement("show full fields from " + tableName); ResultSet results = pstate.executeQuery(); List lists = new ArrayList(); while (results.next()) { Column column = new Column(); String field = results.getString("FIELD"); column.setFeildMapper(field); String fieldName = processField(field);

【CN110007962A】一种基于代码自动生成的指令集模拟方法【专利】

(19)中华人民共和国国家知识产权局 (12)发明专利申请 (10)申请公布号 (43)申请公布日 (21)申请号 201910175584.9 (22)申请日 2019.03.08 (71)申请人 浙江大学 地址 310058 浙江省杭州市西湖区余杭塘 路866号 (72)发明人 骆华鲲 蔡铭  (74)专利代理机构 杭州求是专利事务所有限公 司 33200 代理人 邱启旺 (51)Int.Cl. G06F 9/30(2006.01) (54)发明名称 一种基于代码自动生成的指令集模拟方法 (57)摘要 本发明公开了一种基于代码自动生成的指 令集模拟方法。该方法针对目前指令集模拟器人 工开发费时费力的问题,先将指令集信息按特定 编码规则进行保存,再由编码程序解析并提取上 述指令信息。由指令的操作码和各特征段信息, 编码程序可自动生成指令集模拟器的译码模块 代码;由指令执行信息,编码程序可自动生成指 令集模拟器执行模块代码。该方法适用于多种类 型的指令集,能有效降低开发人员的编程工作 量,提高指令集模拟器的开发效率,具有较好的 应用前景。权利要求书1页 说明书3页 附图1页CN 110007962 A 2019.07.12 C N 110007962 A

权 利 要 求 书1/1页CN 110007962 A 1.一种基于代码自动生成的指令集模拟方法,其特征在于,具体包括如下步骤: (1)对目标指令集中所有指令进行编码,得指令编码,并将所有指令编码汇总保存至指令集编码文件中。 (2)读取步骤1的指令集编码文件,汇总所有指令的特征段分布情况,生成指令结构体。 (3)读取步骤1的指令集编码文件,提取所有指令的操作码分布,并按操作码长度对分布作降序排序。依次为所有分布生成相应的译码代码,最终汇总成完整的指令集模拟器译码模块。 (4)读取步骤1的指令集编码文件,提取每条指令的执行信息,根据执行信息生成指令函数,所有指令函数共同组成指令模拟器的执行模块。 (5)指令集模拟器译码模块通过匹配指令操作码确定指令类型,并提取指令各特征段信息。指令集模拟器执行模块根据指令类型,执行指令对应操作。两模块共同组成指令集模拟器。 2.根据权利要求1所述的基于代码自动生成的指令集模拟方法,其特征是,所述步骤1中,指令编码记录了指令的格式信息与执行信息。任意一条指令的编码表示为:NA:指令名 特征段编码 DT:数据类型操作数 EX:指令执行表达式 (DE:延迟周期数) 特征段编码记录指令各特征段的分布情况,编码格式为“特征段名[位置]”。将指令内所有特征段都按上述格式编码,并连接组合,即可得到整条指令的特征段编码。 3.根据权利要求1所述的基于代码自动生成的指令集模拟方法,其特征是,所述步骤2具体为:指令结构体是指令集模拟器运行过程中保存单条指令信息的数据结构,保存指令各特征段信息和指令函数指针。在结构体中生成指令函数指针属性。特征段属性通过下述方法生成:遍历指令集编码文件,归纳整个指令集包含的特征段种类,并统计各特征段长度。若存在同名特征段,其长度按最大值记。根据特征段长度,在指令结构体中定义各特征段同名属性。 4.根据权利要求1所述的基于代码自动生成的指令集模拟方法,其特征是,所述步骤3具体为:提取所有指令的操作码分布,并按操作码长度对分布作降序排序。依次为各操作码分布生成识别语句,且用识别语句包裹该分布下提取指令特征段信息的代码。指令各特征段信息保存在步骤2定义的指令结构体同名属性中。在每条指令的译码代码末尾,对指令结构体的函数指针进行赋值,函数名称统一命名为op_NA,其中NA是编码规则中的指令名。 5.根据权利要求1所述的基于代码自动生成的指令集模拟方法,其特征是,所述步骤4具体为:为每条指令生成一个指令函数,指令函数统一命名为op_NA。所有指令函数均可模块化划分为声明变量、赋值变量、执行操作和结果写回四大模块。其中,指令编码中的DT编码被映射为声明变量和赋值变量模块,EX编码被映射为执行操作模块,DT和DE编码被映射为结果写回模块。 2

中间代码生成-四元式设计

中间代码生成-四元式设计文档 实验任务: 在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。 A-->V:=E V--><标识符> E,E+T|E-T|T T,T*F|T/F|F F,(E)|<标识符> 说明: 标识符的定义参见实验一 程序的功能描述 从文件中读入表达式,输出其四元式的结果序列本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。 程序结构描述 打开文件 成功 N Y 结束 调用scan()函数从 文件读入表达式 输出所读入的表达式 调用生成四元式函数 siyuanshi() 表达式中是否有括号 N Y 处理括号内的

处理乘除加减和赋值运算sum=0 N Y 输出成功输出错误提示 结束 程序测试方案 测试用例一: d=a+b*(3*n)/(b-a) 测试用例二: x=x*(x+y-(x-y)/(z+x)-y)

实验总结 此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。第一次调试通过后程序还存在以下不足: (1) 此程序只能从文件中读入一个表达式,读入多个则 会出错; (2) 所读入的表达式中若含有多于一个括号,程序会出 错; (3) 括号内若多于一个表达式则会出错; (4) 在测试用例二中的分析过程明显是错误的,这足以 看出程序的漏洞很多 但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。 经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。 附录 #include #include #include using namespace std; #define MAX 100 int m=0,sum=0;//sum用于计算运算符的个数 //m用于标记输入表达式中字符的个数 char JG='A'; char str[MAX];//用于存输入表达式

编译原理-分析中间代码生成程序

实验报告 课程名称编译原理 实验学期至学年第学期学生所在系部 年级专业班级 学生姓名学号 任课教师 实验成绩 计算机学院制

开课实验室:年月日 实验题目分析中间代码生成程序 一、实验目的 分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。 二、设备与环境 PC兼容机、Windows操作系统、Turbo Pascal软件等。 三、实验内容 1.分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式。画出Block 子程序的流程图,写出至少两条PL/0程序语句的语法格式。 2.分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程。 使用概要算法来描述语句的代码生成过程。 3.自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。列出 自己编写的源程序和编译后得到的中间代码。 4.从中选择一个语句或表达式,写出代码生成的过程。要求从自己的源程序中 选择一条语句,结合这条语句写出语义分析和代码生成过程。在描述这个过 程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参 数的含义和功能。 四、实验结果及分析 (一)程序标注 levmax = 3; { max depth of block nesting } { 最大允许的块嵌套层数} { 语法分析过程block } { 参数:lev:这一次语法分析所在的层次} { tx:符号表指针} { fsys:用于出错恢复的单词集合} procedure block(lev, tx: integer; fsys: symset); var dx: integer; { data allocation index } { 数据段内存分配指针,指向下一个被分配空间在数据段中的偏移位置} tx0: integer; { initial table index } { 记录本层开始时符号表位置} cx0: integer; { initial code index } { 记录本层开始时代码段分配位置}

中间代码生成实验报告

一、实验目的 通过在实验二的基础上,增加中间代码生成部分,使程序能够对实验二中的识别出的赋值语句,if语句和while语句进行语义分析,生成四元式中间代码。 二、实验方法 实验程序由c语言完成,在Turboc 2.0环境中调试通过。 语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。当语法分析结束时,语义分析也就结束了。 在本实验程序中,当语法分析部分识别出语确的句子时,就进入content函数(当语法分析识别出不正确的句子时,不进入content函数,也就是不进行语义分析),然后根据句子的类型进行分类,进入不同的语义处理部分。 对于赋值语句,关键是产生正确的处理算术表达式E的四元式。 程序中的ec函数的功能就是产生算术表达式的四元式,在ec函数中使用了两个栈idshed,opshed,分别是算术表达式的数据栈和符号栈。每次提取一个数字和一个算符,然后将算符与与栈顶算符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相等的话则将当前栈顶元素进行合并,产生四元式。直至整个算术表达式结束。其中还有一些细节问题,具体的做法可以参看程序。 对于实验给定的if语句的文法格式,条件判断式C只中可能是>或者<=两种关系,不可能是布尔表达式,这样程序就简单的多了。 通过ec函数可以产生条件判断式C中的E的四元式,然后只要加上转向四元式就可以了。本实验程序中只给出真出口的转向四元式,没有给出假出口的转向四元式,这在实际中是不可以的,但在本实验中,实际上是对每条独立的语句进行语法分析,给出假出口转向四元式实际上意义不大,而且假出口转向语句的转移目标必须要到整个语句分析结束以后才可以知道,这样就要建立栈,然后回

目标代码 中间代码生成-四元式设计文档

工程第一神刀公子 编译原理实验 实验名称:中间代码生成程序设计 指导老师:轻语 专业:计算机科学与技术 班级:LOL 学号:0000001 姓名:神刀公子 2008.6.22

实验任务: 在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。 A-->V:=E V--><标识符> E→E+T|E-T|T T→T*F|T/F|F F→(E)|<标识符> 说明: 标识符的定义参见实验一 程序的功能描述 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。

程序结构描述

程序测试方案 测试用例一: d=a+b*(3*n)/(b-a) 测试用例二: x=x*(x+y-(x-y)/(z+x)-y)

实验总结 此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。 第一次调试通过后程序还存在以下不足: (1)此程序只能从文件中读入一个表达式,读入多个则会出错; (2)所读入的表达式中若含有多于一个括号,程序会出错; (3)括号内若多于一个表达式则会出错; (4)在测试用例二中的分析过程明显是错误的,这足以看出程序的漏洞很多 但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。 经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。

目标程序生成

实验八目标程序生成【实验目的】 ?了解目标代码生成阶段在编译处理过程中的功能和作用 ?了解常用的三种目标代码形式及其优缺点 ?了解虚拟机及其指令系统 ?深入理解并掌握有中间代码向目标代码转换的过程和原理 【实验学时】 4学时 【实验要求】 ?熟练掌握虚拟机的指令系统 ?理解并掌握指令选择的方法 ?理解多寄存器分配的原则和方法 ?熟练掌握基本语句从四元式中间代码形式到目标代码的翻译原理和方法 ?独立完成目标代码生成程序 【实验原理】 一、四元式到目标代码的转换分析 1.取ARG结构值对应的目标代码 四元式中间代码的操作分量和目标量以 ARG结构给出,在生成目标代码的过程中,首先要根据ARG结构取得对应的值或者地址,存入累加寄存器ac中,再生成运算的目标代码。从ARG结构取值的过程如下表所示:

取ARG结构值对应的目标代码示意表 2.取变量的绝对地址对应的目标代码如下表所示: 取变量的绝对地址对应的目标代码示意表 二、关键问题的处理 1.标号和跳转的处理:处理标号和跳转,需要用到标号地址表;表的结构为: 中间代码标号目标代码地址下一项 (1) 遇到标号定位时:设标号为L,应转向的目标代码为p1,分为两种情况: ?在标号地址表中没有L项,则填写表项(L,p1,NULL),并链入表尾; ?在标号地址表中有L项(L,addr,Next),则根据当前pc,回填addr对应的目标代码。 (2) 遇到跳转代码时:设要跳到的标号为L,这条语句对应的目标地址为p2,分为两种 情况: ?在标号地址表中没有L项,则构造一个表项(L,p2,NULL),链入表尾; ?在标号地址表中有L项(L,p1,next),则从中取出L的代码地址p1,直接生成目标代码。 2.形实参结合的处理: (1) 形参为值参: ?实参是常数值:将常数值送入相应存储单元;

中间代码生成

计算机科学与工程学院 课程设计报告 题目全称:常用边缘算法的实现 学生学号: 2506203010 姓名:王嘉 指导老师:职称: 指导老师评语: 签字:课程设计成绩:

编译器中间代码生成的研究与实现 作者:王嘉学号:2506203010指导老师:吴洪 摘要:在编译器的翻译流水线中,中间代码生成是处于核心地位的关键步骤。它的实现基于语法分析器的框架,并为目标机器代码的实现提供依据。虽然在理论上没有中间代码生成器的编译器也可以工作,但这将会带来编译器的高复杂度,低稳定性和难移植性。现代编译理论不仅要求中间代码的生成,还要求基于中间代码的优化。本文研究并实现了一个轻量级类C语言的中间代码生成器,并就中间代码生成的原理进行了细致的阐述。 关键字:中间代码生成、语法制导翻译、翻译模式、语法树、三地址码 一、目的及意义 在编译器的分析综合模型中,前端将源程序翻译成一种中间表示,后端根据这个中间表示生成目标代码。目标语言的细节要尽可能限制在后端。尽管源程序可以直接翻译成目标语言,但使用与机器无关的中间形式具有以下优点: 1.重置目标比较容易:不同机器上的编译器可以在已有前端的基础上附近一个适合这 台新机器的后端来生成。 2.可以在中间表示上应用与机器无关的代码优化器。 本文介绍如何使用语法制导方法,基于一种轻量级的类C语言FineC的词法分析器和语法分析器,一遍地将源程序翻译成中间形式的编程语言结构,如声明、赋值及控制流语句。为简单起见,我们假定源程序已经经过一遍扫描,生成了相应的词法记号流和符号表、词素表结构。基于FineC语法标准的语法分析器框架也已经能够正常工作。我们的任务就是补充这个框架,使其在语法分析的过程中生成相应的中间代码,并将必要的变量和函数声明存放在一个符号表链中。 二、目标语言词法和语法标准: 这里定义一个编程语言称作FineC(“fine”指代轻量、精妙)。它是一种适合编译器设计方案的语言。本质上是C语言的一个限制了数据类型、算术操作、控制结构和处理效率的轻量子集。 1.FineC语言的词法描述: [1]语言的关键字: else if return while int void

编译原理 第十二章 代码生成

第十二章代码生成 课前索引 【课前思考】 在第2章PL/0语言编译程序的实现中,产生的目标代码是一种与机器无关的假想栈式计算机器汇编语言类PCODE,它的执行需要用具体机器配置的语言编写一个解释程序。本章将介绍的代码生成是把某种高级程序设计语言经过语法语义分析或优化后的中间代码作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器,因此,代码生成器的构造与输入的中间代码形式和输出的目标代码的机器结构密切相关。本章将主要介绍生成具体机器汇编语言为目标代码时需要考虑的一些共同问题和中间语言的选择考虑。 建议学员考虑如何把PL/0语言编译程序的目标代码类PCODE翻译成你所熟悉的具体机器的汇编语言,作为学习代码生成的预习思考。 【学习目标】 本章将介绍以具体计算机指令作为目标代码的代码生成器的设计,以一个计算机模型为例介绍一个简单的代码生成器需要考虑的问题,在代码生成时要考虑充分利用寄存器,以减少对内存的存取次数以提高目标程序运行速度,为此,本章将给出寄存器分配的原则,并使用待用信息链表法的代码生成算法,最后给出中间语言的选择需要考虑的问题。 【学习指南】 由于代码生成的目标代码与具体计算机的结构有关,如指令格式、字长及寄存器的个数和种类,并与指令的语义和所用操作系统等都密切相关,因此实现非常困难。通过本章学习,仅为学员初步了解一个高级程序设计语言编译程序目标代码生成需要考虑的问题和解决这些问题的基本原则和方法,为今后应用打下初步基础。 要想真正掌握代码生成技术的细节,最好的方法是实现一个代码生成器,建议学员学习本章后,用第2章PL/0语言的中间代码类PCODE为输入,选择一个自己熟悉的汇编语言为输出,编写一个代码生成器。 【难重点】 重点:衡量目标代码的质量主要从占用空间和执行效率两方面考虑,而寄存器的合理分配对解决这两方面的问题起着重要的作用,因此要求学员了解寄存器的分配原则很重要,一个要求执行效率高的编译器对寄存器的分配可能要进行优化。另外对中间语言的选择也很重要,希望有较强可移植性,就要求选择的中间语言能适用较多种类的高级语言和多种不同的具体计算机指令。 难点:原则好讲实践困难,对具体要求和现实环境需要具体分析综合考虑。 【知识点】

编译方法实验报告(中间代码生成器)

编译方法实验报告 2011年10月

一、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 二、实验内容 (1)设计语法制导翻译生成表达式的四元式的算法; (2)编写代码并上机调试运行通过。 输入——算术表达式; 输出——语法分析结果; 相应的四元式序列。 (3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。 三、实验原理及基本步骤 ●算术表达式文法: G(E): E →E ω0 T | T T →T ω1 F | F F → i | (E) ●文法变换: G’(E) E →T {ω0 T} T →F {ω1 F} F → i | (E) ●属性翻译文法: E →T {ω0“push(SYN,w)” T “QUAT”} T →F {ω1“push(SYN, w)” F “QUAT”} F →i “push(SEM, entry(w))” | (E) 其中: push(SYN, w) —当前单词w入算符栈SYN; push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM; QUAT —生成四元式函数 i.T = newtemp; ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++; iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ ); push( SEM, T ); ●递归下降子程序: 数据结构:SYN —算符栈; SEM —语义栈;

四、数据结构设计 使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来 while ( exp[i]=='+' || exp[i]=='-'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) T(); quat();} while ( exp[i]=='*' || exp[i]=='/'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) F(); quat();} void quat(){ strcpy(qt[j],"(, , , )");

目标程序生成

实验八目标程序生成 【实验目的】 ?了解目标代码生成阶段在编译处理过程中的功能和作用 ?了解常用的三种目标代码形式及其优缺点 ?了解虚拟机及其指令系统 ?深入理解并掌握有中间代码向目标代码转换的过程和原理 【实验学时】 4学时 【实验要求】 ?熟练掌握虚拟机的指令系统 ?理解并掌握指令选择的方法 ?理解多寄存器分配的原则和方法 ?熟练掌握基本语句从四元式中间代码形式到目标代码的翻译原理和方法 ?独立完成目标代码生成程序 【实验原理】 一、四元式到目标代码的转换分析 1.取ARG结构值对应的目标代码 四元式中间代码的操作分量和目标量以ARG结构给出,在生成目标代码的过程中,首先要根据ARG结构取得对应的值或者地址,存入累加寄存器ac中,再生成运算的目标代码。从ARG结构取值的过程如下表所示:

取ARG结构值对应的目标代码示意表 2.取变量的绝对地址对应的目标代码如下表所示: 取变量的绝对地址对应的目标代码示意表 二、关键问题的处理 1.标号和跳转的处理:处理标号和跳转,需要用到标号地址表;表的结构为: 中间代码标号目标代码地址下一项 (1) 遇到标号定位时:设标号为L,应转向的目标代码为p1,分为两种情况: ?在标号地址表中没有L项,则填写表项(L,p1,NULL),并链入表尾; ?在标号地址表中有L项(L,addr,Next),则根据当前pc,回填addr对应的目标代码。 (2) 遇到跳转代码时:设要跳到的标号为L,这条语句对应的目标地址为p2,分为两种 情况: ?在标号地址表中没有L项,则构造一个表项(L,p2,NULL),链入表尾; ?在标号地址表中有L项(L,p1,next),则从中取出L的代码地址p1,直接生成目标代码。 2.形实参结合的处理: (1) 形参为值参: ?实参是常数值:将常数值送入相应存储单元; ?实参是直接变量:找到变量的存储地址,取值,送相应存储单元; ?实参是间接变量:此时变量的存储单元存放的是地址。找到变量的存储地址,取内容作为地址,再取内容,得到实参值,送相应存储单元;

中间代码生成-四元式设计文档

学汇百川德济四海编译原理实验 实验名称:中间代码生成程序设计 指导老师:邓安生 专业:计算机科学与技术 班级:计科06-2班 学号:2220060878 姓名:白志杰 2008.6.22

实验任务: 在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。 A-->V:=E V--><标识符> E→E+T|E-T|T T→T*F|T/F|F F→(E)|<标识符> 说明: 标识符的定义参见实验一 程序的功能描述 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。

程序结构描述

程序测试方案 测试用例一: d=a+b*(3*n)/(b-a) 测试用例二: x=x*(x+y-(x-y)/(z+x)-y)

实验总结 此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。 第一次调试通过后程序还存在以下不足: (1)此程序只能从文件中读入一个表达式,读入多个则会出错; (2)所读入的表达式中若含有多于一个括号,程序会出错; (3)括号内若多于一个表达式则会出错; (4)在测试用例二中的分析过程明显是错误的,这足以看出程序的漏洞很多 但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。 经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。

目标代码生成器解析

实验报告 实验课名称:编译原理实验 实验名称:目标代码生成器实验 班级:学号:姓名:时间:2016-4-30 一、问题描述 代码生成器着重考虑两个问题: 一是如何使生成的目标代码较短;另一个是如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数。这两个问题直接影响代码的执行速度。其中基本问题:所有代码生成器都要面对何种中间代码输入, (是逆波兰式,四元式,还是三元式?等问题)何种代码做为目标程序,选择适当的代码指令,最优的寄存器分配方案,和计算顺序等基本问提 二、数据结构设计 逆波兰式 目标代码,采用堆栈。 char x1,x2; /* 从语义栈中弹出俩个操作数,用于判断与运算*/ x2=SEM.top(); /* SEM.top 记得后面要加(),否则没有值!!! */ cout<

相关文档
相关文档 最新文档