下料问题(含代码程序)

下料问题(含代码程序)
下料问题(含代码程序)

实用下料问题优化模型

摘要

关键字:

整数规划模型多目标决策优化NP问题下料方案分支定界法word文档可自由复制编辑

word 文档 可自由复制编辑

1.问题的重述

“下料问题(cutting stock problem)”是把相同形状的一些原材料分割加工成若干个不同规格大小的零件的问题,此类问题在工程技术和工业生产中有着重要和广泛的应用. 这里的“实用下料问题”则是在某企业的实际条件限制下的单一材料的下料问题。

现考虑单一原材料下料问题. 设这种原材料呈长方形,长度为L ,宽度为W ,现在需要将一批这种长方形原料分割成m 种规格的零件, 所有零件的厚度均与原材料一致,但长度和宽度分别为),(,),,(11m m w l w l ,其中w i <m i W w L l i i ,,1,, =<<.

m 种零件的需求量分别为m n n ,,1 .下料时,零件的边必须分别和原材料的边平行。这类问题在工程上通常简称为二维下料问题。特别当所有零件的宽度均与原材料相等,即m i W w i ,,1, ==,则问题称为一维下料问题。

一个好的下料方案首先应该使原材料的利用率最大,从而减少损失,降低成本,提高经济效益。其次要求所采用的不同的下料方式尽可能少,即希望用最少的下料方式来完成任务。因为在生产中转换下料方式需要费用和时间,既提高成本,又降低效率。此外,每种零件有各自的交货时间,每天下料的数量受到企业生产能力的限制。因此实用下料问题的目标是在生产能力容许的条件下,以最少数量的原材料,尽可能按时完成需求任务, 同时下料方式数也尽量地小.就某企业考虑下面两个问题:

1. 建立一维单一原材料实用下料问题的数学模型, 并用此模型求解下列问题,制定出在生产能力容许的条件下满足需求的下料方案, 同时求出等额完成任务所需的原材料数,所采用的下料方式数和废料总长度. 单一原材料的长度为 3000mm, 需要完成一项有53种不同长度零件的下料任务. 具体数据见表一,其中 i l 为需求零件的长度,i n 为需求零件的数量. 此外,在每个切割点处由于锯缝所产生的损耗为5mm. 据估计,该企业每天最大下料能力是100块 ,要求在4天内完成的零件标号(i )为: 5,7,9,12,15,18,20,25, 28,36,48;要求不迟于6天完成的零件标号(i )为:4,11,24, 29,32,38,40,46,50. (提示:可分层建模。(1).先考虑用材料既少,下料方式又少的模型, 或先仅考虑所用材料最少的模型及增加一种下料方式大致相当于使原材料总损耗增加0.08%情况下的最佳方案。(2).在解决具体问题时,先制定4天的下料方案,再制定6天的下料方案,最后制定53种零件的下料方案. 这一提示对第2题也部分适用.)

表1 需求材料的数据 单位:mm

word 文档 可自由复制编辑

2. 建立二维单一原材料实用下料问题的数学模型, 并用此模型求解下列问题.制定出在企业生产能力容许的条件下满足需求的下料方案, 同时求出等额完成任务所需的原材料块数和所需下料方式数.这个问题的单一原材料的长度为 3000mm,宽度为100mm, 需要完成一项有43种不同长度和宽度零件的下料任务. 具体数据见表二,其中 i i i n w l ,,分别为需求零件的长度、宽度和数量. 切割时的锯缝可以是直的也可以是弯的,切割所引起的锯缝损耗忽略不计.据估计,该企业每天最大下料能力是20块 要求在4天内完成的零件标号(i )为: 3,7,9,12,15, 18, 20, 25, 28, 36.

表2 需求材料的数据 单位:mm

2.问题的分析

本文要解决的是一个典型的多目标决策优化问题。一个好的下料方案首先应该使原材料的利用率最大,从而减少损失,降低成本,提高经济效益。其次要求所采用的不同的下料方式尽可能少,即希望用最少的下料方式来完成任务。因为在生产中转换下料方式需要费用和时间,既提高成本,又降低效率,故企业都希望尽可能地减少下料方式的数目。此外,每种零件有各自的交货时间,每天下料的数量受到企业生产能力的限制。因此实用下料问题的目标是在生产能力容许的条件下,在规定的时间需求内,以最少数量的原材料,尽可能按时完成需求任务,同时下料方式数也尽量地小。为顺利解决这一问题,我们先从最基本的单目标决策问题人手,以材料损耗最少为目标,由于个别零件的生产有时间的要求,因此,在下料时就应该优先生产那些有时间限制要求的零件,并且通过不同的数学原理建立多个单目标决策的最优化模型,得出最初的结果,并加以比较分析,然后逐步增加其约束条件,并根据这些约束条件进一步完善我们的最优化模型,求出在需求的时间段内下料方

word文档可自由复制编辑

word 文档 可自由复制编辑

式和损耗都最少的最优结果,紧接着再求出剩余板材下料方式和损耗的最优结果,从而最终得出既满足时间条件限制又满足损耗少、下料方式数小的最优结果。具体流程图如下:

图1 总体流程图

3.模型的假设

[1]. 假设每次切割都准确无误。

[2]. 每天下料的数量受到企业生产能力的限制,在未完成需求任务前,每天下料的

数量等于最大下料能力。

[3]. 模型一中每切得一个规格的零件需要()5i l mm +的原材料。 [4]. 除最后一天外,其余每天均达到最大下料能力。

[5]. 除了要求在规定时间内完成所需零件外,不要求其余零件加工排列顺序。 [6]. 模型二中,切割所引起的锯缝损耗忽略不计。

4.符号说明

5.一维下料问题

对于一维优化下料问题,属于整数规划问题,从计算复杂性理论分析,该问题属于NP难题,即无法在多项式时间(在计算复杂度理论中,指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数)内求解。虽然整数规划问题是NP难题,但是线性问题却是有有效算法的。所以要想求出下料方案的最优解,可以考虑不先求解整数规划问题而先来求解其相应的线性问题,然后用计算机程序进行求解。首先考虑在满足时间需求的情况下,材料总损失最少的情况,然后尽量使得总的下料方式数目最少,故这里要寻找到所有下料方式中利用率最高的方式,同时在满足生产力要求的情况下进行适当调整,采用尽可能少的下料方式,这样便可以得到一维下料问题的优化结果。

5.1模型一的建立

根据题意,现有数量充足的长度为3000mm的原材料,需要完成一项有53种不同长度零件的下料任务。要求在生产能力许可的条件下,既省材料又容易操作(即下料方式尽可能少),由于本文问题的特殊性,还需要考虑个别标号的零件在4天内

word文档可自由复制编辑

word 文档 可自由复制编辑

及6天内完成。故先对数据进行预处理,将4天和6天内完成的任务筛选出来,优先处理后再进行其他标号零件的加工。

按照前面的分析,我们现假设有m 种不同的下料方式,再根据每种零件的需求量,可求得每种零件应用的次数,这样采用第一种下料方式生产的第一种零件的个数为11a 个,同理可知,ji a 表示第i 种下料方式可生产第j 种零件的数量,则采用第m 种下料方式所能得到的第j 种零件的数量表示为jm a ,为更好地表示这个对应关系,建立如下对应关系矩阵:

111212122211m m j j jm a a a a a a A a a a ?????

???????=???????????

则使用m 种不同的下料方式所使用的原材料的数目为i x ,同样用矩阵的方式来表示,则有所需原材料数目为:

()123,,,

,T

m X x x x x =

5.1.1建立目标函数

由于我们以原材料总损耗最少为目标,所以首先计算每种下料方式产生的余料长度,由于在每个切割点处由于锯缝所产生的损耗为5mm. 故每种下料方式应用于每个原材料上所剩的余料表达式为:

()()()11225555i m m jm j c L a l a l a l ??=-++++

+++??

则建立原材料总损耗最少的目标函数为:

1min ()m

i i i c x =∑ (1,2,

,i m =)

其中i x 表示第i 种下料方式所消耗的原材料数目,i c 表示第i 种下料方式所得余料。

又为方便企业加工生产,减少不必要的更换下料方式所产生的麻烦,企业希望所采用的下料方式尽可能少,因此建立第二个目标函数:

min m m Z +∈

5.1.2建立约束条件

1)由于所要生产的每种型号的零件数量题中已经给定,故有限制条件:

