文法和内容

编译原理笔记第二部分,内容参考:北航软院教师邵兵课堂课件及内容、张莉著《编译原理及编译程序构造》、国防工业出版社的《编译原理——学习指导与典型题解析》、AlvinZH的学习笔记以及个人理解

目前是包含了全部内容的版本,后续会推出精简版和复习知识点版

如有建议或错误错误欢迎在评论中指出或联系我:QQ:847590417

阅读目录

本章内容

2.1 形式语言基础

2.2 文法的非形式讨论

2.3 文法和语言的形式定义

2.4 语法树和二义性文法

2.5 句子的分析

2.6 有关文法的实用限制

2.7 文法的其他表示法

2.8 文法和语言分类

习题内知识

本章内容

重点:符号串、符号串集合的计算、文法、语言、递归、短语、句柄、语法树、文法的二义性、文法的使用限制、BNF表示文法、语法图、文法的分类。

2.1 形式语言基础

一、字母表和符号串

字母表:符号的非空有限集

符号:字母表中的元素

符号串:由符号拼接成的有穷序列

空符号串:没有任何符号的符号串

符号串的形式定义:

假设有一个字母表P:1.空符号串是P上的符号串;2.若x是P上的符号串,且a是字母表里的一个元素,则ax或xa(可以左,可以右,但只能一个不能同时加)是P上的符号串(一个符号也是符号串,a拼接ε);3.y是P上的符号串,当且仅当(iff)y是符合1.和2.的符号串。

二、符号串和符号串集合的运算

1.符号串相等:若x、y是集合上的两个符号串,则x=yiff组成x的每一个符号和组成y的每一个符号依次相等。

2.符号串的长度:x是符号串,x的长度|x|等于组成器的符号个数。(空符号串长度为0)

3.符号串的联接:若x、y是定义在P上的符号串,则x和y的联接xy也是P上的符号串,符号串xy不等于yx,而空字符串无论在左还是右联接到一个符号串上都是一样的。εx=xε

4.符号串的幂运算:假设x是符号串,那么其幂运算就是自身的拼接,0次幂等于一个空符号串,n次幂既是自身重复n次

5.符号串集合的乘积运算:假设A、B是符号串集合,则AB就等于一个A集合中的符号在前联接B集合中的符号在后:

6.符号串集合的幂运算:假设有一个符号串集合A,则A的零次幂是一个仅包含空符号串的集合,n次幂则是n个A拼接得到的结果。计算A的n次幂时可以用A拼接A的n-1次幂来计算。

7.符号串集合的闭包运算:设A是符号串集合,则有:

A的正闭包:

A的闭包:

闭包只是比正闭包多了一个空符号串。

如何用符号得到一个程序:

A是某语言的基本字符串:

B是该语言的单词集:

则有B属于A的闭包,因为是从A的所有结果中提取出来的

而该语言的一个句子,即一条语句,也是一个在B上的符号串

令C是该语言的句子集合,则C也属于B的闭包,一个程序也属于C

2.2 文法的非形式讨论

文法:对语言结构的定义与描述,从形式上用于描述和规定语言结构,也称为语法。

语法规则:通过建立一组规则,来描述句子的语法结构,一般规定用“::=”的符号代替“由...组成”,一些基本的语法结构如下:

利用规则推导句子:有了规则后便可按照一定的方式用他们来推导或产生句子,方法如下:从一个要识别的符号开始推导,即用相应规则的右部来替代规则的左部,从左向右推导,每次使用一条规则进行推导。

例子:

推导直到所有的非终结符号被终结符号代替为止。

这种推导称为最左推导,除了这种还有最右推导

观感上就没有最左推导好了。

从一个<句子>推导出一个完整的句子的推导可以写成:

根据上述的介绍可知,文法只是在形式上对句子结构的定义与描述,而未涉及语义问题,因此可能出现一些大花生吃花生这种神奇的句子。

语法树:用树形描述一个句子的语法结构:

2.3 文法和语言的形式定义

2.3.1 文法的定义

定义:文法G=(Vn,Vt,P,Z)(grammar)

Vn:非终结符号集(nonterminal vocabulary)

Vt:终结符号集(V=Vn∪Vt,称为文法的字汇表)(terminal)

P:产生式或规则的集合(principle)

Z开始符号(识别符号)Z∈Vn

