实验二:交叉编译环境的建立

实验二:交叉编译环境的建立
实验二:交叉编译环境的建立

实验二:交叉编译环境的建立

一.实验目的

通过本实验,使学生掌握交叉编译环境的建立,了解在S3C2410平台上交叉编译的工作方式和原理。

二.实验原理和说明

1、minicom 用法:

minicom 是安装REDHAT 时安装的软件,它使用配置文件/etc/minirc.dfl,华恒光盘安装时会提供这个文件。

【注意】

minicom 占用串口,能且仅能启动一个minicom,启动第二个时就会报错:

Device /dev/modem is locked。其中/dev/modem 就是/dev/ttyS0,即PC 机串口1,它是在光盘安装时执行./arminst 时创建的链接。查看arminst 文件,可以看到如下一行: ln -sf /dev/ttyS0 /dev/modem

minicom 所有的操作都以ctrl+A 开始,例如:退出为ctrl+A,松手后再按下Q,则弹出如下一个小框:选Yes 即可退出minicom。

minicom 中最重要的操作就是对其进行配置的修改。这个操作要先ctrl+A,松手后按下o(是字母o,option 之意,不是零),则弹出如下框:

选择第三项“Serial port setup”,则弹出下面框:

键入E 则弹出如下框,可改变波特率:

若要使用PC 机的串口2 来接开发板的串口1 做监控,则要在串口配置框中选择A,即“Serial Device”,则原来的配置框第一行进入编辑模式,将原来的/dev/modem 改为如下的:/dev/ttyS1,即串口2。

退出配置框只需连续按ESC 键即可返回。

2、HHARM9-EDU目录结构介绍

安装过我们提供的光盘以下,会在您的PC机上建立一个HHARM9-EDU的目录。在shell提示符下执行ls命令,可以显示整个PC上的目录结构:

[root@…. root]# cd /

[root@…. /]# ls

HHARM9-EDU boot lost+found opt sbin usr dev home proc tftpboot var initrd misc root tmp bin etc lib mnt

[root@….. /]#

其中在PC机(宿主机)的根目录下安装了HHARM9-EDU的目录和opt目录,其中HHARM9-EDU是开发套件的源代码、驱动、以及相应的应用程序。opt是ARM的编译器存放的目录。进入HHARM9-EDU看看。

[root@……. /]# cd / HHARM9-EDU

[root@HHARM9-EDU /] # ls

Images applications kernel opt.tgz gprs-ppp minirc.dfl ppcboot-2.0.0 record-image SJF

下面对以上目录作简单介绍:

(1) /HHARM9-EDU/SJF/

JTAG烧写工具源码目录,在该目录下执行make,即可生成JTAG烧写工具SJF2410,它就是我们通过JTAG烧写ppcboot要用到的文件。

(2) /HHARM9-EDU/ppcboot/

bootloader源码目录,在该目录下简单的make即可生成HHARM9-EDU的bootloader - ppcboot.bin,可以通过修改这些源码来修改bootloader。

『说明』在嵌入式系统中,我们把引导系统的初始化部分的代码统称为bootloader,相当于PC机的BIOS。但在我们提供的很多套件中,有的引导代码用的是ppcboot,有的是u-boot,有的是bootloader等等,但实际烧写到flash中的文件一般为ppcboot.bin、u-boot.bin、bootloader.bin等二进制代码文件。

(3)/HHARM9-EDU/kernel/

Linux 内核源代码目录,以后如果改动内核后,若重新生成新的内核镜像文件zImage,就可以在此目录下执行make zImage。

(4) /HHARM9-EDU/application/

应用程序目录,用户可参考此目录下的其它目录,其中添加自己的应用程序。

(5) /HHARM9-EDU/Images/

其下是编译好的映像文件或者可执行文件,其中:zImage是编译好的内核文件,SJF2410是编译好的JTAG烧写工具,ppcboot是编译好的引导程序,ramdisk.image.gz是ramdisk 文件系统映像,cramfs.img是cramfs文件系统的镜像文件,jffs2.img是jffs2文件系统的镜像文件。如果是用tftp下载相关的文件,请把相关文件放到/tftpboot目录下。

三.实验内容和步骤

1、NFS的配置

(1) NFS的配置:

首先在REDHAT LINUX PC机上shell提示符[root@….]# 执行setup,弹出菜单界面后,选中:System services,回车进入系统服务选项菜单,在其中选中 [*]nfs ,然后退出setup 界面返回到命令提示符下。

vim /etc/exports

将这个默认的空文件修改为只有如下一行内容:

/ (rw) //即根目录可读写,/和(rw)之间要要留空格

然后保存退出(:wq),然后执行如下命令:

/etc/rc.d/init.d/nfs restart

这样就一切OK了!

【注意】