1

m

ji i

j i a

x n ==∑ (,ji i a x Z +∈)

word 文档 可自由复制编辑

其中,ji a 表示第i 种下料方式可生产第j 种零件的数量,i x 表示第i 种下料方式所消耗的原材料数目,j n 表示第j 种零件所需要生产的数量,1,2,

,53j =。

2)由于题目中所给出的各个编号的零件都有给定的长度,且原材料长度已定,故在考虑了锯缝后,还要考虑原材料长度3000L mm =对下料方式的限制,即对于任意一种下料方式,所得到的零件总长度与锯缝总长度之和要小于等于每根原材料的总长度3000L mm =,同时还要考虑对于每一种下料方式的废料长度要小于零件的最小长度,由题中所给数据可知,需要生产的零件长度最小为155mm ,故此约束表达式为:

()53

12845553000ji j j a l =≤+-≤∑

其中j l 为每个编号对应的零件长度。

3)因为所需零件的生产有时间的限制,相应编号的零件必须在规定的时间内生产完成,要求4天完成的零件编号为:5,7,9,12,15,18,20,25, 28,36,48,共有11种零件;要求6天内完成的零件编号为:41124,29,32,38,40,46,50,,,共有9种型号的零件。为了在最短时间内完成所有零件生产的任务,在满足该企业每天最大下料能力100块的生产能力条件下,我们在6天内完成的任务中增加4天内需要完成的任务,即6天内需要生产20种型号的零件,为方便下文叙述,我们将4天内需要完成的零件编号建立集合1M ,即

