编译原理实验⼀1基于C语⾔的TINY编译器与TM虚拟机forLinux
⽂章⽬录
linux操作系统书籍
实验⼀ / 第⼀部分
实验内容:
1.⽣成TINY编译器
顺序表和链表的特点2.⽣成TM虚拟机
3.通过条件编译⽣成部分编译器
4.使⽤flex⽣成TINY编译器
5.使⽤bison⽣成TINY编译器
实验环境
按照⽼师的要求,以及课程中⼼提供的所有环境资料,这个实验本应在win下运⾏,搭配VC++。Linux⽤
户只能⾃⼰⼿写Makefile,强迁Linux⽣产环境。好在搜寻了近⼀天到了这个实验的所有源代码,我⼜快乐了!这个实验,我结合了⾃⼰的⼀些理解,写了⼏个Makefile,希望能够给⼤家带来启发。
plyingtabletennis中文操作系统:Linux
操作软件:VsCode
资源
Tiny源代码:
参考书籍:《编译原理及实践》
源码部署
源码,⼀定⼀定要从GitHub上拿,不是质量问题,是环境适配问题,⼀般⽹上的都是win的源码,强改Makefile适配Linux 代价巨⼤,建议绕⾏(下⾯也有windows源码改Linux的教程)。
下载源码
$ git clone github/bigconvience/BooksCode
拿到loucomp_linux之后,要修改makefile,让他更加适合本实验,修改如下,新增了 -w选项屏蔽警告,make cifa选项条件编译。
#
# Makefile for TINY
# Gnu C Version
# K. Louden 2/3/98
# updated by qdl in 2020/10/30
#
CC = gcc
CFLAGS = -w
OBJS = main.o util.o scan.o parse.o symtab.o analyze.o code.o cgen.o all: tiny tm
tiny: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o tiny
tm: tm.c
$(CC) $(CFLAGS) tm.c -o tm
cifa: cifaMain.o util.o scan.o
$(CC) $(CFLAGS) -o $@ cifaMain.o util.o scan.o
cifaMain.o: cifaMain.c globals.h
$(CC) $(CFLAGS) -c cifaMain.c
main.o: main.c globals.h util.h scan.h parse.h analyze.h cgen.h
$(CC) $(CFLAGS) -c main.c
util.o: util.c util.h globals.h
$(CC) $(CFLAGS) -c util.c
scan.o: scan.c scan.h util.h globals.h
$(CC) $(CFLAGS) -c scan.c
parse.o: parse.c parse.h scan.h globals.h util.h
$(CC) $(CFLAGS) -c parse.c
symtab.o: symtab.c symtab.h
$(CC) $(CFLAGS) -c symtab.c
analyze.o: analyze.c globals.h symtab.h analyze.h
$(CC) $(CFLAGS) -c analyze.c
code.o: code.c code.h globals.h
$(CC) $(CFLAGS) -c code.c
cgen.o: cgen.c globals.h symtab.h code.h cgen.h
$(CC) $(CFLAGS) -c cgen.c
clean:
-rm tiny
-rm tm
-rm $(OBJS)
-rm cifaMain.o
-rm cifa
for Linux环境就搭建好了,只要两个步骤即可。
oracle预定义角解决for windows的tiny源码适配Linux问题,⽹上拿到的源码⼤多是在windows环境下运⾏的,如果你不是使⽤的git仓库中的代码loucomp_linux,那么接下来的操作或许对你有⽤。
看了看makefile⽂件,-del,⼀个标准的windwos-shell,要适配linux则应该修改Makefile;除此之外,还有⽂件命名问题,⽬录中所有⽂件都是⼤写,但是引⼊头⽂件却是⼩写,因此要修改⽂件命名;为使这个TINY源代码适应Linux,主要有两步:
修改⽂件名:
在⽹上看到的⼀条脚本,可以将⽬录下所有的⽂件命名为⼩写。(建议⽂件夹不要修改)
for i in *
do
mv$i`ls $i | tr[A-Z][a-z]`
done
修改Makefile:
#
# Makefile for TINY
# Gnu C Version
# K. Louden 2/3/98
# updated by qdl in 2020/10/30
#
CC = gcc
CFLAGS = -w
OBJS = main.o util.o scan.o parse.o symtab.o analyze.o code.o cgen.o all: tiny tm
tiny: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o tiny
tm: tm.c
$(CC) $(CFLAGS) tm.c -o tm
cifa: cifaMain.o util.o scan.o
$(CC) $(CFLAGS) -o $@ cifaMain.o util.o scan.o
cifaMain.o: cifaMain.c globals.h
$(CC) $(CFLAGS) -c cifaMain.c
main.o: main.c globals.h util.h scan.h parse.h analyze.h cgen.h
gzipstream
$(CC) $(CFLAGS) -c main.c
util.o: util.c util.h globals.h
$(CC) $(CFLAGS) -c util.c
scan.o: scan.c scan.h util.h globals.h
$(CC) $(CFLAGS) -c scan.c
parse.o: parse.c parse.h scan.h globals.h util.h
$(CC) $(CFLAGS) -c parse.c
symtab.o: symtab.c symtab.h
$(CC) $(CFLAGS) -c symtab.c
analyze.o: analyze.c globals.h symtab.h analyze.h
$(CC) $(CFLAGS) -c analyze.c
code.o: code.c code.h globals.h
$(CC) $(CFLAGS) -c code.c
cgen.o: cgen.c globals.h symtab.h code.h cgen.h
$(CC) $(CFLAGS) -c cgen.c
clean:
-rm tiny
-
rm tm
-rm $(OBJS)
-rm cifaMain.o
-rm cifa
⾄此环境搭建成功
实验步骤
makefile编译程序
$ make
1.⽣成TINY编译器
$ ./
结果:
2.⽣成TM虚拟机
$ ./
TM  simulation (enter h for help)...
Enter command: g
Enter value for IN instruction: 7
OUT instruction prints: 5040
HALT: 0,0,0
Halted
Enter command: q
Simulation done.
3.通过条件编译⽣成部分编译器
由于使⽤Linux环境,⽤Makefile可以完成部分编译器的编译,因此没必要⽤VC++,前提是合理的编写Makefile。
新建⽂件cifaMain.c,内容由main.c拷贝。然后修改cifaMain.c
修改cifaMain.c中条件编译标志和控制显⽰标志
NO_PARSE:从FALSE改为TRUE
EchoSource和TraceScan:从FALSE改为TRUE
Makefile增加两⾏(在开始的Makefile修改中已经完成):
cifa: cifaMain.o util.o scan.o
$(CC) $(CFLAGS) -o $@ cifaMain.o util.o scan.o
cifaMain.o: cifaMain.c globals.h util.h scan.h
$(CC) $(CFLAGS) -c cifaMain.c手机能开发软件吗
使⽤make cifa进⾏部分编译
$ make cifa
测试cifa:
$ ./
4.使⽤flex⽣成TINY编译器
安装flex

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。