java编译原理语义分析_编译原理实验六:语义分析器

(一)学习经典的语义分析器(2小时)

实验目的

学习已有编译器的经典语义分析源程序。

实验任务

阅读已有编译器的经典语义分析源程序,并测试语义分析器的输出。

实验内容

(1)选择一个编译器,如:TINY或PL/0,其它编译器也可(需自备源代码)。

(2)阅读语义分析源程序,加上你自己的理解。尤其要求对相关函数与重要变量的作用与功能进行稍微详细的描述。若能加上学习心得则更好。TINY语言请参考《编译原理及实践》第6.5节;PL/0语言请参考相关实现文档。

(3)理解符号表的定义(栏目设置)与基于抽象语法树的类型检查/推论的实现方法(树遍历)。

(4)测试语义分析器。对TINY语言要求输出测试程序的符号表与测试结果。对PL/0语言要求给出测试程序的各种符号表的内容。

TINY语言:

测试用例一:sample.tny。

测试用例二:用TINY语言自编一个程序计算任意两个正整数的最大公约数与最大公倍数。

PL/0语言:

测试用例一~三:test.pls,test2.pls,a1.pls。

(二)实现一门语言的语义分析器(6小时)

实验目的

通过本次实验,加深对语义分析的理解,学会编制语义分析器。

实验任务

用C或JAVA语言编写一门语言的语义分析器。

实验内容

(1)语言确定:C-语言,其定义在《编译原理及实践》附录A中。也可选择其它语言,不过要有该语言的详细定义(可仿照C-语言)。一旦选定,不能更改,因为要在以后继续实现编译器的其它部分。鼓励自己定义一门语言。

(2)完成C-语言的符号表的定义设计。规划类型检查/推论的实现方法。

(3)仿照前面学习的语义分析器,编写选定语言的语义分析器。

(4)准备2~3个测试用例,测试并解释程序的运行结果。

声明

因在2018-2019秋季学期中,湖南大学编译原理实验6和实验7(语义分析和代码生成)首次变成了必做实验(之前是选做,几乎没有学长学姐选),难度过大,这里的代码借鉴了git上的一些,不完全本人原创。

源代码下载和使用

https://pan.baidu.com/s/1FToQNdN0Li-R_-UiZPuLvQ

密码:txkz

注意,这一份代码运行在Linux系统下,作者的是Ubuntu 14.04。

运行方法:首先在文件夹下执行make,然后会生成一个compiler文件,那个就是C-的编译器,执行命令:

./compiler -a -f  文件名

即可完成其编译,当然包括语义分析。

实验知识点讲解及源代码函数分析

1、学习经典的语义分析器(TINY)

TINY语言的语义分析器在loucomp文件夹下的analyze.c和symtab.c中,其对应的主要功能,analyse是用于语义分析本身,而symtab则是用于生成其对应的符号表。

进入语义分析部分的代码,则在MAIN.c中:

#if !NO_ANALYZE

if (! Error)

{ if (TraceAnalyze) fprintf(listing


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部