编译原理读书笔记(2/12)

第2章 文法和语言

语言是一个记号系统,如自然语言、程序设计语言,完整的语言包含语法和语义两个方面。语法表明了小的记号组成大的记号需遵守的规则,语义表示记号所要表达含义。阐明语法的一个工具是文法,也即文法是语法的描述工具,语法通过文法进行形式化描述。

2.1 文法的直观概念

对于包含无穷句子的语言来说,无法通过枚举的方式理出全部的句子,但是可以通过定义组成句子的规则和有穷的符号(如自然语言中的单词),来定义无穷的句子。其中定义句子结构的规则就是文法。文法就是有穷的集合刻画无穷集合的一个工具。

2.2 符号和符号串

语言是由表述完整意思的句子组成,句子由符号组成。为讨论语言的形式化定义,首先讨论符号和符号串的有关概念。

  1. 字母表
    元素的非空有穷集合,字母表中的元素称为符号,因此字母表也称为符号集,不同的语言有不同的符号集,如汉语中的汉字、数字及标点等。C语言的字母表由字母、数字、若干专用符号及char、struct、if、do之类的保留字组成。
  2. 符号串
    由字母表中的符号组成的有穷序列称为符号串。符号串的中字母的顺序是重要的。符号串中符号的个数称为长度。不包含任何符号的符号串为空串,记作 ϵ \epsilon ϵ,其长度 ∣ ϵ ∣ = 0 |\epsilon|=0 ϵ=0
  3. 符号串的一些运算
    1. 符号串的连接
    2. 符号串的方幂
    3. 符号串的集合
  4. 集合的闭包和正闭包
    Σ \Sigma Σ为字母表, Σ ∗ \Sigma^* Σ表示 Σ \Sigma Σ上的所有有长串的集合,称为 Σ \Sigma Σ的闭包,也成为克林闭包。 Σ + = Σ 1 ∪ Σ 2 . . . ∪ Σ n . . . \Sigma^+=\Sigma^1 \cup\Sigma^2...\cup\Sigma^n... Σ+=Σ1Σ2...Σn...称为正闭包。

2.3 文法与语言的形式定义

规则,也被称为重写规则、产生式或生成式,如A->a读作A定义为a,是关于A的规则(产生式)。

文法G定义为四元组 ( V N , V T , P , S ) (V_N,V_T,P,S) (VN,VT,P,S),其中 V N V_N VN是非终结符, V T V_T VT是终结符号集,P是产生式集,S是开始符号。

一般,文法G的四元组,不用显式给出,而只需要将产生式写出。

推导的定义,直接推导与直接规约。推导与规约。如果对于文法G,符号串x可以由开始符号S推导出来,则称x是文法G[S]的句型,如果x仅由终结符号组成,则x是G[S]的句子。文法所描述的语言是该文法一切句子的集合。如果两个文法所描述的语言相同,则称两个文法是等价的。

2.4 文法的类型

通过对产生式施加不同的限制,乔姆斯基将文法分成4种类型:0型、1型、2型和3型。

如果文法G的每个产生式 α → β \alpha\rightarrow\beta αβ是这样的一种结构: α \alpha α种至少含有一个非终结符,其余无限制,则G是一个0型文法。0型文法是无限制文法。

如果文法G种每一个产生式 α → β \alpha\rightarrow\beta αβ满足 ∣ α ∣ ≤ ∣ β ∣ |\alpha|\leq|\beta| αβ( S → ϵ S\rightarrow\epsilon Sϵ除外)为1型文法。即要求每条产生式的左端长度不大于右端长度。1型文法又称为上下文有关的。

如果文法G中每一个产生式 α → β \alpha\rightarrow\beta αβ满足: α 是 一 个 非 终 结 符 \alpha是一个非终结符 α,则是2型或上下文无关的,即在选择替换非终结符的产生式时,与非终结符的上下文无关。大部分编程语言是上下文无关的。