{}15,7,9,12,15,18,20,25, 28,36,48M =,

同理将6天内需要完成的零件编号建立集合2M ,即

{}25,7,9,12,15,18,20,25, 28,36,48,41124,29,32,38,40,46,50M =,,,

对此建立约束条件表达式为:

1111111004ji i

j i

ji

j a x a ==?

?

?

?≤? ? ??

?

∑∑∑

2020111006ji i

j i

ji

j a x a ==??

?

?≤? ? ??

?

∑∑∑

word 文档 可自由复制编辑

其中11

1

ji i

i

ji

j a x a

=∑

∑表示第i 种下料方式中所切割的第j 种零件数占这种下料方式中

所切割的零件4天内需要完成零件数的权数,因此111111ji i

j i

ji

j a x a ==??

?

? ? ??

?

∑∑∑表示4天内完成零件制定零件所用的原材料数,根据该企业的生产能力要求,上述表达式所计算出采用的原材料总数要小于等于4100?,另外若11

1

0ji j a ==∑,则表示第i 种下料方式中没

有切割到集合1M 中的零件;同理,

20

1

ji i

i

ji

j a x a

=∑

∑表示第i 种下料方式中所切割的第j 种

零件数占这种下料方式中所切割的零件6天内需要完成零件数的权数,因此

202011ji i

j i

ji

j a x a ==??

?

? ? ??

?

∑∑∑表示6天内完成零件制定零件所用的原材料数,根据该企业的生产能力要求,上述表达式所计算出采用的原材料总数要小于等于6100?,另外若

20

1

0ji

j a

==∑,则表示第i 种下料方式中没有切割到集合2M 中的零件。

5.1.3最终模型的建立

综上所述,针对本文一维下料问题建立如下数学模型: 目标函数

1m i n ()m

i i i c x =∑

min m

约束条件

word 文档 可自由复制编辑

()1

53

1

1111112020

112845553000

1004..1006,1,2,,531,2,,m

ji i j i ji j j ji i j i ji j ji i j i ji j ji i a x n a l a x a s t a x a a x Z j i m