默认情况下Linux启动时并不启动NFS服务,为了避免每次都要执行以下这一句: /etc/rc.d/init.d/nfs restart

可以把此句写入PC机的脚本文件/etc/rc.d/rc.local中,PC机启动时会执行此文件,不用每次执行上面的那条命令来启动NFS。配置完成后,可用如下办法简单测试一下NFS是否配置好了:

PC机自己mount自己,看是否成功就可以判断NFS是否配好了。例如在PC机的根目录下执行:(假定PC机的IP是192.168.2.122)

mount 192.168.2.122:/ /mnt

然后到/mnt/目录下看是否可以列出所指定的IP的机器(可以是本机,当然可以测试其它机器是否可以被mount)根目录(/)下的所有文件和目录,可以则说明mount成功,NFS 配置成功。

2、TFTP服务的配置:

TFTP服务只在第一次使用时需要配置,以后其开机自己运行。

在PC机上执行setup,选择System services,将其中的tftp一项选中(出现 [*]表示选中),并去掉ipchains和iptables两项服务(即去掉它们前面的*号)。

然后还要选择Firewall configuration,选中No firewall。

【注意】

setup里面的防火墙显示永远都是HIGH,这个是REDHAT一直的一个小BUG,即使你

安装时默认选择了NO FIREWALL,setup里面也照样会显示防火墙设置是HIGH的,这个

可以不必理会。只要你选择了一次NO FIREWALL就可以了。

最后,退出setup,执行如下命令以启动TFTP服务:

service xinetd restart

配置完成后,建议简单测试一下TFTP服务器是否可用,即自己tftp自己,例如在PC

机上执行:

cd /

cp /etc/inittab /tftpboot/ /*随便拷贝一个文件到/tftpboot目录下以供下面使用tftp命令下

载,如果在/tftpboot目录下没有下面使用get命令下载的文件,会提示您没有找到相关文件。

*/

tftp 192.168.2.122

tftp> get inittab

若出现如下信息:

Received 741512 bytes in 0.7 seconds

就表示TFTP服务器配置成功了。在根目录下就会在刚才下载的inittab文件存在了;若

弹出信息说:Timed out,则表明未成功,或者用如下命令查看tftp服务是否开通:netstat -a|grep tftp

若TFTP服务器没有配置成功,需要按照上述步骤重新检查一遍。

【注意】

对于REDHAT7.2及以前的版本,需要使用linuxconf命令来配置NFS。

4、内核编译

如果想编译可以在非X86系统的CPU中运行的可执行的程序,必须安装适合于此CPU

体系结构的编译工具,也就是说不同的CPU体系结构用的编译器是不一样的,HHARM9-EDU使用的交叉编译的工具被放置到/opt/host/armv4l目录下。

GNU工具集

armv4l-unknown-linux-gcc armv4l-unknown-linux-objcopy Armv4l-unknown-linux-gdb armv4l-unknown-linux-as armv4l-unknown-linux-objdump Armv4l-unknown-linux-gasp armv4l-unknown-linux-ld armv4l-unknown-linux-strip Armv4l-unknown-linux-size armv4l-unknown-linux-g++ armv4l-unknown-linux-nm Armv4l-unknown-linux-addr2line armv4l-unknown-linux-cc1 armv4l-unknown-linux-ar

armv4l-unknown-linux-cpp armv4l-unknown-linux-ranlib

armv4l-unknown-linux-cc1plus armv4l-unknown-linux-strings

cd /HHARM9-EDU/kernel

make menuconfig

则出现如下界面,可逐项对内核和驱动模块进行选择和配置:

可见内核版本为:Linux Kernel v2.4.18-rmk7-pxa1

一些关键的设置:

System Type --->

(S3C2410-based) ARM system type

--- S3C2410 Implementation

[*] SMDK (MERI TECH BOARD)

[*] change AIJI

< > S3C2410 USB function support

--- Processor Type

[*] ARM920T CPU idle

[*] ARM920T I-Cache on

[*] ARM920T D-Cache on

[ ] Force write through caches on ARM920T

[ ] Support Thumb instructions (experimental)

完成自己的设置后,退出,保存配置,然后执行make zImage即可编译生成自己定制的内核映像文件zImage,此文件会被复制到/tftpboot/目录下以供烧写。

整个编译过程可如下观察:

make zImage &>log

vim log

5、下载、烧写内核映像和各个文件系统

烧写的大致过程如下:

1.按复位键重启教学试验平台,在minicom中应该有启动信息,立即按回车,让教学试验平台停留在ppcboot的提示符” SMDK2410 #”,进行以下烧写;

2.下载、烧写内核zImage;

3.下载、烧写文件系统ramdisk.image.gz;

4.下载、烧写cramfs文件系统和JFFS2文件系统;