规则:一个有序对(U,x),通常写为U::=x或U→x(::=就等于→),其中U的长度为1,x的长度大于等于0。U∈Vn,x属于V的闭包。

例如一个无符号整数的文法:

G[<无符号整数>]=(Vn,Vt,P,Z)

Vn={<无符号整数>,<数字串>,<数字>}(规则左侧出现的,可以继续拆分的符号集)

Vt={0,1,2,3,...9}(剩余的,不能再继续拆分的符号集)

P={<无符号整数>→<数字串>

<数字串>→<数字串><数字>

<数字串>→<数字>

<数字>→0

...

<数字>→9}(可拆分的符号集的变化规则)

Z=<无符号整数>(开始进行拆分的符号)

通常用尖括号把非终结符号括起来,以便和终结符号进行区分,其实非终结符号也不必有尖括号。

产生式(P内的元素)左边的符号会构成集合Vn,且Z∈Vn

当产生式有相同的左部时可以合在一起,用或符号|划分开

如上既是文法的BNF表示(巴克斯范式)

给定一个文法,实际只需给出一个产生式的集合,并指定最开始的识别符号即可(一般约定为第一条规则的左侧符号)

文法:

::=、|、<和>称为元符号(未扩展的元符号,在2.7节中会介绍扩展的元符号),由元符号构成的语言称为元语言,即可以用于描述其他语言的语言。

2.3.2 推导的形式定义

定义:直接推导:文法G:v=xUy,w=xuy(零步推导)

其中x、y∈V*(x、y是非终结符或者终结符或者空),U属于Vn(非终结符),u属于V*

若(U::=u)∈P,则v可根据文法G推导出w,v可推导出w,w直接归约到v(::=等于→)

若x=y=空符号串,有U::=u,则U可根据文法G推导出u或者简写为U可推导出u(G可以省略)

例:

定义:间接推导1:存在文法G,有U0,U1,...,Un属于V的正闭包

如果v=U0可以根据文法G中的两次或以上次推导出U1,然后根据G依次推导出到Un=w。(加号一定要有,是间接推导的象征)

则表示v可以根据文法G正推导出w:这个序列称为n次推导

例:

定义:间接推导2:存在文法G,有v,w属于V的正闭包

如果v可以根据文法G正推导出w,或者v::=w,即在v可以根据G正推导出w时或v由w组成时:(直接推导加上n次推导)

定义:规范推导:有xUy可推导出xuy,如果y属于Vt的闭包,则此推导是规范的,记为:(最右侧需要有不变的,且不变的符号串要么只包含终结符号,要么为空)。

每个句子都有一个规范推导,并非每个句型都有规范推导,可由规范推导导出的句型称为规范句型。

结合多种推导符号:

最右推导:若符号串中有两个以上的非终结符时先推导右边的(规范推导);最左即是先推导左边的。

2.3.3 语言的形式定义

定义:文法G[Z]

(1)句型:x是句型<=>Z可以闭包推导出x,且x属于V*(可以有非终结符,可以有终结符)

(2)句子:x是句子<=>Z可正闭包推导出x,且x属于Vt*(式语言的最小单位,是由终结符号所组成的符号串)

(3)语言:L(G[Z])={x|x∈Vt*,Z多步推导出x},语言由所有的句子组成。

已知文法可以通过推导求出语言

已知语言构造文法时没有形式化的方法,文法和语言是多对一

例:

定义:这种两种不同文法对应的语言相同的文法,他们是等价文法

编译时关心的其实就是根据符号串和文法,判断符号串是否符合文法对应语言的规定。

2.3.4 递归文法

无穷种可能

1.递归规则:规则右部有与左部相同的符号

对U::=xUy,如果x是空符号串,即U::=Uy,既是左递归,左部未变;y是空符号串时U::=xU,右递归;当xy都不空,U::=xUy称为自嵌入。

若文法中至少包含有一条递归规则,则称该文法是直接递归的。

间接递归:有如下规则时:U::=Vx,V::=Uy|x,U也会得到自己。

2.递归文法:文法G,存在U∈Vn

如果U可正推导出...U...,则G是递归文法(自嵌入递归),如果可以正推导出U...,则G是左递归文法,如果...U,是右递归文法。

左的缺点:不能用自顶向下的方法进行语法分析,会造成死循环;