如果文法G中每一个产生式的形式都是 A → α A\rightarrow\alpha AαB或者 A → α A\rightarrow\alpha Aα,其中A和B是非终结符, α ∈ \alpha\in α V T ∗ V_T* VT,则G是3型文法或正规文法。3型文法在2型文法的基础上定义产生式的右端非终结符在终结符的右边。

2.5 上下文无关文法及其语法树

本书的后面章节,如无特别说明,“文法”均指上下文无关文法。

语法树或推导树,是描述上下文无关文法句型推导的直观工具。对于文法G的任何句型,都能构造与之关联的语法树,这棵树满足下列4个条件:

  1. 每个结点都有一个标记,此标记是V的一个符合
  2. 根的标记是S
  3. 若一个节点n至少有一个它自己除外的子孙,并且有标记A,则A肯定在 V N V_N VN
  4. 由树推导产生式

最左推导与最右推导。在推导的任何一步 α → β \alpha\rightarrow\beta αβ,都是对 α \alpha α的中最左(最右)非终结符进行替换,则称这种推导为最左(最右)推导。在形式语言中,最右推导常被称为规范推导。由规范推导所得的句型称为右句型规范句型

如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的,或者说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。文法的二义性不等于语言的二义性,对于程序设计而言,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。

形式语言理论已经证明,不存在一个算法能够证明文法是否是为二义的。所能做的为无二义性寻找一组充分条件,在满足充分条件下保证文法的无二义性。

2.6 句型的分析

句型分析是一个识别输入符号串是否为语法上正确程序的过程。在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序,分析算法又称为识别算法。

本书介绍的识别算法都称为从左到右的分析算法,即总是从左到右地识别输入符号串。这种分析又分成两大类:自上而下地和自下而上的,一种是推导,一种是规约。

自上而下分析方法的主要问题:回溯问题,当要被替换的最左非终结符有多个规则供选择时,选择错误时必须退回去,再试另外的选择。

自下而上的分析方法中主要问题是:如何确定可规约串,规范规约中,可规约串被称为句柄。

短语、直接短语(简单短语)和句柄的概念。短语是针对句型而言的,且针对的是非终结符被替换后的句型,直接短语是针对直接推导式而言,句柄的概念只适用于右句型。

2.7 有关文法实用中的一些说明

一 文法的实用限制

  1. 限制文法中不得含有有害规则和多余规则
    1. 有害规则:形如u->u的产生式,没有必要,会引起文法二义性
    2. 多余规则:推导到不可达或不可终止的非终结符。

二 上下文无关文法中的 ϵ \epsilon ϵ规则

上下文无关文法中有没有 ϵ \epsilon ϵ规则不是本质问题,只是有关文法的讨论和证明变得复杂。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理实验三是通过对PL/0语言进行语义分析的实践。PL/0是一种简单的过程式语言,语法规则相对简单,适合用来学习编译原理中的语义分析。 语义分析是编译过程中的一个重要环节,其主要任务是对源程序中的语言结构进行分析,生成相应的中间代码,为后续的优化和代码生成做准备。在PL/0语义分析的实验中,我们需要实现对PL/0语言的语义规则进行分析,包括语法树的构建、类型检查和作用域分析等内容。 首先,需要构建语法树,将源程序转换为一棵树状结构,便于后续的语义分析和中间代码生成。在构建语法树的过程中,需要对语法规则进行递归下降分析,识别各种语法结构,并生成对应的语法树节点。 其次,需要进行类型检查,对源程序中的标识符和表达式进行类型推导,保证类型的一致性和正确性。这包括对变量的声明和使用、运算符的操作数类型等方面的检查。 最后,需要进行作用域分析,确定各个变量和过程的作用域,并进行变量的定义和引用的合法性检查。在PL/0语义分析实验中,我们需要实现对静态作用域的支持,确保程序在运行过程中能够正确地获取和修改变量的值。 通过实验三的学习和实践,我们能够更深入地理解编译原理中的语义分析过程,掌握PL/0语言的语义规则和处理方法,为之后的编译器设计和实现打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值