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

一·预备知识(编译概述)

翻译程序是指这样一个程序,它把一种语言(源语言)所写的程序(源程序)翻译成等价的另一种语言(目标语言)的程序(目标程序)。

编译程序是一种翻译程序,它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序。其工作过程一般可划分为如下五个阶段:

1:词法分析

词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词( 也称单词符号, 简称符号 )。

注:词法规则就是单词符号的形成规则,它规定了哪样的字符串构成一个单词符号。

2:语法分析

语法分析的任务是在词法分析的基础上, 根据语言的语法规则从单词符号串中识别出各种语法单位 ( 如表达式、说明、语句等 ) ,并进行语法检查,即检查各种语法单位在语法结构上的正确性。

注:语言的语法规则规定了如何从单词符号形成语法单位,语法规则是语法单位的形成规则。

3:语义分析和中间代码生成

语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式 (比源语言更接近于目标语言的一种中间代码或直接用目标语言 ) 来描述这种语义。

4:代码优化

代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效即省时间和空间的目标代码。优化主要包括局部优化和循环优化等,例如上述四元式经局部优化后得

5:目标代码生成

目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

二:文法和语言(形式语言理论)

语法是对语言结构的定义。 语义是描述了语言的含义 。 语用则是从使用的角度去描述语言。 对每个具体语言,都有语法和语义两个方面,形式语言是指不考虑语言的具体意义,即不考虑语义。

1. 字母表 :

元素的非空有穷集合 ,例如,∑={ a, b, c }

2. 符号(字符):

字母表中的元素称为符号或称为字符。

3. 符号串(字):

符号的有穷序列称为符号串,不包含任何符号的符号串, 称为空符号串,用ε表示。

4:形式语言:

形式语言是某个字母表上按某种规则构成的所有符号串(序列)的集合。反之,任何一个字母表上符号串的集合均可定义为一个形式语言。

5:规则(产生式):

规则是一个符号与一个符号串的有序对(A,β),通常写作:A→β(或A∷= β) 。规则的作用是告诉我们如何用规则中的符号生成语言中的序列。规则中出现的符号分为两类,一类是终结符号,另一类是非终结符号。

非终结符号是出现在规则左部能派生出符号或符号串的那些符号,即每个非终结符号表示一定符号串的集合,用大写字母表示或用尖括号把非终结符号括起来。例如,上例中的A。

终结符号是不属于非终结符号的那些符号, 它是组成语言的基本符号,是一个语言的不可再分的基本符号,通常用小写字母表示。

6:文法:

规则的非空有穷集合,通常表示成四元组G={VN,VT, P, S }

VN是规则中非终结符号的集合,VT是规则中终结符号的集合,P 是文法规则的集合,S是特别的非终结符,称为文法的开始符号,它至少要在一条规则中作为左部出现。由它开始,识别出我们所定义的语言

为了书写方便,对于若干个左部相同的规则,将它们缩写为:A→a1 | a2 | … | an,其中每个ai有时也称为是A的一个候选式

例1 设字母表∑={a, b},试设计一个文法,描述语言 L= { a2n, b2n | n≥1 }

定义语言L的文法G[S]=( VN,VT,P,S )

其中非终结符集合VN={A, B, D},终结符集合VT={a, b},文法开始符号S =A

文法规则集合:P={ A→aa|aaB|bb|bbD

B→aa|aab

D→bb | bbD}

描述一个语言的文法并不唯一,如上例的其他答案

P‘ : {A→B | D

B→aa | aBa

D→bb | bDb}

7.:句型和句子

时间: 2024-10-13 16:21:29

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

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

一:实验指导书 对下述单词表定义的语言设计编制一个词法分析器.单词符号及种别表和词法分析器功能及基本要求如下: (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   -

编译原理之形式语言文法分类

高级程序设计语言的三个基本因素: 语法:描述语言成分的构成规则(包括词法规则和语法规则) 语义:描述语法成分的含义 语用:描述语法成分的使用方法 形式语言理论(formal language theory)是用数学方法研究自然语言(如英语)和人工语言(如程序设计语言)的产生方式.一般性质和规则的理论.形式语言是模拟这些语言的一类数学语言,它采用数学符号,按照严格的语法规则构成.从广义上说,形式语言是符号取自某个字母表的字符串的集合.如同自然语言具有语法规则一样,形式语言也是由形式文法生成的.一个

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

Win7 VS2015简单编译FFMPEG播放器FFPlay

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

简单编译安装apache2

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

简单编译bind

编译之前安装开发环境:Development tools , Server Platform Development , gcc等. 创建named用户及属组 # groupadd -g 53 -r named # useradd -g named -r -u 53 named 2.从isc.org上下载bind源代码 3.编译安装 # tar xf bind-9.9.5.tar.gz # cd bind-9.9.5 # ./configure --prefix=/usr/local/bind9

简单编译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

自己动手写编译器之序

<自己动手写编译器.链接器> 因为工作的关系,我经常和各企业的技术负责人交流.话题谈着谈着常常会转到他们目前共同的难题--技术人员招聘.这时不少人都会感慨,中国能做系统软件开发的技术人员太少,这方面的人太难找了.随着中国企业的发展,做系统和平台的需求不断增加,这种供需矛盾将越来越明显. 究其原因,很容易想到的是我们的高校教育.课程设置.美国顶尖大学计算机系基础课程教学里都非常重视项目实践,操作系统课往往要真的开发一个像模像样的操作系统原型,编译器课也真的要自己设计并实现一门有创新性的小语言--

自己动手写编译器之TINY编译器词法分析

TINY是<编译原理与实践>一书中介绍的教学编程语言,该语言缺少真正程序设计语言的主要特征,但足以例证编译器的主要特征了.本文将介绍该编译器的实现过程,完整的实现代码loucomp_linux中,供编译原理初学者参考. 小试牛刀: 下载源码后,进入loucomp_linux, 在命令行输入 $make 便生成tiny程序,然后输入 $tiny sample.tny tiny 将sample.tny中的TINY源码生成tm指令.tm指令是TM虚拟机的汇编代码,TM虚拟机的源码在tm.c中,输入如