A.按一下复位键,在minicom中按一下回车或其它键让教学试验平台停留在“SMDK2410#”提示符下

PPCBoot 2.0.0 (Dec 15 2003 - 09:41:17)

PPCBoot code: 33F00000 -> 33F15118 BSS: -> 33F18318

DRAM Configuration:

Bank #0: 30000000 64 MB

Flash: 16 MB

start linux now(y/n):

SMDK2410 # //需要立即按回车或其它键,让其停留在此提示符下,否则其会一直向下引导,可以按一下复位键,重复这一过程。

如何查看板子从什么IP地址的TFTP SERVER下载?板子启动时,按下回车,就进入ppcboot命令提示符 smdk2410# 这时执行

smdk2410#printenv 显示信息里面的serverip就是板子所要下载文件的TFTP SERVER 的IP地址,也就是说你的LINUX PC机的IP地址要设置为这个IP才能下载烧写。

用户可动态改写实验箱TFTP下载的serverip,并可以直接保存且下次重启后,改动仍然生效。

改写serverip的步骤和格式如下:在正常启动时,按ctrl+c进入smdk2410#提示符,在提示符下直接执行例如原先的serverip为192.168.2.25 现改为192.168.2.110 格式为:smdk2410#setenv serverip 192.168.2.110 设置 smdk2410#save 保存

关于下载和烧写的说明,可直接参见: /HHARM9-EDU/Images/HHTECH-burn-cmd里面记录的操作。

B.通过TFTP下载内核

SMDK2410 # tftp 30008000 zImage

Bytes transferred = 753148 (b7dfc hex) //

【注意】括号中的数值表示刚下载文件的大小(十六进制值)

如果PC机上TFTP服务没有配置正确,或配置的TFTP服务器的IP地址和开板要求的不一致,会反复出现以下信息提示:

C.烧写刚下载的linux内核

SMDK2410 # fl 40000 30008000 e0000

D. 通过TFTP服务下载文件系统

SMDK2410 # tftp 30800000 ramdisk.image.gz

E. 烧写刚下载的文件系统

SMDK2410 # fl 140000 30800000 220000

SMDK2410 #

『说明』

1.后面没有列出cramfs和JFFS2文件系统烧写的相关信息,和烧写ramdisk.image.gz 一样,先下载,再烧写,只是烧写到flash中的位置不一样,这个位置是根据/HHARM9-EDU/kernel/drivers/mts/maps/s3c2410_llg.c文件中指定的位置确定的,请用户自行打开文件看看具体的应该烧写的位置。

2.用户可以修改ppcboot中指定的TFTP服务器和教学试验平台的IP地址。

修改TFTP服务器的IP地址有两种方法。

A.不用重新烧写ppcboot.bin,启动教学试验平台,让其停留在“SMDK2410 #”提示符下,键入以下命令,即可把您刚设置的IP保存在flash中,重新启动一下教学试验平台,则再下载文件时,指定的TFTP服务器的IP就改成您刚设置的IP了,这样并没有重新烧写ppcboot.bin文件。

SMDK2410 # setenv serverip 192.168.2.111

SMDK2410 # save

按教学试验平台上的复位键重新启动教学试验平台,则下次通过tftp下载文件时,所要求的tftp服务器的IP就为192.168.2.111了。

B.修改设置TFTP服务器的IP源文件,重新烧写ppcboot.bin文件。

vim /HHARM2410-R3/ppcboot-2.0.0/include/configs/smdk2410.h

修改如下一行:

#define CONFIG_SERVERIP 192.168.2.122

然后重新编译ppcboot,重新烧写新的ppcboot.bin。

6、启动过程

Please press Enter to activate this console.

BusyBox v1.00-pre10 (2004.07.28-02:07+0000) Built-in shell (ash)

Enter 'help' for a list of built-in commands.

~ #~ # ls

bin etc jffs2 lost+found root usr

cramfs font lib mnt sbin var

dev home linuxrc proc tmp

~ # cd jffs2/

/jffs2 # ls

asp_test hhcn hn home ipset myapp

/jffs2 # cd home/httpd/

home/httpd/cgi-bin/ home/httpd/html/ home/httpd/log/

/jffs2 # cd home/httpd/

/jffs2/home/httpd #

~ #

~ # cd /carmfs/modules

/cramfs/modules # ls

2410audio.o digi.o mmcsd_core.o mmcsd_disk.o mmcsd_slot.o

其它信息情况

~ # ps

PID Uid VmSize Stat Command

1 root 520 S init

2 root SW [keventd]

3 root SWN [ksoftirqd_CPU0]

4 root SW [kswapd]

5 root SW [bdflush]

6 root SW [kupdated]

7 root SW [mtdblockd]

8 root SW [khubd]

31 root SWN [jffs2_gcd_mtd4]

