码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-10-05 01:19:07      阅读:405      评论:0      收藏:0      [点我收藏+]

标签:编译原理   形式语言   文法分类   

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

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

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

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

形式语言理论(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型文法。 



本文出自 “珞辰的博客” 博客,谢绝转载!

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

标签:编译原理   形式语言   文法分类   

原文地址:http://luochen2015.blog.51cto.com/9772274/1858683

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!