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

高级程序设计语言的三个基本因素:

语法:描述语言成分的构成规则(包括词法规则和语法规则)

语义:描述语法成分的含义

语用:描述语法成分的使用方法

形式语言理论(formal language theory)是用数学方法研究自然语言(如英语)和人工语言(如程序设计语言)的产生方式、一般性质和规则的理论。形式语言是模拟这些语言的一类数学语言,它采用数学符号,按照严格的语法规则构成。从广义上说,形式语言是符号取自某个字母表的字符串的集合。如同自然语言具有语法规则一样,形式语言也是由形式文法生成的。一个形式文法是一个有穷变元集合,这些变元也称为非终结符或语法范畴。每个变元都可以用来定义语言,定义方式可以是递归的,即通过一些称为终结符的原始符号,加上变元自身,递归地加以定义。和变元有关的规则称为产生式,产生式决定了语言是如何构造出来的。一个典型的产生式表示:给定变元所代表的语言包含这样一些字符串,它们是通过连结运算,将另外某些变元语言中的字符串和若干终结符连结起来而得到的。

PS:形式语言理论是编译原理的重要理论基础,形式语言理论中主要讨论了语言和文法的数学机制以及语言和文法的分类。文法是形式语言中一个十分重要的基本概念。

1,字母表与符号:字母表是元素的非空又穷集合。例如,由26个英文字母组成的集合是一个字母表。字母表记为∑。字母表中的元素称为符号。例如,26个英文字母中的元素a,b,c等等都称为符号。

2,符号串及其运算

a,符号串:符号的又穷序列称为符号串。有字母表中的任意符号组成的序列都是符号串。什么符号也不包含的符号串称为空符号串,以希腊字母 ε 表示。

b,符号串的长度:符号串所包含符号的个数,称为符号串的长度。设x是一符号串,它的长度记为|x|,例如,x = string, |x| = 6。特别有| ε | = 0,即空符号串的长度等于0。

c,符号串的连接。设x,y是两个符号串,则xy 称为x 与 y 的连接。特别有εa = aε = a,其中,a是任意符号串。

d,符号串集合的乘积。设A,B是两个符号串集合,AB表示A与B的乘积,则定义AB={ xy | x∈A,y∈B}。特别有 {ε}A = A{ε} = A , φA = Aφ = φ,其中,φ为空集。

e,ε  φ,即空符号串并不属于空集。

f,符号串的方幂。同一符号串的连接可写成方幂的形式。设x是一符号串,则定义                                                                     x^0 = ε

x^1 = x

x^2 = xx

x^3 = x^2x=xxx

g,符号串集合的方幂。同一符号串集合的乘积也可以写成方幂的形式。设符号串集合 A,则定义

A^0 = {ε}

A^1 = A

A^2 = AA

A^3 = A^2A=AAA

h,符号串集合的正闭包。设符号串集合A的正闭包记为A+,则有 A+ = A1 ∪ A2 ∪ A3 ... An , 即A+为集合A上所有符号串的集合。

i,符号串集合的自反闭包,设符号串集合A的自反闭包记为A* ,则有,A* = {ε} ∪ A+ = A+ ∪ {ε} 。对于集合A来说A的正闭包和A的星闭包的区别在于是否包含 ε (空符号串),包含空符号串的是星闭包,不包含的是正闭包。

3,文法

文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法是定义描述语言的语法结构的一组形式规则,一个程序语言的文法之目的就是用适当条数的语法规则把该程序语言的全部成分描述出来。文法可定义为一个四元组,文法G = (Vn,Vt,P,S)。其中,Vn 是一个非空有穷的非终结符号集,Vt 是一个终结符号集,P是一个产生式集合,S∈Vn 是文法的识别符(也称做开始符号)。从文法的开始符号出发反复使用其中的产生式对非终结符进行替换和展开推导出语言中的各种句子。在定义文法之前,需要先定义产生式。