39 root 600 S /cramfs/sbin/boa

41 root 504 S syslogd

43 root 528 S /cramfs/sbin/inetd

55 root 664 S -sh

57 root 584 R ps

~ # cat /proc/interrupts

0: 1 DM9000 device

1: 0 digi

13: 0 DMA timer

14: 18700 timer

21: 0 SDI

26: 0 usb-ohci

46: 0 SD CD

52: 182 serial_s3c2410_rx

53: 650 serial_s3c2410_tx

54: 0 serial_s3c2410_err

Err: 0

~ #

7、更新ppcboot自身

当需要对ppcboot本身进行修改升级的时候,也是同样的通过tftp下载更新的ppcboot.bin,使用fl进行烧写,实现对自身更新。

先执行tftp命令把修改编译后的ppcboot.bin文件下载到RAM中:

SMDK2410#tftp 30008000 ppcboot.bin

然后打开FLASH对第一个扇区的写保护,进行烧写:

SMDK2410#protect off 1:0

SMDK2410#fl 0 30008000 20000 四.思考题

windows安装交叉编译环境

Duanxx的嵌入式学习: Win7安装交叉编译环境 ——Duanxx ——2015-09-15 ARM-linux的交叉编译环境,一般的教程都是在linux系统(比如ubuntu)上安装linaro的arm-linux-gnueabihf编译环境,然后再安装Eclipse和CDT,这样来实现交叉编译环境的安装。 我个人使用这种方法已经使用了几年了,因为我个人比较喜欢使用Linux系统(我使用的是CentOS),所以感觉很自然。但对于初学者而言,如果对linux系统不熟悉,这个方法非常的麻烦,仅仅是为了编译一个可以在ARM-linux上运行的elf文件,还要装虚拟机,学习linux系统的很多使用方法,挺麻烦的。 这两天试了一下在windows平台上安装交叉编译环境,成功了,这里将详细教程写下来,就当是做个记录。 目录 一、安装Eclipse (2) 二、安装CDT (3) 2.1Eclipse Marketplace 安装CDT (4) 2.2 Install New Software 安装CDT方案1 (4) 2.3 Install New Software 安装CDT方案2 (7) 2.4 手动安装CDT (9) 三、安装minGW (10) 四、安装Linaro ToolChain (10) 五、搭建交叉编译开发环境 (13) 六、RSE将可执行文件传输到ARM上 (26)

一、安装Eclipse Eclipse的下载网址是:https://www.360docs.net/doc/6c3280826.html,/downloads/ 会有下面的这个网页,我打红色框的都可以直接使用,这里其实是无所谓的,因为Eclipse是基于插件的开发环境,如果只是为了开发C++的,可以考虑选择后面一个“Eclipse IDE for c/C++ Developers”。 Eclipse解压后就可以直接使用,见下图中的eclipse.exe,同时注意一下freatures和plugins文件夹。

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验词法解析总结器的设计及实现.doc

