自己动手实现简单编译器之(二)词法分析器和有穷自动机

一:实验指导书

对下述单词表定义的语言设计编制一个词法分析器。单词符号及种别表和词法分析器功能及基本要求如下:

(1)单词符号及种别表


单词符号


种别编码


单词值


main


1

 

int


2

 

float


3

 

double


4

 

char


5

 

if


6

 

else


7

 

do


8

 

while


9

 

l(l|d)*


10


内部字符串


( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε)


20


二进制数值表示


=


21

 

+


22

 

-


23

 

*


24

 

/


25

 

(


26

 

)


27

 

{


28

 

}


29

 

,


30

 

;


31

 

>


32

 

>=


33

 

<


34

 

<=


35

 

==


36

 

!=


37

 

#


0

 

(2)词法分析器功能及基本要求

处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码

token为存放的单词自身字符串

sum为数字的数值(用科学计数法输出)

(3)主要参考步骤

1:画出识别上述语言单词的状态转换图

2:用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)

3:预处理,去除注释、多余空格、Tab字符、回车换行符等

4:设计若干用例,上机测试并通过所设计实现的词法分析器

1. +++-123.456e-127*+45.99e+200++abc+-cnt++49

2. (+123.456+-456.789e-120)*m2+(a++456)*-c123

3. ++4+1.4

4. a+-149+49.7e+127+m123

5. x=a++1.27e+18

6. --20+-124.987e+127+-xyz

begin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+127

7. --20+-124. e+111-137++569.246e+(123+ivar);

x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)

(4)思考

数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。

二:C语言实现词法分析器

(1)算法及流程图

算法的基本思想是从输入缓冲区循环读取字符,根据扫描的第一个字符类型(必要时也可向前向后看)对照单词符号及种别表拼出相应的单词符号。

(2)代码示例

时间: 2024-12-21 11:45:18

自己动手实现简单编译器之(二)词法分析器和有穷自动机的相关文章

自己动手实现简单编译器之(一)形式语言理论

一·预备知识(编译概述) 翻译程序是指这样一个程序,它把一种语言(源语言)所写的程序(源程序)翻译成等价的另一种语言(目标语言)的程序(目标程序). 编译程序是一种翻译程序,它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序.其工作过程一般可划分为如下五个阶段: 1:词法分析 词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词( 也称单词符号, 简称符号 ). 注:词法规则就是单词符号的形成规则,它规定了哪样的字符串

简单编译LAMP

前期准备,需要安装开发工具包 安装方法:yum groupinstall "Development tools" 一.httpd 1.安装apr 软件包:apr-1.4.6.tar.bz2 [[email protected] httpd]# tar xf apr-1.4.6.tar.bz2 [[email protected] httpd]# cd apr-1.4.6 [[email protected] apr-1.4.6]# ./configure --prefix=/usr/l

Android反编译和二次打包实战

作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短.今天就来总结一下Android反编译和二次打包的一些知识.首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果. 本文首先介绍几种Android反编译工具的使用,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali文件实现修改apk逻辑功能的目的. And

简单编译安装apache2

引 入 CentOS系统的软件管理主要有三种方式,rpm,yum,以及直接源码管理,前面已经详细介绍了rpm以及yum的相关用法,作为运维人员,源码安装有时也是不可避免的,下面,我们就以Apache为例简单介绍一下编译安装. 一. 什么是编译安装 编译:将源代码变为机器可执行的代码文件. 安装:将可执行文件安装到操作系统里. 二. 为什么要编译安装 有些软件,并不能通过例如rpm这种包管理系统安装,这就需要下载源码编译安装. 编译安装可以灵活地定制软件,选择自己需要的,取消自己不需要的. 针对特

Android应用加固的简单实现方案(二)

个人博客 http://www.milovetingting.cn Android应用加固的简单实现方案(二) 前言 上一篇文章介绍了基于dex加固方案的两种具体实现.相对于手动加固,基于gradle实现的加固方案效率有了进一步提升.但是,还是需要在壳Module中增加util相关工具类的引用,为进一步减少代码侵入性,在前面方案的基础上,进一步完善插件的功能. 实现原理 为了避免在壳Module中引入脱壳相关的工具类,可以在aar生成后,利用ASM生成需要的class文件,然后修改aar中的cl

linux运维自动化之puppet简单应用(二)

上篇博客介绍了在单机环境下的puppet应用,这次我们基于C/S模式来介绍下puppet! 一.实验环境 服务器角色 IP地址 安装软件 主机名 服务器端 172.16.8.1 puppet-server www.gulong.com 客户机端 172.16.8.2 puppet node1.gulong.com 客户机端 172.16.8.3 puppet node2.gulong.com 三台主机时间同步: #ntpdate 172.16.0.1 三台主机可以相互解析: # vim /etc

LAMP的简单编译安装

[二进制安装MariaDB] 1.展开程序 #tar xf mariadb-5.5.32-linux-x86_64.tar.gz -C /usr/local/ 2.进入解压后的文件夹 # cd /usr/local/mariadb-5.5.32-linux-x86_64/ 3.创建数据存放目录 #mkdir -pv /mydata/data 4.创建安全登陆的用户和组 #groupadd -r mysql #useradd -g mysql -r mysql 5.改变数据目录的属主属组 #cho

Bind简单应用之二(正向解析主从服务器)

DNS主从服务器应用实验 实验环境    系统:Centos 6.3 X64 软件:Bind.x86_64 32:9.8.2-0.10.rc1.el6 主服务器: IP 10.0.0.101:netmask 255.255.255.0 :DNS 10.0.0.102:GW 10.0.0.1 从服务器: IP 10.0.0.102:netmask 255.255.255.0 :DNS 10.0.0.102:GW 10.0.0.1 1.分别在两台服务器上安装Bind软件 #yum install b

Win7 VS2015简单编译FFMPEG播放器FFPlay

Win平台简单编译FFPlay播放器,顺便纪念下雷霄骅,一年前刚学FFMPEG时还看过他的博客,昨晚再次搜FFMPEG文章时才知道人已经走了... 做成了视频放到B站 http://www.bilibili.com/video/av8644322/ C++版本也是可以编译的,只是要修改非常多的C语言转C++的强制类型转换,这个例子是C语言写的,改扩展名为cpp后,有不少cpp关键字的参数要修正,不过基本上花点时间就能解决,没什么难度. 现在主要问题是网上能找到的例子,包括FFPlay都是基于SD