递归文法的优点:可用有穷条规则,定义无穷语言。(无符号整数的文法就是右递归文法,用13条规则便可定义所有的无符号整数)

2.3.5 句型的短语、简单短语和句柄

定义:短语和简单短语

一个文法G[Z],w是该文法的句型:w=xuy(xy可为空,u不可为空)

如果文法可推导出xUy,(U是一个非终结符),U可多步推导出u,则u是句型w相对于U的短语(句型中能被其所在位置的非终结符推出的符号串)

(u属于V的正闭包,可以非终结符,可以终结符,不可以空,即使一个符号也可以是短语)

若U可直接推导出u,则u是句型w相对于U的简单短语(又称直接短语)。

定义:任一句型的最左简单短语称为该句型的句柄,句柄在自底向上的语法分析中很重要。

再次解释:

短语:将某句型转化为抽象语法树后,每一个有后继结点的结点的叶子结点组成的符号串,有意义的最小单位(可由识别符号推出的非终结符号推出);

简单短语:转化为抽象树后,子结点中不能再推出其他式子的结点的叶节点组成的符号串;

句柄:最左的简单短语。

短语、简单短语都是相对于句型而言的,一个矩形可能有多个短语、简单短语,但句柄只能有一个。

2.4 语法树和二义性文法

树:除了根节点以外,每个叶节点只能有一个直接前驱;n个直接后继

语法树:句子结构的图示表示法,是一种有向图,由结点和有向边组成。

一个结点就是一个符号,根节点是识别符号(最开始的),中间结点是非终结符,叶节点可以是终结符或非终结符,有向边便是这结点间的派生关系,一般有向边默认从根节点指向子节点。

子树:以语法树中的某个结点为根节点到底生成的子语法树。

子树和短语:某子树的末端结点按自左向右顺序为句型中的符号串,则该符号串为该句型的相对于该子树根的短语(因为是由这子树根推出的)。

句型的推导和语法树的生成

给定一个G[Z],句型w。可建立推导序列:Z可根据语法G推导出w时,便可建立语法树:以Z为树根结点,每步推导生成语法树的一枝。

注:文法能产生的句子,可以用不同的推导原则推导。语法树的生成规律不同,但最终生成的语法树形状相同,不是所有文法都有此性质。

语法树的推导有三种,一般推导:按深度进行推导;最左推导:首先推导最左侧的结点到终结符号;最右推导:先最右。

1.由推导构造语法树:

从识别符号开始,自右向左建立推导序列→由根结点开始,自上而下建立语法树。

2.由语法树构造推导

首先自下而上的修剪子树的末端节点,直到把整棵树剪掉,每剪一次对应一次规约:从句型开始,自左向右的逐步进行规约,便可建立推导序列,每一步都是归约当前句型的句柄。

定义:对句型中的句柄进行的规约称为规范规约(最左归约)。

定义:通过规范推导或规范规约所得到的句型称为规范句型

2.4.2 文法的二义性

定义:若对于一个文法的某一句子存在两颗不同的语法树,则该文法是二义性文法,否则是无二义性文法。

例:

他们的语法树也不同:

定义:若一个文法的某句子存在两个不同的规范推导,则该文法是二义性的。

除了以上的自顶向下判断文法二义性,还可以自底向上来看。例如在上例中:E+E*i是i+i*i通过两步规范规约得到的,但对于同一个句型E+E*i,他有两个不同的句柄(对应两棵不同的语法树:i和E+E)。因此语法的二义性意味着句型的句柄不唯一。

定义:若一个文法的某规范句型的句柄不唯一(有两个不用的规范归约),则该文法是二义性的。

编译时二义性会产生不确定性,而文法的二义性是不可判定的,所以无法在一个规定步数内判断一个文法是否有二义性。解决方法是提出限制条件,称为无二义性的充分条件,满足时便可判断某文法是无二义性的。

根据这个原则便可用两种方法解决:

1.根据条件修改编译算法:例如规定运算符的优先级来避免文法的二义性,不同优先级先看高的,同样优先级规定方向,这样在推导时就统一了。

2.根据条件直接修改文法:修改文法的规则后,直接限制归约的顺序。

2.5 句子的分析

当给定一个符号串S属于Vt的闭包,所要做的分析就是判断符号串S是否属于语法对应的语言。

2.6 有关文法的实用限制

在一个文法中,不能出现一些不应有的规则。