南华大学 计算机科学与技术学院 实验报告 ( 2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号

专业班级 地点教师 1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以 <种别码,值 >的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符 >::=< 字母 >|< 标识符 ><字母 >|< 标识符 ><数字 >

<常数 >::=< 数字 >|< 数字序列 ><数字 > <数字序列 >:: =<数字序列 ><数字 >|< 数字 >|<.> <字母 >::=a|b|c|??|x|y|z <数字 >::=0|1|2|3|4|5|6|7|8|9 <运算符 >::=< 关系运算符 >|< 算运算符 >|< 运算符 >|< 位运算符 >|< 运算符 > <算数运算符 >:: =+|-|*|/|...|-- <关系运算符 >:: =<|>|!=|>=|<=|== <运算符 >::=&&| || |! <位运算符 >::=&| | |! <运算符 >::==|+=|-=|/=|*= <分界符 >:: = ,|;|(|)|{|}|:| // |/**/ <保留字 >:: = main|if|else|while|do|for|...|void 2.符号的 符号种符号种 main0>26 if1>=27 else2<28 while3<=29 do4!30 for5!=31

编译实验

SAMPLE语言定义 一、字符集定义 1.<字符集> →<字母>│<数字>│<单界符> 2.<字母> →A│B│…│Z│a│b│…│z 3.<数字> →0│1│2│…│9 4.<单界符> →+│-│*│/│=│<│>│(│)│[│]│:│. │; │, │' 二、单词集定义 5.<单词集> →<保留字>│<双界符>│<标识符>│<常数>│<单界符> 6.<保留字> →and│array│begin│bool│call│case│char│constant│dim│do│else│end│false│for│if│input│integer│not│of│or│output│procedure│ program│read│real│repeat│set│stop│then│to│true│until│var│while│ write 7.<双界符> →<>│<=│>=│:= │/*│*/│.. 8.<标识符> →<字母>│<标识符> <数字>│<标识符> <字母> 9.<常数> →<整数>│<布尔常数>│<字符常数> 10.<整数> →<数字>│<整数> <数字> 11.<布尔常数> →true│false 12.<字符常数> →' 除{'} 外的任意字符串' 三、数据类型定义 13.<类型> →integer│bool│char 四、表达式定义 14.<表达式> →<算术表达式>│<布尔表达式>│<字符表达式> 15.<算术表达式> →<算术表达式> + <项>│<算术表达式> - <项>│<项> 16.<项> →<项> * <因子>│<项> / <因子>│<因子> 17.<因子> →<算术量>│- <因子> 18.<算术量> →<整数>│<标识符>│(<算术表达式> ) 19.<布尔表达式> →<布尔表达式> or <布尔项>│<布尔项> 20.<布尔项> →<布尔项> and <布因子>│<布因子> 21.<布因子> →<布尔量>│not <布因子> 22.<布尔量> →<布尔常量>│<标识符>│(<布尔表达式> )│ <标识符> <关系符> <标识符>│<算术表达式> <关系符> <算术表达式> 23.<关系符> →<│<>│<=│>=│>│= 24.<字符表达式> →<字符常数>│<标识符> 五、语句定义 25.<语句> →<赋值句>││<复合句> 26.<赋值句> →<标识符> := <算术表达式> 27.→if <布尔表达式> then <语句>│if <布尔表达式> then <语句> else <语句> 28. →while <布尔表达式> do <语句> 29. →repeat <语句> until <布尔表达式> 30.<复合句> →begin <语句表> end 31.<语句表> →<语句> ;<语句表>│<语句>

嵌入式交叉编译环境的搭建

实验二、嵌入式交叉编译环境的搭建 1、实验目的: 通过本实验使学生掌握交叉编译环境的建立,了解在S3C2440上交叉编译环境搭建的原理及步骤。 2、实验设备及说明 1、安装ubuntu10及vmware的计算机 2、天嵌2440的开发板 3、实验指导书 4、天嵌开发板的超级终端设置 5、天嵌开发板开发文档 6、TQ2440使用手册v2.3---20100125 3、实验内容和步骤 1、安装交叉编译器:EABI4.3.3 ●解压EABI 工具包 命令:tar zxvf /mnt/hgfs/(根据本机压缩包存储路径输入)/EABI 4.3.3.tar.gz –C / ##将压缩包解压到根目录下 ●添加路径至全局变量PATH中 命令:PATH=$PAHT:/opt/EmbedSky/4.3.3/bin (此路径应根据本机的具体情况输入) ●查看全局变量PATH 命令:echo PATH ###查看刚才的添加是否成功 ●查看交叉编译命令是否能够使用 命令:arm-linux-gcc –v ###如果刚才解压、添加变量成功,此时输入命令后,即可以显示命令的版本信息。

2、minicom

●在线安装minicom 命令:apt-get install minicom ●在命令行中键入“minicom”,这就启动了minicom软件。 ●Minicom在启动时默认会进行初始化配置minicom -s ?CTRL+A Z,来查看minicom的帮助 ?CTRL-A O配置minicom的串口参数,选择“Serial port setup”子项,上面列出的配置是minicom启动是的默认配置,用户可以通过键入每一项前的大写字母,分别对每一项进行更改.要对波特率、数据位和停止位进行配置,键入“E”,在该配置界面中,可以键入相应波特率、停止位等对应的字母,即可实现配置,配置完成后按回车键就退出了该配置界面。在确认配置正确后,可键入回车返回上级配置界面,并将其保存为默认配置。 ?

嵌入式操作系统实验一建立交叉编译环境

嵌入式操作系统实验一建 立交叉编译环境 Last updated on the afternoon of January 3, 2021

嵌入式操作系统实验报告 队友:张圣苗亚 实验内容 1、准备工作工作:安装virtualbox虚拟机工具,并安装系统、增强型工具,实现共享文件夹的自动挂载。 2、利用crosstool提供的脚本安装和相关资源编译面向的ARM的GCC工具。 详细内容1:安装虚拟机软件和虚拟机时要完成的主要步骤有:安装virtualbox,建立一台虚拟机,分配内存和硬盘,指定共享文件夹(主机和虚拟机可共同操作),指定操作系统镜像文件路径(相当于光盘,第一次启动时安装),安装虚拟操作系统,安装增强工具包,实现共享文件夹的自动挂载。有几点需要注意: 1、虚拟硬盘尽量分配大一些,之后再扩就比较麻烦。 2、共享文件夹不要有中文路径,不然挂载后看不到中文名称文件。 3、安装操作系统时,不能断网,需要下载各种资源,不然会异常。 详细内容2需要安装与脚本相关的工具,需要修改crosstool中的配置文件以指定编译的目标位arm-linux。需要修改需要的资源 实验步骤 实验准备: 在实验准备中,在安装完增强工具包()并重启之后,需要实现对共享文件夹的自动挂载,只需要修改etc目录中的配置文件,是很多linux系统管理员的偏爱,因为凡是需要随系统自动启动的服务、程序等,都可以放在里面。 $sudomkdir/mnt/share $sudomount-tvboxsfembedded/mnt/shared 上面三句话实现了将共享文件夹embeded挂载到了share上。 gedit/etc/ 将第2句命令添加在exit之前,实现了自动挂载功能。 实验一 一、搭建编译环境 1、安装于脚本运行相关及其他的工具bison、flex、build-essential、patch、libncurses5-dev。

编译原理实验题目及报告要求

编译原理上机实验试题 一、实验目的 通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术, 如何针对确定的有限状态自动机进行编程序;熟悉和 掌握程序设计语言的语法分析程序的设计原理、熟悉 和掌握算符优先分析方法。 二、实验要求 本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告); ③要编写出完成相应任务的程序并在计算机上准确 地运行;④实验结束后要写出上机实验报告。 三、实验题目 针对下面文法G(S): S→v = E E→E+E│E-E│E*E│E/E│(E)│v │i 其中,v为标识符,i为整型或实型数。要求完成 ①使用自动机技术实现一个词法分析程序; ②使用算符优先分析方法实现其语法分析程序,在 语法分析过程中同时完成常量表达式的计算。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第一项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理: (1)单词分类:标识符,保留字,常数,运算符,分隔符等等 (2)单词类型编码 (3)自动机 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第二项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理:构造出算法优先关系表 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

编译实验报告+源代码

课程设计报告 ( 2013-- 2014年度第1学期) 名称:编译技术课程设计B 题目:简单编译程序的设计与实现院系:计算机系 班级:XXX 学号:XXX 学生姓名:XXX 指导教师:XXX 设计周数:XXX 成绩: 日期:XX 年XX 月

实验一.词法分析器的设计与实现 一、课程设计(综合实验)的目的与要求 1.1 词法分析器设计的实验目的 本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。 1.2 词法分析器设计的实验要求 设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。 表1-1 单词符号及其内部表示

二、设计(实验)正文 1.词法分析器流程图 2.词法分析器设计程序代码 // first.cpp : 定义控制台应用程序的入口点。// #include"stdafx.h" #include #include using namespace std; int what(char a) { if((int(a)>=48)&&(int(a)<=57)) {

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

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 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<<"请输入中缀表达式: ";

ubuntu10.04全过程创建交叉编译环境

ubuntu10.04下建立交叉编译工具链(支持软浮点)全过程 参考了网上的不少的资料,花了五个小时终于完成了,记录下全过程供大家分享。 用到的源码包如下,建议新手全部放在/home/usr/downloads/ 目录下。以下操作在用户权限下进行。 ======================================================================= arm-linux-gcc-3.4.1.tar.gz glibc-2.3.3.tar.gz linux-2.6.8.tar.gz crosstool-0.43.tar.gz binutils-2.15.tar.gz glibc-linuxthreads-2.3.3.tar.gz binutils-2.18.tar.gz --安装用 编译一次至少要花半个小时,如果因为依赖软件没有安装中途会报错退出,只有从头再来,那样很浪费时间的。 sudo apt-get install bison flex build-essential patch libncurses5-dev 由于ubuntu10.04自带的ld ,as版本太高的原因,需要安装binutils的2.18版本,然后替换系统中的2.20版本。方法如下: $cd downloads $tar xzvf binutils-2.18.tar.gz $cd binutils-2.18 $./configure --prefix=/tmp/binutils --disable-nls (-prefix后面的是生成可执行文件存放的位置可以自己定义) $make all $make install 编译成功后在/tmp/binutils/bin/中就生成了ld和as程序的可执行文件 重新链接/usr/bin/ld 和/usr/bin/as文件 $sudo rm /usr/bin/ld /usr/bin/as //删除2.20的ld,as $sudo ln –s /tmp/binutils/bin/ld /usr/bin/ $sudo ln –s /tmp/binutils/bin/as /usr/bin/ 然后可运行ld –v 和as –v 查看版本是否为2.18。 安装2.18版本可解决出现的 ld as " version too old "问题。 2. ubuntu10.04下默认的GCC版本是4.4.3,但这个不是版本越高越好,版本太高,对语法什么的要求也高,编译不成功,降低版本吧: #sudo apt-get install gcc-4.1 //安装4.1的GCC,需要联网 #sudo rm /usr/bin/gcc //删除之前4.4.3的快捷方式,4.4.3的GCC并未删除#sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc //建立4.1的快捷方式 这是由于crosstool中定义了GCC的版本的上下线,最高也就到4.1,在其配置的时候会对这个版本信息进行检测,不在其规定范围就报错了。 3.修改sh版本 如果运行

《编译原理(实验部分)》实验1_程序预处理

《编译原理》(实验部分) 实验1_程序预处理 一、实验目的 明确预处理子程序的任务,构造一个简单的预处理子程序,对源程序进行相应的预处理。 二、实验设备 1、PC 兼容机一台;操作系统为WindowsWindowsXP。 2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。 三、实验原理 定义模拟的简单语言的词法构成,编制读入源程序和进行预处理的程序,要求将源程序读入到文件或存入数组中,再从文件或数组中逐个读取字符进行预处理,包括去掉注释、Tab、Enter和续行符等操作,并显示预处理后的程序。 四、实验步骤 1、从键盘读入源程序存放到输入缓冲区中。 2、对源程序进行预处理,预处理后的程序存放到扫描缓冲区中。 3、显示预处理后的程序。 参考源程序(C++语言编写) //源程序的输入及预处理 #include #include void pro_process(char *); void main( ) //测试驱动程序

{ //定义扫描缓冲区 char buf[4048]={'\0'}; //缓冲区清0 //调用预处理程序 pro_process(buf); //在屏幕上显示扫描缓冲区的内容cout<='A' && cur_c<='Z') //大写变小写 cur_c+=32; if(cur_c =='\t' || cur_c =='\n') //空格取代TAB换行 cur_c=' '; buf[i++]=cur_c ;

编译原理实验指导

编译原理实验指导书 主编:徐静李娜 信息与电气工程学院 2010年3月

概述 一、本课程实验的目的和任务 编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。 二、实验方法 任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求 每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、实验目的 二、程序设计时采用的算法和方法 三、输入的源程序 四、词法分析程序清单和输出结果。 五、心得体会

实验一词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2. 单词的BNF表示 <标识符>→ <字母><字母数字串> <字母数字串>→<字母><字母数字串>|<数字> <字母数字串>| <下划线><字母数字串>|ε <无符号整数>→<数字> <数字串> <数字串>→<数字><数字串>|ε <加法运算符>→+ <减法运算符>→- <大于关系运算符>→> <大于等于关系运算符>→>= 3. “超前搜索”方法

编译程序实验指导书讲解教学提纲

编译程序实验指导书解讲. 编译程序实验指导书 实验目的:用C语言对一个C语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 1.词法分析 1.1 实验目的 设计、编制并测试一个词法分析程序,加深对词法分析原理的理解。 1.2 实验要求 1.2.1 待分析的C语言子集的词法 1. 关键字

main if else int char for while 所有的关键字都是小写。 2.专用符号 = + - * / < <= > >= == != ; : , { } [ ] ( ) 3.其他标记ID和NUM 通过以下正规式定义其他标记: →letter(letter|digit) *ID →digit digit *NUM letter→a|…|z|A|…|Z digit→0|…|9… 4.空格由空白、制表符和换行符组成 空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。 1.2.2 各种单词符号对应的种别码 表1 各种单词符号的种别码 单词符号种别码单词符号种别码单词符号种别码 main 1 = 21 , 32 int 2 + 22 : 33 char 3 - 23 ; 34 if 4 * 24 > 35 else 5 / 25 < 36 for 6 ( 26 >= 37 while 7 ) 27 <= 38 ID 10 [ 28 == 39 MUN 20 ] 29 != 40 { 30 ‘\0' 1000 } 31 ERROR -1 1.2.3 词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中, . syn为单词种别码。 . Token为存放的单词自身字符串。 . Sum为整型常量。 具体实现时,可以将单词的二元组用结构进行处理。 例如,对源程序 main() { int i=10; while(i) i=i-1; } 的源文件,经词法分析后输出如下序列: (1,main) (26,() (27,)) (30,{} (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,)) (10,i) (21,=) (10,i) (23,-) (20,1) (34,;) (31,))

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

交叉编译环境的搭建简介(精)

交叉编译环境的搭建简介 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture、操作系统(Operating System。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。 有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。 交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码编译(compile成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC 平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和 运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain需要很大的存储空间,并需要很强的CPU 运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上编译出针对其他平台的可执行程序。

编译实验2

实验二基于YACC的TINY语法分析实验 一、实验目的 在这一阶段的实验中,同学们要完成tiny编译器的语法分析工作,即用bison工具生成一个语法分析程序,对词法分析输出的单词符号串(终结符串)进行自底向上的分析,并依次输出用来进行归约的语法规则。 二、Tiny语言的语法 参见教材。请大家注意,文档中给出的BNF描述并不能直接被YACC识别,而是需要进行适当的改写。请大家在做实验前,仔细研究一下教材中给出的例子。 三、软件工具及文档说明 实验环境为Windows操作系统,语法分析使用的主要工具是bison。我们会提供给大家一些基本的数据结构、程序框架以及工具软件。实验所用到的程序和工具主要包括两部分:1.工具和程序框架(在StarterFiles路径下) 以下是主要文件的列表: pp2.dsp/dsw pp2工程文件不需要改动 main.c 主程序不需要改动 scanner.h 词法分析程序的头文件不需要改动 scanner.l 词法分析程序需要改动 parser.h 语法分析程序的头文件不需要改动 parser.l 语法分析程序需要改动 utility.h 一些工具函数不需要改动 test.frag 测试文件不要改动 flex.exe 工具不要改动 bison.exe/simple 工具不要改动 debug.bat 工具不要改动 程序的执行方法是: (0)先根据完善parse.y(否则会编译出错) (1)运行debug.bat(会生成parser_tab.h和parser_tab.c); (2)用vc6.0打开pp2.dsw,编译链接生成pp2.exe; (3)运行pp2 [filename]。其中filename是可选部分,如果没有filename,就默认是打开test.frag,否则就打开filename指定的文件。这样设计,主要考虑在调试pp2程序时比较方便,但是测试程序时还是要对实例中给出的*.frag文件逐一进行测试。另外,大家最好自己再编写一些合法和不合法的源文件,对程序进一步进行测试。 scanner.l是我们为大家提供的词法分析器,如果不对tiny语言本身作任何扩展,则不需要修改它,如果想对语言进行扩展,就要对它进行相应的修改。大家也可以用自己在PP1实验中实现的词法分析器代替scanner.l,但是一定要保证你的词法分析器的输出和我们所提供的词法分析器的输出是一致的,否则会影响语法分析器的实现。 2.实例(在samples路径下) *.frag Tiny源程序 *.out 正确的语法分析结果

编译原理实验四

编译原理实验报告 实验名称NFA转换为DFA 实验时间2014-5-18 院系计算机科学与技术学院 班级 学号 姓名

1.试验目的 不确定有限状态自动机的确定化(Affirmation of the indefinitely finite automata) 2.实验原理 一个确定的有限自动机(DFA)M可以定义为一个五元组,M=(K,∑,F,S,Z),其中: (1)K是一个有穷非空集,集合中的每个元素称为一个状态; (2)∑是一个有穷字母表,∑中的每个元素称为一个输入符号; (3)F是一个从K×∑→K的单值转换函数,即F(R,a)=Q,(R,Q∈K)表示当前状态为R,如果输入字符a,则转到状态Q,状态Q称为状态R的后继状态; (4)S∈K,是惟一的初态; (5)Z?K,是一个终态集。 由定义可见,确定有限自动机只有惟一的一个初态,但可以有多个终态,每个状态对字母表中的任一输入符号,最多只有一个后继状态。 对于DFA M,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记符连接形成的字符串可为DFA M所接受。若M的初态结点同时又是终态结点,则称ε可为M所接受(或识别),DFA M所能接受的全部字符串(字)组成的集合记作L(M)。 一个不确定有限自动机(NFA)M可以定义为一个五元组,M=(K,∑,F,S,Z),其中: (1)k是一个有穷非空集,集合中的每个元素称为一个状态; (2)∑是一个有穷字母表,∑中的每个元素称为一个输入符号; (3)F是一个从K×∑→K的子集的转换函数; (4)S?K,是一个非空的初态集; (5)Z?K,是一个终态集。 由定义可见,不确定有限自动机NFA与确定有限自动机DFA的主要区别是: (1)NFA的初始状态S为一个状态集,即允许有多个初始状态; (2)NFA中允许状态在某输出边上有相同的符号,即对同一个输入符号可以有多个后继状态。即DFA中的F是单值函数,而NFA中的F是多值函数。 因此,可以将确定有限自动机DFA看作是不确定有限自动机NFA的特例。和DFA一样,NFA也可以用矩阵和状态转换图来表示。 对于NFA M,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记(ε除外)连接形成的字符串可为M所接受。NFA M所能接受的全部字符串(字)组成的集合记作L(M)。 由于DFA是NFA的特例,所以能被DFA所接受的符号串必能被NFA所接受。 设M 1和M 2 是同一个字母集∑上的有限自动机,若L(M 1 )=L(M 2 ),则称有 限自动机M 1和M 2 等价。 由以上定义可知,若两个自动机能够接受相同的语言,则称这两个自动机等 价。DFA是NFA的特例,因此对于每一个NFA M 1总存在一个DFA M 2 ,使得L(M 1 ) =L(M 2 )。即一个不确定有限自动机能接受的语言总可以找到一个等价的确定有限自动机来接受该语言。

相关文档
最新文档