Vn:非空有穷的非终结符号集。在英文表示中所有的大写字母都是非终结符号是可分解的,小写字母都是终结符号是不可分解的。在中文表示中所有的带 “<> ”是非终结符号是可分解的,不带 "<>" 的是终结符号是不可分解的。

Vt:非空有穷的终结符号集。在英文表示中所有的大写字母都是非终结符号是可分解的,小写字母都是终结符号是不可分解的。在中文表示中所有的带 “<> ”是非终结符号是可分解的,不带 "<>" 的是终结符号是不可分解的。

P:非空有穷的产生式集合。产生式又称重写规则,它意味着能将一个符号串用另一个符号串替换,可以用产生式的右部符号串替换左部的符号串。产生式可以通过 “::=”或  ”→“ 来定义(用来定义语法结果),即 α→β 且 V = Vn ∪ Vt , Vn ∩ Vt = φ , α ∈ V+ , β∈ V* 。

S:称作识别符号或开始符号的一个非终结符,它至少要在一条产生式中作为左部出现。

4,文法的分类(文法分为0 型,1 型 ,2 型,3 型四种类型)

1,0 型文法(短语文法):0 型文法所有产生式的左部 α 和右部 β 都是符号串,对它们没作任何限制。即产生式的左部至少有一个非终结符右边随意。若对0 型文法的产生式作某些限制,则可以给出其他三种类型的文法。

2,1 型文法(上下文有关文法):1型文法所有产生式左部可以含有一个、两个或两个以上的字符,但其中必须至少有一个非终结符。产生式右部的符号串的长度必须大于等于左边符号串的长度。对于产生式 “S→ε”是1  型文法中的一个特例。

3,2 型文法(上下文无关文法 | 左线性文法):2 型文法的所有产生式左部是单个非终结符,右部是由终结符和非终结符组成的符号串。

4,3 型文法(右线性文法 | 正规文法):3 型文法所有的产生式右部是单个终结符或单一终结符后跟着单一非终结符。产生式右部符号串长度小于等于2。

for example:

文法G=({ A,B,T,S },{ x,y,z},P,S)其中,P = { S→xTB|xB,T→xTA|xA,B→yz,Ay→yA,Az→yzz}。

解释:我们判断文法G是什么类型文法时可以从最复杂的3型进行判断,依次向下判断,如果不符合3型的,那再看是不是2型的,不是2型的,再看是不是1型的。对于文法G来说产生式集合P中有两条产生式左部不是单个非终结符(Ay→yA,Az→yzz),所以文法G不是3 型文法也不是2 型文法( 2 型文法和3 型文法都要求P中的每条产生式左部必须为单个非终结符)。再看是不是1 型文法,文法G中P的每条产生式都满足产生式左部由1个或2个字符构成并且必须含有一个非终结符,每条产生式的右部符号串的长度都大于等于左部符号串的长度。即文法G是1 型文法。

图示四种文法之间的关系:

PS:4个文法类型的定义是逐渐增加限制的。因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。

时间: 2024-11-03 21:56:52

编译原理之形式语言文法分类的相关文章

北航编译原理总结 C文法

定位:传说中北航计算机学院最头疼课程其实也没有辣么难,一点点的完成,并不会出现传说中的刷夜~ 0.pascal-s和PL/0编译器源码有必要结合编译器基础知识认真读一下,当然不必细枝末节,重点是看一下人家的编译器中所谓的"词法分析""语法分析"等阶段以及符号表的建立需要什么量,每个量分别代表什么,以及运行栈出现在什么时候,如何设计(可以和后期优化结合起来~)等. 1.我的文法为 扩充c0文法-高,具体文法如下: <加法运算符> ::= +|- <乘

编译原理之理解文法和语言