有害规则:例如有害规则:U::=U,这会引起二义性。

多余规则:

(1)推导文法的句子中,用不到的规则(该规则的左部非终结符不会出现在任何句型中)

(2)在推导句子的过程中,一旦使用了该规则,将推不出任何终结符号串的规则(该规则中含有推不出任何终结符号串的非终结符)。例如:当关于U的规则有且仅有U::=xUy,那就是多余的,因为无法推出终结符号串。

压缩文法:文法中没有有害规则或多余规则。

检查是否存在多余规则:需要检查文法中每一条规则左部的每个非终结符号U是否满足下述两个条件:

1.对所有的识别符号之外的非终结符号,这个非终结符号必须出现在某个句型中(右侧)

2.对所有的非终结符号,他必须能推导出终结符号串(终结符号组成的)

2.7 文法的其他表示法

1.扩充的BNF表示(Backus Normal Form)

BNF的元符号:<,>,::=,|

扩充的:<,>,::=,|,{,},[,],(,)

{}:右侧上m,下n,其中包含一个t,表示这个符号串t可以重复n到m次,mn都可省略,都省略后表示重复0到任意多次。内部也可以用|表示或

[]:表示内部的符号串可有可无,等于花括号包裹着符号串m是1,n是0

():提取因子的符号,例如xy|xm|xn,可以写成x(y|m|n)

2.语法图(图形化)

2.8 文法和语言分类

形式语言:用文法和自动机所描述的没有语义的语言

语言定义:

文法定义:所有文法都可定义为一个四元组,即Vn,Vt,P,Z。

文法和语言分类:0型、1型、2型、3型,他们的去呗在于对产生式施加不同的限制。

0型:

规则P:u::=v,u属于V+需要有非终结符,v属于V*

L0,被称为短语结构文法,左部和右部都是符号串,左侧是至少包含一个Vn的符号串,右部为符号串(可为空),可以用图灵机接受。

1型:

规则P:xUy::=xuy,其中U属于Vn,x、y、u都属于V*

L1,这种语法规则被称为上下文敏感或上下文有关,也即只有在x、y这样的上下文中才能把U改写为u,可由一种线性界限的图灵自动机接受。

2型:

规则P:U::=u,其中U属于Vn,u属于V*

L2,称为上下文无关文法,即把U改写为u时不必考虑上下文,和BNF表示等价,可以由下推自动机接受。

3型:

规则P:U::=T或wT;U、w属于Vn,T是Vt。

L3,称为正则文法、正则语言、正则集合,注意左右线性不能同时出现,可以由有穷自动机接受。

根据描述:L3属于L2属于L1属于L0,范围更大的文法可以产生子文法,;例如2型文法可以产生L2型文法,L3型文法,不能产生L1型文法。

四种文法类型的关系及判断方法:

主要区别在于规定产生式的左边和右边的字符的组成规则不同。明确四种文法从0型到3型,其规则和约定越来越多,限制条件也越来越多,所以判断时应该先从最复杂的3型开始。

3型:(多的限制:右边最多两个字符,且只能有一种线性)

左边只有一个非终结符

右边最多有两个字符,两个时左非终结右终结,一个时必须终结(左非终结右终结是左线性的,左终结右非终结是右线性)

左右线性不能同时出现。

2型:(多的限制:左边需要只有一个非终结符)

左边只有一个非终结符

右边有若干个终结符和非终结符

1型:(多的限制:左边需要有非终结符)

左边至少需要含有一个非终结符

右边有若干个终结符和非终结符

左边推导右边时变化的部分左右两边内容不能变,变化后不能为空

0型:

左侧的符号串至少有一个非终结符

右侧随意

即只要能描述出来,就属于0型文法

习题内知识

语言的语法是用来形成一个合法程序的一组规则,这些规则的一部分是词法规则,另一部分是语法规则(又称产生规则)。

名字和标识符:名字都是由标识符组成的,标识符在不同语言中的规范不一样。他们在形式上难以区分,标识符是一个没有意义的字符串,名字则是有明确的意义和属性,且名字可看成是代表一个抽象的存储单元。

一个语言可由多个文法推导出

而一个文法仅可推导出一个语言。语言对文法:一对多

对于不同类型的文法,他们的规则是对所有的产生式起作用的,所以只需要找出一个不符合规则的,那么他就不属于这个类型的文法