======+?=???

≤+-≤??????

?? ?≤?? ?

? ???

??????

?? ?≤?? ?

? ??

???∈??==?∑∑∑∑∑∑∑∑ 5.2模型一的求解

对于该问题,首先考虑在满足时间需求的情况下,材料总损失最少的情况,然后尽量使得总的下料方式数目最少,由于本文问题的特殊性,还需要考虑个别标号的零件在4天内及6天内完成。故先对数据进行预处理,将4天和6天内完成的任务筛选出来,优先处理后再进行其他标号零件的加工。 5.2.1优先处理零件

将集合1M 和集合2M 中的零件进行优先处理,利用lingo 软件编程,先不考虑下料方式的数目对结果的影响,在满足原材料总损失最小的前提下再调整下料方式的数目,同时在保证生产集合1M 和集合2M 中的零件的基础上,只要在生产能力许可范围内,还可以生产其他对生产时间没有限制的零件。对此,运行程序得到的这一批零件生产的结果,然后再利用matlab 程序对所得下料方式进行调整,然后针对个别存在问题的下料方式进行调解后得到的最终结果为:

表3 优先考虑有时间限制零件的处理结果

中间代码生成实验报告材料

一、实验目的 通过在实验二的基础上,增加中间代码生成部分,使程序能够对实验二中的识别出的赋值语句,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 sl>89+56*67 then f:=7*7+4; ff:=6+6*6-6%4+8; if sl+78*76>89*56+67 then while a-7>98+45*45 do f:=7*7+4; . 四、运行结果 首先对测试程序进行语法分析,识别出正确的句子,当识别出正确的句子时,就对当前句子进行语义分析,而语法不正确的句子不进行语义分析。 ff:=6+6*6- Error(4):Except ID or NUM ; Error(2):Syntax error if sl>89+56*67 then f:=7*7+4; success!!! (1) [ *, 56, 67, T1 ]

20个代码生成框架

20个代码生成框架 11.1 CodeSmith http: 官方论坛: http: 版权形式:30天试用 开源:否需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith 简单、好用。 所有api可以在帮助菜单中找到。 http: 官方论坛: 版权形式: 免费 开源:否 1.3 NHibernate. http: 官方论坛: 版权形式:

免费 开源:否 1.4湛蓝.Net代码生成器 http: 官方论坛: http: 版权形式: 免费 开源:否 1.5动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 http: 官方论坛: 版权形式: 免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大http: 官方论坛:

版权形式: 需要少量的注册费用 开源:否下载地址很神秘 1.7 CodeMaker http: 官方论坛: 版权形式: 免费 开源:否 https://www.360docs.net/doc/a04629272.html,代码生成器 可以使用本工具生成https://www.360docs.net/doc/a04629272.html,和C#语言的代码,以及三层架构与ORM架构代码,并且使用的ORM持久化组件是开源的,您可以在本软件的安装目录下找到它 官方论坛: 版权形式: 免费 开源:否 1.9 BMW业务模型及代码生成器 一款人气很旺的免费C#代码生成器