简介 一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面.所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序.目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具.语法只是定义什么样的符号序列是合法的,与这些符号的含义毫无关系,比如对于一个Pascal程序来说,一个上下文无关文法可以定义符号串A:=B+C是一个合乎语法的赋值语句,而A:=B+就不是.但是,如果B是实型的,而C是布尔型的,或者B.C中任何一个变量没有

编译原理LL(1)文法

从左向右扫描输入,然后产生最左推导(就是每次都把最左边的非终结字符用产生式代替). (一)First集合 比如有产生式 A-> + T | - P , 当我们读到串为 +开头的时候,我们可以很直接地判断选择 A-> + T 这个生成式:串为- 开头的时候,选择 A-> - P 这个生成式.但如果文法是类似于A →T | P 这样的都以非终结字符开头的呢?一眼就很难判断的,我们就需要知道,T 是怎么展开的,如果 T -> a |b ,P->c|d , 那当串以a或b开头的时候,

编译原理——算符优先分析文法(附源代码)

算符优先分析文法 一.写在前面 算符优先分析文法是一种工具,在编译的过程中,隶属于语法分析环节,却又与中间代码的生成息息相关,编译可以分为五个阶段:词法分析.语法分析.语义分析(中间代码的生成).代码优化.目标代码生成.语法分析是指:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语.子句.句子.程序段.程序),并确定整个输入串是否构成语法上正确的程序.也就是说语法分析是检验输入串的语法是否正确,注意这里的语法正确,只是简单地符合自己定义的规范,而不能检测出运行时错误,比如"X/0&

编译原理知识汇总

转自:https://www.jianshu.com/p/eb63d31ad638 编译原理 第一章 引言 1.从面向机器的语言到面向人类的语言 汇编指令:用符号表示的指令被称为汇编指令 汇编语言:汇编指令的集合称为汇编语言 2.语言之间的翻译 转换(也被称为预处理):高级语言之间的翻译,如FORTRAN到ADA的转换 编译:高级语言可以直接翻译成机器语言,也可以翻译成汇编语言,这两个翻译过程称为编译 汇编:从汇编语言到机器语言的翻译被称为汇编 交叉汇编:将一个汇编语言程序汇编成为可在另一机器上

软考之 编译原理

看完书后做了一套真题,都是眼泪呀,经过对试题的分析,发现弱点是编译原理和组成原理部分;因为这两块本来就是薄弱地带,再加上看书之后没有认真地总结过,就开始了真题,难免在做题时遇到困难,下面针对编译原理做一下总结,从一张思维导图开始: 从导图中可以看出,程序语言的部分都不是难点,分类和基本成分都是平时接触的,唯一需要去理解的就是可能平时不太去关注的,低级语言.高级语言.编译程序.解释程序的特点. 把中重点放在语言处理程序的部分,其中分为三部分: 1.汇编程序 其中需要明白的就是指令语句,伪指令语句和

软考之路(五)---编译原理 概念篇

从组成原理到编译原理,都是相互联系的,学习的知识都是在层层推进,顺利成章的,整个软考的所有的知识都可以从计算机的发展(组成原理)--->软件的开发(软件工程)--->软件的算法设计(数据结构)-->高级语言写的系统--->在计算机上识别(编译原理)--->各个系统的背后数据的支持--->(数据库)---->---网络知识的应用---->网络基础--,可以把整个所有的软考的课本给串起来,这些都是构成现在丰富世界的必不可少的条件. 当然由于机器语言由0.1组成,

如何看待编译原理

1.随着我进入到大二的学习中我认识到一门叫编译原理的课程,一开始我对这一门课程不是十分的了解,编译原理是什么?所以我看了下书本的前言解释和网上的有关资料,给出的结果是编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提

编译原理学习基本概念汇总

对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做--编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识.但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺.各位ITer如果想检验自己的智商的话,大可以去学习编译原理,你会收获很多的.现在我把大学时整理的编译原理最基本的概念分享出来. 第一章-绪论 1. 翻译,是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