当问一个文法的语言是什么时,如果是人类可以理解的,例如无符号整数,一个0-5数字组成的字符串。如果无法如此表述,则需要用一个集合来表示,集合的元素就是根据文法的规则得出的所有句子。

非终结符号的<>只是为了区分所用,不是必要加的,可以用其他形式来区分,例如非终结符用大写字母,终结符号用小写。

一些比较容易出现的题型有:根据语言得出对应的文法,根据文法描述出语言,判断文法类型,后续更新后会给出一些技巧的展示

转载于:https://www.cnblogs.com/doUlikewyx/p/11524708.html

#编译原理# 文法和内容(二)相关推荐

  1. 【编译原理】中间代码优化(二) 局部优化

    预备知识简述. 对于一个给定的程序,我们可以把它划分为一系列的基本块.在各个基本块范围内,分别进行优化.局限于基本块范围内的优化称为基本块内的优化,或者称为局部优化. 所谓基本块,是指程序中一个顺序执 ...

  2. 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言

    高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...

  3. 编译原理——文法的基本概念

    文法的概念 每一种自然语言或者是编程语言都需要文法来描述,文法相当于语言学的语义分析,即分析每一句话所表示的含义,编译器需要利用文法来完成其语法分析和语义分析. 在目前编程语言领域,上下文无关文法作为 ...

  4. 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA

    题目 文法: S–>Aa | bAc | dc | bda A–>d 通过构造基于LR(0).LR(1)项目的识别活前缀的DFA,判断上面文法 是否是SLR(1)文法?? 是否是LALR( ...

  5. 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。

    题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...

  6. 编译原理-正则文法与正则表达式的相互转化

    正则文法与正则表达式的相互转化 前言 一.正则文法 1.定义 2.例子 二.正则表达式 1.定义 2.例子 三.转换规则 1.正则文法转换为正则表达式 2.正则表达式转换为正则文法 四.转换例子 1. ...

  7. 编译原理实验c语言cfg文法,编译原理

    地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...

  8. 《编译原理》课程教学大纲

    <编译原理>课程教学大纲 课程编号:773033 课程名称(中/英文):编译原理 / Compiler Principle 课程类型: 模块课 总 学 时:5学时/周 讲课学时:4学时/周 ...

  9. C++生产流水线的自动设计器(编译原理NFA-DFA)

    C++生产流水线的自动设计器(编译原理NFA-DFA) 实验二:生产流水线的自动设计器 一.实验内容: 输入一个表示要准备进行设计的生产流水线对应的正则表达式,最终完成整个生成流水线的自动设计. 二. ...

最新文章

  1. 以下可以采用python语言保留字的是-以下哪个选项不是Python语言的保留字?_学小易找答案...
  2. Git pull[push] 不用每次输入用户名和密码
  3. ArrayList练习——存储随机、存储自定义、按指定格式输出、筛选集合
  4. java学习笔记8--接口总结
  5. 恢复Reflector反编译后资源文件的办法
  6. ASP.NET Core 2调用Azure云上的PowerBI报表展示
  7. 聊聊AspectCore动态代理中的拦截器(一)
  8. java ee开发环境_设置Java EE 6开发环境
  9. 微信小程序一笔记账开发进度五
  10. UVA10258 ZOJ1837 Contest Scoreboard【结构排序】
  11. Yaml spring boot 二维数组写法
  12. iOS安装CocoaPods详细过程
  13. Java打印菱形(一)
  14. phpstudy2020安装及简单使用教程
  15. Delphi FireDAC SQLite “database is locked“ 解决办法
  16. IRPT_TAS简介
  17. Java 对象 的 比较 - 细节狂魔
  18. 微星笔记本安装Ubuntu桌面版
  19. 转载《美团容器平台架构及容器技术实践》
  20. docker add new port

热门文章

  1. 国产化之 .NET Core 操作达梦数据库DM8的两种方式
  2. 明明导包成功,却仍报程序包不存在的问题
  3. 实变函数从头学--1
  4. apache如何配置https
  5. 第一次C程序设计上机报告
  6. JS实现读取Excel表数据(借鉴js-xlsx )
  7. 源主机经过交换机或者路由到目的主机的过程详解
  8. ZLIB压缩数据格式规范v3.3
  9. Relation Classification
  10. [pytest源码3]-pluggy代码结构与核心设计