官方论坛: 版权形式: 免费 开源:否 1.10飞鹰CoolCoder 专门为采用nhibernate做关系对象影射架构的系统提供代码的工具,简单易用,虽然不提供源码,我们可以用反编译工具对其反编译看源码。这是个很不错的学习机会。 官方论坛: 版权形式: 免费 开源:否 1.11 AutoCoder自动代码生成器 AutoCoder自动代码生成器是一个根据模板自动生成代码的代码生成工具,根据模板的不同,可以生成任何语言(如: ASP、C#、C++BUILDER、DELPHI、JAV A、JSP、PHP、V B、https://www.360docs.net/doc/a04629272.html,……),不同层次结构(B/S、C/S、n-tiger……),基于不同数据库(ORACL E、MSSQL、MYSQL、

编译原理综合性实验报告-分析中间代码生成程序分析

编译原理综合性实验报告-分析中间代码生成程序分析XXXXXX计算机系综合性实验 实验报告 课程名称编译原理实验学期 XXXX 至 XXXX 学年第 X 学期学生所在系部计算机系年级 X 专业班级 XXXXXX 学生姓名 XXX 学号 XXXXXXXXXXXX 任课教师XXX 实验成绩 计算机系制 《编译原理》课程综合性实验报告 开课实验室: 年月日实验题目分析中间代码生成程序 一、实验目的 分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。 二、设备与环境 PC兼容机、Windows操作系统、Turbo Pascal软件等。 三、实验内容 1. 分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式。画出Block 子程序的流程图,写出至少两条PL/0程序语句的语法格式。 2. 分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程。 使用概要算法来描述语句的代码生成过程。 3. 自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。列出自

己编写的源程序和编译后得到的中间代码。 4. 从中选择一个语句或表达式,写出代码生成的过程。要求从自己的源程序中 选择一条语句,结合这条语句写出语义分析和代码生成过程。在描述这个过程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参数的含义和功能。 四、实验结果及分析 (一)Block子程序分析 1.常量声明的分析: 常量声明部分的语法结构定义为如下形式: -> const ; -> [;] ->id = C 其中C可以是常量标识符或字符串或整数(可带符号)或实数(可带符号)。 常量声明分析程序的主要任务是: (1).扫描整个常量声明部分。 (2).为被声明的常量标识符建立符号表项。 (3).检查重复的声明。 2.变量声明部分的分析: 变量声明部分的语法结构定义为如下形式: -> var -> [;] ->:T ->id[,]

语义分析与中间代码生成程序的设计原理与实现技术__实验报告与源代码_北京交通大学

语义分析及中间代码生成程序设计原理与实现技术 XXX 1028XXX2 计科1XXX班 1.程序功能描述 完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过 程。 G[A]:A→V:=E E→E+T∣E-T∣ T→T*F∣T/F∣F F→(E)∣i V→i 说明:终结符号i 为用户定义的简单变量,即标识符的定义。 2. 设计要求 (1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。 3.主要数据结构描述: 本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT 集以及算符优先矩阵:

算符优先矩阵采用二维字符数组表示的: char mtr[9][9]; //算符优先矩阵 4.程序结构描述: 本程序一共有8功能函数: void get(); //获取文法 void print(); //打印文法 void fun(); //求FirstVT 和LastVT void matrix(); //求算符优先矩阵 void test(); //测试文法 int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1 void out(char now,int avg1,int avg2); //打印四元式 int ope(char op,int a,int b); //定义四元式计算方法 5.实验代码 详见附件 6.程序测试 6.1 功能测试 程序运行显示如下功能菜单:

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

编译方法实验报告 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; QUA T —生成四元式函数 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],"(, , , )");

生产工艺及检验流程图

深圳市尊雅印刷有限公司文件编号ZY-3-42 版本 /次 A/1文件名称生产工艺及检验流程图生效日期2014-3-17页次2/6 深圳市尊雅印刷有限公司文件编号ZY-3-42 版本 /次A/1 原辅材料(供应商) 入库 (原辅料仓) 切纸 (印刷车间) 拼版(版房) 晒版 (版房) 洗/消版 (版房) 印刷 (印刷车间) 过油磨光 (外发) 过UV (光磨部) 印油 (印刷车间) 过光/哑胶 (光磨部) 裱坑/双灰(裱纸部) 粘盒(粘盒部)穿绳/鸡眼(粘盒部) 模切(啤机部) 包装(包装部) 入库(成品仓) 裱卡与烫金 (外发) 木样 (外发)

