搜档网
当前位置:搜档网 › MyBatis_Generator代码生成

MyBatis_Generator代码生成

MyBatis_Generator代码生成
MyBatis_Generator代码生成

使用Mybatis Generator自动生成Mybatis相关代码

本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码:

一、构建一个环境:

1. 首先创建一个表:

Sql代码

1.CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species

VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

2. 然后注入数据

Sql代码

1.insert into pet values('Fluffy', 'Harold', 'cat', 'f', '1993-02

-04', null);

2.insert into pet values('Claws', 'Gwen', 'cat', 'm', '1994-03-17

', null);

3.insert into pet values('Buffy', 'Harold', 'dog', 'f', '1989-05-

13', null);

4.insert into pet values('Fang', 'Benny', 'dog', 'm', '1990-08-27

', null);

5.insert into pet values('Bowser', 'Diane', 'dog', 'm', '1979-08-

31', '1995-07-29');

6.insert into pet values('Chirpy', 'Gwen', 'bird', 'f', '1998-09-

11', null);

7.insert into pet values('Whistler', 'Gwen', 'bird', null, '1997-

12-09', null);

8.insert into pet values('Slim', 'Benny', 'snake', 'm', '1996-04-

29', null);

注:这里的sql例子来自

https://www.sodocs.net/doc/8d9291471.html,/doc/refman/5.5/en/creating-tables.html

3. 在 Mybatis 主页 https://www.sodocs.net/doc/8d9291471.html,/p/mybatis/ 上下载 Mybatis mybatis-generator-core [本文使用的是 1.3.0 版本]。当然运行

mybatis-generator 生成的代码还需要下载 mybatis 的 jar 包[本例使用的是3.0.2 版本],和相关数据库的 jdbc [本文中使用的是MySql的jdbc] 。

二、运行 mybatis-generator

1. 要运行 generator ,需要给 generator 提供一个配置文件,指定其生成的数据库的相关信息。

以下是一个示例:

Xml代码

1.

2.

3. PUBLIC "-//https://www.sodocs.net/doc/8d9291471.html,//DTD MyBatis Generator Configuration 1

.0//EN"

4. "https://www.sodocs.net/doc/8d9291471.html,/dtd/mybatis-generator-config_1_0.dtd">

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16. connectionURL="jdbc:mysql://localhost/test" userId=

"qgd" password="123456">

17.

18.

19.

20.

21.

22.

23.

24. targetProject="../src/main/java">

25.

26.

27.

28.

29.

30. targetProject="../src/main/java">

31.

32.

33.

34.

35. targetPackage="test.dao" targetProject="../src/main

/java">

36.

37.

38.

39.

40.

41.

42.

43.

这个配置文件提供了 mybatis-generator所需要的参数信息:

* 其中classPathEntry 是引用的jdbc的类路径,这里将jdbc jar和generator的jar包放在一起了;

* commentGenerator 是用来除去时间信息的,这在配合类似subversion的代码管理工具时使用很有效,因为可以减少没有必要的注释迁入;

* jdbcConnection是指定的jdbc的连接信息;

* javaTypeResolver式类型转换的信息,这里并没有用到;

* javaModelGenerator是模型的生成信息,这里将指定这些Java model类的生成路径;

* sqlMapGenerator是mybatis 的sqlMapper XML文件的生成信息,包括生成路径等;

* javaClientGenerator是应用接口的生成信息;

* table是用户指定的被生成相关信息的表,它必须在指定的jdbc连接中已经被建立。

2. mybatis-generator 有多种运行方式,最简单的就是命令行的方式,只需要指定相应的配置文件的路径即可:

Java代码

1.java -jar mybatis-generator-core-1.3.0.jar -configfile ../src/m

ain/resource/config.xml -overwrite

运行后生成的代码包括模型类 test.model.Pet 和 test.model.PetExample ,test.dao.PetMapper 接口以及其相对应的 xml 映射文件,在这里就不在赘述了。

三、使用 mybatis-generator 生成的代码

1. 现在我们要利用这些生成的代码,首先我们需要一个关于所有映射的配置文件。需要我们手写如下:【不知道为什么generator没有选择自动生成这个文件,毕竟这些信息generator都可以得到】

Xml代码

1.

2.

3. PUBLIC "-//https://www.sodocs.net/doc/8d9291471.html,//DTD Config 3.0//EN"

4. "https://www.sodocs.net/doc/8d9291471.html,/dtd/mybatis-3-config.dtd">

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

2. 另外还要使用然后我们还需要一个Main示例方法来调用这些已生成的代码:Java代码

1.package test;

2.

3.import java.io.Reader;

4.import java.util.List;

5.

6.import org.apache.ibatis.io.Resources;

7.import org.apache.ibatis.session.SqlSession;

8.import org.apache.ibatis.session.SqlSessionFactory;

9.import org.apache.ibatis.session.SqlSessionFactoryBuilder;

10.

11.import test.dao.PetMapper;

12.import test.model.Pet;

13.import test.model.PetExample;

14.

15.public class Test {

16.

17. public static void main(String[] args) throws Exception {

18. String resource = "MapperConfig.xml";

19. Reader reader = Resources.getResourceAsReader(resource)

;

20. SqlSessionFactory sqlMapper = new SqlSessionFactoryBuil

der().build(reader);

21. SqlSession sqlSession = sqlMapper.openSession();

22.

23. PetExample pet = new PetExample();

24. pet.or().andDeathIsNotNull();

25. try {

26. PetMapper mapper = sqlSession.getMapper(PetMapper.c

lass);

27. List allRecords = mapper.selectByExample(pet);

28. for (Pet s : allRecords)

29. System.out.println(s);

30. } finally {

31. sqlSession.close();

32. }

33. }

34.}

这样就可以打印出相应的查询结果信息了。

四、小结

该示例的完整的Eclipse工程见附件mybatis-generator-usage.zip,其中已经包含了示例需要使用的jar包。

本文中只是用到了mybatis-generator 的一部分功能,mybatis-generator 生成代码的方式还包括ant或Maven脚本,或者直接使用java API生成;另外通过修改配置文件,generator还可以指定表的生成细节,并可以添加插件。其功能文档在generator的分发包的doc文件夹下有更详细的介绍。

这里使用的表示没有主键的表,针对有一个主键或多个主键的表,

mybatis-generator的生成的内容也有所不同,感兴趣的读者可以自行试验一下。

mybatis-generator-usage.zip (1.6 MB)

一、MyBatis简介与配置

MyBatis+Spring+MySql

1.1MyBatis简介

MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。

需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。

mybatis-spring-1.0.0.jar(与Spring结合包)。

下载地址:

https://www.sodocs.net/doc/8d9291471.html,/tools/ibator

https://www.sodocs.net/doc/8d9291471.html,/p/mybatis/

1.2MyBatis+Spring+MySql简单配置

1.2.1搭建Spring环境

1,建立maven的web项目;

2,加入Spring框架、配置文件;

3,在pom.xml中加入所需要的jar包(spring框架的、mybatis、mybatis-spring、junit等);

4,更改web.xml和spring的配置文件;

5,添加一个jsp页面和对应的Controller;

6,测试。

可参照:https://www.sodocs.net/doc/8d9291471.html,/blog/830409。使用Eclipse的Maven构建SpringMVC项目

1.2.2建立MySql数据库

建立一个学生选课管理数据库。

表:学生表、班级表、教师表、课程表、学生选课表。

逻辑关系:每个学生有一个班级;每个班级对应一个班主任教师;每个教师只能当一个班的班主任;

使用下面的sql进行建数据库,先建立学生表,插入数据(2条以上)。

更多sql请下载项目源文件,在resource/sql中。

Sql代码

1./* 建立数据库 */

2.CREATE DATABASE STUDENT_MANAGER;

https://www.sodocs.net/doc/8d9291471.html,E STUDENT_MANAGER;

4.

5./***** 建立student表 *****/

6.CREATE TABLE STUDENT_TBL

7.(

8. STUDENT_ID VARCHAR(255) PRIMARY KEY,

9. STUDENT_NAME VARCHAR(10) NOT NULL,

10. STUDENT_SEX VARCHAR(10),

11. STUDENT_BIRTHDAY DATE,

12. CLASS_ID VARCHAR(255)

13.);

14.

15./*插入学生数据*/

16.INSERT INTO STUDENT_TBL (STUDENT_ID,

17. STUDENT_NAME,

18. STUDENT_SEX,

19. STUDENT_BIRTHDAY,

20. CLASS_ID)

21. VALUES (123456,

22. '某某某',

23. '女',

24. '1980-08-01',

25. 121546

26. )

创建连接MySql使用的配置文件mysql.properties。

Mysql.properties代码

1.jdbc.driverClassName=com.mysql.jdbc.Driver

2.jdbc.url=jdbc:mysql://localhost:3306/student_manager?user=root&password=limingniha

o&useUnicode=true&characterEncoding=UTF-8

1.2.3搭建MyBatis环境

顺序随便,现在的顺序是因为可以尽量的少的修改写好的文件。

1.2.3.1创建实体类: StudentEntity

Java代码

1.public class StudentEntity implements Serializable {

2.

3. private static final long serialVersionUID = 3096154202413606831L;

4. private ClassEntity classEntity;

5. private Date studentBirthday;

6. private String studentID;

7. private String studentName;

8. private String studentSex;

9.

10. public ClassEntity getClassEntity() {

11. return classEntity;

12. }

13.

14. public Date getStudentBirthday() {

15. return studentBirthday;

16. }

17.

18. public String getStudentID() {

19. return studentID;

20. }

21.

22. public String getStudentName() {

23. return studentName;

24. }

25.

26. public String getStudentSex() {

27. return studentSex;

28. }

29.

30. public void setClassEntity(ClassEntity classEntity) {

31. this.classEntity = classEntity;

32. }

33.

34. public void setStudentBirthday(Date studentBirthday) {

35. this.studentBirthday = studentBirthday;

36. }

37.

38. public void setStudentID(String studentID) {

39. this.studentID = studentID;

40. }

41.

42. public void setStudentName(String studentName) {

43. this.studentName = studentName;

44. }

45.

46. public void setStudentSex(String studentSex) {

47. this.studentSex = studentSex;

48. }

49.}

1.2.3.2创建数据访问接口

Student类对应的dao接口:StudentMapper。

Java代码

1.public interface StudentMapper {

2.

3. public StudentEntity getStudent(String studentID);

4.

5. public StudentEntity getStudentAndClass(String studentID);

6.

7. public List getStudentAll();

8.

9. public void insertStudent(StudentEntity entity);

10.

11. public void deleteStudent(StudentEntity entity);

12.

13. public void updateStudent(StudentEntity entity);

14.}

1.2.3.3创建SQL映射语句文件

Student类的sql语句文件StudentMapper.xml resultMap标签:表字段与属性的映射。

Select标签:查询sql。

Xml代码

1.

2.

3.0//EN" "https://www.sodocs.net/doc/8d9291471.html,/

dtd/mybatis-3-mapper.dtd">

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

19.

20.

21.

26.

27.

1.2.3.4创建MyBatis的mapper配置文件

在src/main/resource中创建MyBatis配置文件:mybatis-config.xml。typeAliases标签:给类起一个别名。com.manager.data.model.StudentEntity 类,可以使用StudentEntity代替。

Mappers标签:加载MyBatis中实体类的SQL映射语句文件。

Xml代码

1.

2.

3.0//EN" "http://mybatis.

org/dtd/mybatis-3-config.dtd">

3.

4.

5.

6.

7.

8.

9.

10.

1.2.3.5修改Spring 的配置文件

主要是添加SqlSession的制作工厂类的bean:SqlSessionFactoryBean,(在mybatis.spring包中)。需要指定配置文件位置和dataSource。

和数据访问接口对应的实现bean。通过MapperFactoryBean创建出来。需要执行接口类全称和SqlSession工厂bean的引用。

Xml代码

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

1.2.4测试StudentMapper

使用SpringMVC测试,创建一个TestController,配置tomcat,访问index.do 页面进行测试:

Java代码

1.@Controller

2.public class TestController {

3.

4. @Autowired

5. private StudentMapper studentMapper;

6.

7. @RequestMapping(value = "index.do")

8. public void indexPage() {

9. StudentEntity entity = studentMapper.getStudent("10000013");

10. System.out.println("name:" + entity.getStudentName());

11. }

12.}

使用Junit测试:

Java代码

1.使用Junit测试:

2.Java代码

3.@RunWith(value = SpringJUnit4ClassRunner.class)

4.@ContextConfiguration(value = "test-servlet.xml")

5.public class StudentMapperTest {

6.

7. @Autowired

8. private ClassMapper classMapper;

9.

10. @Autowired

11. private StudentMapper studentMapper;

12.

13. @Transactional

14. public void getStudentTest(){

15. StudentEntity entity = studentMapper.getStudent("10000013");

16. System.out.println("" + entity.getStudentID() + entity.getStudentName());

17.

18. List studentList = studentMapper.getStudentAll();

19. for( StudentEntity entityTemp : studentList){

20. System.out.println(entityTemp.getStudentName());

21. }

22.

23. }

24.}

更详细的功能源代码

https://www.sodocs.net/doc/8d9291471.html,/admin/blogs/782190页面最下面;

二、SQL语句映射文件(1)resultMap

SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:

Xml代码

1.

2.

3.

4.

5.

6.

SQL 映射XML 文件一些初级的元素:

1. cache –配置给定模式的缓存

2. cache-ref –从别的模式中引用一个缓存

3. resultMap –这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象

4. sql –一个可以被其他语句复用的SQL 块

5. insert –映射INSERT 语句

6. update –映射UPDATE 语句

7. delete –映射DELEETE 语句

8. select - 映射SELECT语句

2.1 resultMap

resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。

resultMap属性:type为java实体类;id为此resultMap的标识。

resultMap可以设置的映射:

1. constructor –用来将结果反射给一个实例化好的类的构造器

a) idArg – ID 参数;将结果集标记为ID,以方便全局调用

b) arg –反射到构造器的通常结果

2. id – ID 结果,将结果集标记为ID,以方便全局调用

3. result –反射到JavaBean 属性的普通结果

4. association –复杂类型的结合;多个结果合成的类型

a) nested result mappings –几resultMap 自身嵌套关联,也可以引用到一个其它上

5. collection –复杂类型集合a collection of complex types

6. nested result mappings – resultMap 的集合,也可以引用到一个其它上

7. discriminator –使用一个结果值以决定使用哪个resultMap

a) case –基本一些值的结果映射的case 情形

i. nested result mappings –一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。

2.1.1 id、result

id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。

最简单的例子:

Xml代码

1.

2.

3.

4.

5.

6.

id、result语句属性配置细节:

支持的JDBC类型

为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

2.1.2 constructor

我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。

使用construcotr功能有限(例如使用collection级联查询)。

上面使用id、result实现的功能就可以改为:

Xml代码

1.

2.

3.

4.

5.

6.

7.

8.

当然,我们需要定义StudentEntity实体类的构造方法:

Java代码

1.public StudentEntity(String studentID, String studentName, String studentSex, Date stude

ntBirthday){

2. this.studentID = studentID;

3. this.studentName = studentName;

4. this.studentSex = studentSex;

5. this.studentBirthday = studentBirthday;

6.}

2.1.3 association联合

联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。

不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;

2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级对应一个班主任。

首先定义好班级中的班主任属性:

Java代码

1.private TeacherEntity teacherEntity;

2.1.

3.1使用select实现联合

例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。

这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap 即可。

ClassMapper.xml文件部分内容:

Xml代码

1.

2.

3.

4.

5.

6.

7.

8.

TeacherMapper.xml文件部分内容:

Xml代码

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

2.1.

3.2使用resultMap实现联合

与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join 教师表),不需要teacher的select。

修改ClassMapper.xml文件部分内容:

Xml代码

1.

2.

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

一、实验目的 通过在实验二的基础上,增加中间代码生成部分,使程序能够对实验二中的识别出的赋值语句,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.sodocs.net/doc/8d9291471.html,代码生成器 可以使用本工具生成https://www.sodocs.net/doc/8d9291471.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.sodocs.net/doc/8d9291471.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],"(, , , )");

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

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 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.sodocs.net/doc/8d9291471.html, 官方论坛:http://https://www.sodocs.net/doc/8d9291471.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.sodocs.net/doc/8d9291471.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.sodocs.net/doc/8d9291471.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器

一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.sodocs.net/doc/8d9291471.html, 官方论坛:http://https://www.sodocs.net/doc/8d9291471.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.sodocs.net/doc/8d9291471.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.sodocs.net/doc/8d9291471.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.sodocs.net/doc/8d9291471.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 } { 记录本层开始时代码段分配位置}

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

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

实验四 中间代码生成

实验四中间代码生成 一、实验目的: 了解中间代码的产生过程。 二、实验学时: 2学时。 三、实验内容 在实验三的基础上,生成表达式的中间代码(可用任一种中间代码表示形式)。 四、实验方法 对实验三的代码加以改造(属性文法参照书171页表7.3),使之输出对应的中间代码(而不是表达式的值)。 五、处理程序例 例: 正确源程序例: 23+(45+4)* 40 结果应为:(三地址代码形式) T1:=45+4 T2:=T1*40 T3:=23+T2 附:实验三自下而上语法分析及属性计算 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: LR分析表可用二维数组(或其他)实现。

添加一个val栈作为语义分析实现的工具。 编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40 分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

相关主题