【编译原理笔记02】计算机如何表示语言及其文法,字母表(及其运算)、串、推导和归约、句型和句子、文法分析树
本次笔记内容:
2-1 词法语法分析基本概念
2-2 文法定义
2-3 语言的定义
2-4 文法的分类
2-5 CFG的分析树
文章目录
概述:计算机如何表示语言及其文法
编译器对高级程序设计语言进行词法、语法等分析,在计算机中,如何表示语言及其文法?
字母表(Alphabet)
字母表是一个有穷符号集合,符号可以是字母、数字、标点符号等等。
字母表例如:
- 二进制字母表:{0,1};
- ASCII字符表;
- Unicode字符集。
字母表上的运算
字母表的乘积(product)
如上图,按照我的理解,这是一种笛卡尔积(数据库中学过)。
字母表的n次幂(power)
如上图,字母表的n次幂,就是长度为n的符号串构成的集合。这里,n可以等于0,即空串()。
字母表的正闭包(positive closure)
如上图,正闭包是各个整数次幂的并集。
字母表的克林闭包(Kleene closure)
如上图,字母表的克林闭包是正闭包加空串。
串(String)
如上图,串是字母表中符号的一个有穷序列。长度可以为0。
串上的运算
连接(concatenation)
对于串x和y,连接x和y就是把y放在x后,即xy。
如上图,空串具有连接的特殊性质,称为连接的单位元(identity)。同时注意前缀后缀的定义。
幂
如果把连接看做乘积,则提出幂运算。
如上图,要注意s的0次幂即空串。
文法的定义
自然语言例子
如上图,句子的构成是层层递进的关系。
文法的形式化定义
,其中:
是终结符集合,终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token,例如
是非终结符集合,非终结符(nonterminal)用来表示语法成分的符号,有时也称为“语法变量”,例如
- 是文法符号集,因为二者统称为文法符合。
是产生式集合,产生式(production)描述了将终结符和非终结符组合成串的方法。产生式的一般形式为,读作定义为。
- ,且中至少包含中的一个元素:称为产生式的头部(head)或左部(left side)。
- ,称为产生式的体(body)或右部(right side)。
产生式集合的例子如上图。
是开始符号,,开始符号(start symbol)表示的是该文法中最大的语法成分。
例如,。
如上图,是一个简化版本的,用来表示算数表达式的文法。终结符集合中包括id(标识符)等。E表示表达式Expression。由于这是一个描述表达式的文法,因此表达式就是这个文法的最大成分,因此E就是起始符号。
产生式的简写
如上图,候选式以算数表达式为例。
符号约定
如上图,其中,文法符号既可以表示终结符,又可以表示非终结符。
文法的定义
有了文法(语言规则),如何判断一个词串是否满足文法的句子?
引出推导和归约概念。
推导(Derivations)和归约(Reductions)
直接推导的定义如上图。
如上图,阿尔法经过0步推导得到的还是阿尔法;直接推导的正闭包表示“经过正数步推导”;直接推导的克林闭包表示“经过若干(可以是0)步推导”。
前面的定义不够直观,例子如上图,推导和归约较为直观地显示出来。
句型(sentential form)和句子(sentence)
如上图,句型和句子按照自然定义理解就好。在杠杠的例子中只有最后一个“little boy eats apple”是句子。
语言的形式化定义
由文法G的开始符号S推导出的所有句子构成的集合称为文法G生成的语言,记为。即
例子如上图,可见,文法G就是标识符的文法。先看D,D表示的是数字,L表示的是小写字母,而S表示,必须是小写字母开头。
语言上的运算
如上图,语言的运算同一个道理。
文法的分类(Chomsky文法分类体系)
0型文法(Type-0 Grammar)
- 无限制文法(Unrestricted Grammar)/短语结构文法(Phrase Structure Grammar)
- ∀α → β ∈P, α中至少包含 1个非终结符
- 0型语言,由0型文法G生成的语言L(G )。
1型文法(Type-1 Grammar)
如上图,阿尔法的字符数必须小于贝塔。在产生式的一般形式中,能否表示是与alpha_1、2相关的,因此叫“上下文相关(Context-Sensitive Grammar,CSG)”。并且,因为阿尔法大于等于1,因此贝塔不能去空串。
2型文法(Type-2 Grammar)
如上图,上下文无关文法(Context-Free Grammar,CFG)。
2型语言如上图。
3型文法(Type-3 Grammar)
如上图,3型文法是正则文法(Regular Grammar,RG),分为右线性(Right Linear)文法和左线性(Left Linear)文法。
上图中蓝色、黄色两种文法定义方式效果相同。
正则语言(3型语言)是由正则文法(3型文法)G生成的语言L(G),正则文法能描述程序设计语言的多数单词。
四种文法之间的关系
如上图,各级文法是逐级限制的关系。
CFG的分叙述
正则文法可以用来描述大多数单词,但是没法描述程序构成语言的句子构造。因此选择上下文不相干树。
如上图,根结点表示的是产生式③的左部。
分析树是推导的图形化表示
如上图,当只进行到时,分析树也只有一个根结点和两个叶子结点(产出yield或叫边缘frontier)。以此类推。
(句型的)短语
- 给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语(phrase);
- 如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语(immediate phrase)。
如上图,直接短语一定是某产生式的右部(按照我的理解,是因为产生式的右部相当于一种基本变化);但是产生式的右部不一定是给定句型的直接短语(即产生式未必完全显露)。例子见下。
如上图,“高人”等虽然为产生式的右部,但是不一定是分析树的直接短语。
二义性文法(Ambiguous Grammar)
如果一个文法可以为某个句子生成多个分析树,则称这个文法是二义性的。
如上图,该文法是二义性的。二义性不好,因此要引入终结符或消歧规则来去掉二义性。
这里,引入的规则是每个else和最近的尚未匹配的if匹配。
二义性文法的判断
对于人意一个上下文无关的文法,不存在一个算法,判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的。
- 满足,肯定无二义性;
- 不满足,也未必就有二义性。