文件名称生产工艺及检验流程图生效日期2014-3-17页次3/6 流程图设备及作业环境要求品质控制(责任)检验及 试验作 业指导 书工序作 业指导 书 操作规 程及保 养规范 记录 表格 序号工序 名称 工序 代号主要设备作业环境检查内容检测设备 I Q C I P Q C F Q C 作 业 员 1 进料 检验 1.防尘 2.防强光 3.防潮 1.规格型号 2.尺寸外观 性能等 3.纸质 卷尺、游标卡尺 ● 检验规 范 IQC进料 检验报 告 2 入库1.外观包装 2.数量、出 货标签及 相对应得 产品标识 等 目测● 仓储作 业指导 书 仓库出 入记录 3 切纸B1 切纸机1.防尘 2.湿度 60%—80% 1.外观 2.尺寸 3.纸型号 4.纸规格 5.纸纹 1.钢尺 2.目测 ●● 切纸作 业指导 书 切纸机 操作规 程 切纸机 保养规 范 切纸机 保养记 录 深圳市尊雅印刷有限公司文件编号ZY-3-42 版本 /次 A/1 文件名称生产工艺及检验流程图生效日期2014-3-17页次4/6 流程图设备及作业环境要求品质控制(责任)检验及工序作操作规记录

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

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表 达式也称做后缀式。 2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。 3、三元式:形式序号:(op,arg1,arg2) 4、四元式:形式(op,arg1,arg2,result) 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。 (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。 (4)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。 四、程序代码: //这是一个由中缀式生成后缀式的程序 #include<> #include<> #include<> #include<> #define maxbuffer 64 void main() { char display_out(char out_ch[maxbuffer], char ch[32]); //int caculate_array(char out_ch[32]); static int i=0; static int j=0; char ch[maxbuffer],s[maxbuffer],out[maxbuffer]; cout<<"请输入中缀表达式: ";

代码生成器

代码生成器使用规则 1.创建一个表,红色为必须字段,该sql执行前去掉行前的tab符号 DROP TABLE IF EXISTS `books`; CREATE TABLE `books` ( `id` varchar(64) NOT NULL COMMENT '编号', `bookid` varchar(30) default NULL COMMENT '书号', `name` varchar(100) default NULL COMMENT '书名', `author` varchar(100) default NULL COMMENT '作者', `price` float default NULL COMMENT '单价', `number` int(11) default NULL COMMENT '存库', `publish` varchar(30) default NULL COMMENT '出版社', `img` varchar(30) default 'upload/default.jpg' COMMENT '封面', `create_by` varchar(64) default NULL COMMENT '创建者', `create_date` datetime default NULL COMMENT '创建时间', `update_by` varchar(64) default NULL COMMENT '更新者', `update_date` datetime default NULL COMMENT '更新时间', `remarks` varchar(255) default NULL COMMENT '备注信息', `del_flag` char(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 2.修改Generate类,修改如下 String moduleName = "books"; // 模块名,例:sys String subModuleName = ""; // 子模块名(可选) String className = "books"; // 类名,例:user String classAuthor = "石义良"; // 类作者,例:ThinkGem String functionName = "图书"; // 功能名,例:用户 // 是否启用生成工具 Boolean isEnable = true; 右击,run as java application 3.刷新整个项目,将com.thinkgem.jeesite.modules.books.web.BooksController中的 return"books/booksList"; return"books/booksForm"; 修改为 return"modules/books/booksList"; return"modules/books/booksForm"; 4.将/JeeSite/src/main/java/com/thinkgem/jeesite/modules/books/entity/Books.java中的父类修改IdEntity,并删除id成员,添加其他非红色字段成员及get、set方法。并将表映射为books表。 5.以thinkgem身份登录,在菜单管理中添加菜单:

20个代码生成框架

20个代码生成框架 1 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://https://www.360docs.net/doc/a04629272.html, 官方论坛:http://https://www.360docs.net/doc/a04629272.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.360docs.net/doc/a04629272.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.360docs.net/doc/a04629272.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器

一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.360docs.net/doc/a04629272.html, 官方论坛:http://https://www.360docs.net/doc/a04629272.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.360docs.net/doc/a04629272.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.360docs.net/doc/a04629272.html, 官方论坛: 版权形式:需要少量的注册费用 开源:否 下载地址很神秘 1.7 CodeMaker asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以

中间代码生成程序(三地址)

#include #include #include using namespace std; stack state; stack symbol; //stackval; stack symbol2; char sen[50]; char sym[12][6]={//符号表{'s','e','e','s','e','e'}, {'e','s','e','e','e','a'}, {'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'s','e','e','s','e','e'}, {'r','r','r','r','r','r'}, {'s','e','e','s','e','e'}, {'s','e','e','s','e','e'}, {'e','s','e','e','s','e'}, {'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'r','r','r','r','r','r'} }; char snum[12][6]={//数字表{5,1,1,4,2,1}, {3,6,5,3,2,0}, {2,2,7,2,2,2}, {4,4,4,4,4,4}, {5,1,1,4,2,1}, {6,6,6,6,6,6}, {5,1,1,4,2,1}, {5,1,1,4,2,1}, {3,6,5,3,11,4}, {1,1,7,1,1,1}, {3,3,3,3,3,3}, {5,5,5,5,5,5} }; int go2[12][3]={//goto表 {1,2,3}, {0,0,0}, {0,0,0}, {0,0,0}, {8,2,3},

实验 6 简单中间代码生成

实验 6 简单中间代码生成 1、实验目的: 综合运用所学知识,集成词法分析、符号表管理等程序的成果,在语法分析和文法属性计算的基础上,完成中间代码的生成工作。让学生全面了解一个编译器工作的全过程,真正全面掌握编译的思想和方法。 2、实验的基本原理 对于一个给定文法,通过改写文法,使其满足LR(1)文法的要求,根据语义确定文法符号的属性,确定语义规则或翻译方案;根据文法特点构造LR(1)分析表,进而构造语法分析和属性计算程序。分析程序在分析表的驱动下,完成对给定的句子进行语法分析和属性计算工作,最后生成三地址中间代码序列。 3、实验内容及要求 a.实验所用文法如下。 statmt → id = exp exp → exp addop term | term addop →+ | - term→ term mulop factor | factor mulop → * | / factor → ( exp ) | id | num 其中id和num为实验二中定义的标识符和常数,因此这里还需要一个小的词法分析器来得到id和num。 b.构造文法LR(1)项目集,构造ACTION和GOTO矩阵,确认文法满足LR(1) 文法要求。 c.按一般高级语言赋值语句的计算要求定义文法的属性和语义规则,属性计算的结果 是将给定赋值语句翻译成三地址代码序列,并输出此序列。 d.从数据文件中读出赋值语句,并对其进行语法分析,对合法语句,输出其翻译结果。 e.实验数据文件中应该有多个语句,可能有正确的也应该有错误的语句;语句中的表 达式有形式简单的也应该有复杂的。每个表达式写在一行,以$结束。 4、实验步骤 准备好用于实验的赋值语句序列,并存储在文件中。 a.编写单词分析子程序,能从源程序中分离出单词(包括标识符和常数);词法分析 器以子程序形式出现,当需要进行词法分析时进行调用;

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

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

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

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

万方数据

万方数据

万方数据

万方数据

基于敏捷开发的高校网络评教系统 作者:吴衡, 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.360docs.net/doc/a04629272.html,/Periodical_jsjsyzdh201104028.aspx

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

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

开课实验室:年月日 实验题目分析中间代码生成程序 一、实验目的 分析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 } { 记录本层开始时代码段分配位置}

电子元器件的来料检验标准指导书(新版)

电子元器件来料检验标准指导书 目的:对IQC品检人员的作业方法及流程进行规范,提高IQC检验作业水平,控制来料不良,提高品质。 1、实用范围:来料进料检验 2、质检步骤 (1)来料暂收 (2)来料检查 (3)物料入库 3、质检要点及规范 (1)来料暂收:仓管收到供应商的送货单后根据送货单核对来料:数量,种类及标签内容等无误后送交IQC 检验,予以暂收,并签回货单给来料厂商。 (2)来料检查:IQC品检人员收到进料验收单后,依验收单和采购单核对来料与标签内容是否相符,来料规格,种类;是否相符,如不符拒检验,并通知仓管、采购及生管,如符合,则进行下一步检验。一般先抽查来料的一定比例(以仓库来料质检标准),查看品质情况,再决定入库全检,还是退料。 (3)检查内容: (1)外观:自然光或日光灯下,距离样品30CM目视; (2)尺寸规格:用卡尺/钢尺测量,厚度用卡尺/外径千分尺测量; (3)粘性分别按:GB/T4852-2002、GB/T4851-1998、GB/T2792-1998中方法执行,结果记录于《可靠度测试报告》中; (4)包装完好、标识正确、完整、清晰,环保材料查看是否贴有相应的环保标签,第一批进料时要附SGS报告及物质安全表及客户要求的其它有害物质检测报告; (5)检验合格后贴上合格标签,填写《物料检验表》并通知仓库入库,仓库要按材料类型(环保与实用型)及种类分开放置标示清楚,成品料由IQC人员包装放于待出货区。以仓库物料质检标准。 (6)物料入库:检查完毕,要提交《原材料进库验货》交上级处理,并对合格暂收物料进行入库登记。异常物料特《原材料进库验货》批示后,按批示处理。 4、注意事项 (1)要保持物料的整洁。

语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码北京交通大学

语义分析及中间代码生成程序设计原理与实现技术--实验 报告及源代码北京交通大学 语义分析及中间代码生成程序设计原理与实现技术 XXX 1028XXX2 计科1XXX班 1. 程序功能描述 完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。 G[A]:A?V:=E E?E+T?E-T? T?T*F?T/F?F F?(E)?i V?i 说明:终结符号i 为用户定义的简单变量,即标识符的定义。 2. 设计要求 (1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。 3. 主要数据结构描述: 本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改 的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT

集以及算符优先矩阵: struct info{ char left; vector right; vector first; vector last; }; 算符优先矩阵采用二维字符数组表示的: char mtr[9][9]; //算符优先矩阵 4. 程序结构描述: 本程序一共有8功能函数: void get(); //获取文法 void print(); //打印文法 void fun(); //求FirstVT 和 LastVT void matrix(); //求算符优先矩阵 void test(); //测试文法 int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1 void out(char now,int avg1,int avg2); //打印四元式 a,int b); //定义四元式计算方法 int ope(char op,int 5. 实验代码详见附件 6. 程序测试 6.1 功能测试 程序运行显示如下功能菜单:

从MATLAB代码生成独立c语言代码

Matlab 用help lsqcurvefit MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。 使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法;检查MATLAB 代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或MEX。 利用MATLAB Coder生成c++代码,并在vs2008中验证: 一个简单的例子,两数相乘: 1、安装matlab2011a或者更新版本; 2、简单生成一个foo.m文件; function c = foo(a, b)%#codegen %This function muliplies a and b c = a * b 其中,%#codegen可以防止出现警告错误 3、在命令窗口,输入mex -setpu,选中一个存在的编译器; 4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框; 5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function 对话框; 6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开; 7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,在MATLAB Expression中输入5,点击OK;同样变量b也进行相应操作,输入6; 8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only; 9、点击More settings,GeneralàLangu age选择C++;Interface选项中去掉所有选项;Close; 10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息; 11、利用vs2008建立一个控制台应用程序,将生成的相关文件foo.h、foo.cpp、rtwtypes.h、foo_types.h拷到相关目录下并添加到应用程序中; 12、在foo.cpp文件中添加#include “stdafx.h”;

中间代码生成实验报告

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

目标程序生成

实验八目标程序生成 【实验目的】 ?了解目标代码生成阶段在编译处理过程中的功能和作用 ?了解常用的三种目标代码形式及其优缺点 ?了解虚拟机及其指令系统 ?深入理解并掌握有中间代码向目标代码转换的过程和原理 【实验学时】 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) 形参为值参: ?实参是常数值:将常数值送入相应存储单元; ?实参是直接变量:找到变量的存储地址,取值,送相应存储单元; ?实参是间接变量:此时变量的存储单元存放的是地址。找到变量的存储地址,取内容作为地址,再取内容,得到实参值,送相应存储单元;

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

实验三中间代码生成 学号:;姓名:马小军 实验目的 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='A'&&str[e]<='Z') { for(int i=0;i

相关文档
最新文档