第一部分 --- 文法![](https://i-blog.csdnimg.cn/blog_migrate/06f4da137b4503686a44f5aeb50f2d85.png)
1.箭头的左边由箭头的右边构成
2.蓝色部分就是文法 -- 描述语言的语法结构的形式规则
1.文法(蓝色部分)是描述句子语法结构的形式规则,在文法中包含了句子的语法结构,以及语法结构的每一部分是被句子的那个实际部分替换。
第二部分 --- 语法描述的基本概念
1.所有字的全体中有无穷多个字(因为字符的数量不受限)
1.V自身的n次积指的是V自己连接自己
2.当V中没有空字元素的时候,V的闭包和正规闭包之间就会出现区别 --- V的闭包中会有空字元素,V的正规闭包中则不会有空字元素。
第三部分 --- 上下文无关文法![](https://i-blog.csdnimg.cn/blog_migrate/c4ed01fd6e9b4a00eea36b32c63e572f.png)
1.终结符就是语句中无法再进行拆分的字,比如He,she等等
2.非终结符就是可以拆分为终结符 / 非终结符 / 两者都有的语句
3.箭头读作 定义为
1.E代表的是我们传给文法的表达式,P则是文法的产生式集合
1.如果候选式是终结符的话就用小写表示,如果是非终结符的话就用大写表示,如上图
第四部分 --- 通过文法生成语言![](https://i-blog.csdnimg.cn/blog_migrate/80723d4db4cd10cf47729cdb36c701c1.png)
1.将一个句子传给文法,文法如何将这个句子处理为语言呢?
1.单箭头表示定义,双箭头表示直接推出
2.其实阿尔法和β都是终结符,A是非终结符
3.直接推出是将一个非终结符的一次出现替换为定义它的候选式,而不是将一个非终结符的多次出现都替换为相同的候选式。
1.从一个起点串到另一个终点串的推导往往不唯一,但是推导的起点串和终点串都是一样的
能够通过开始符号 + 文法推导出来的都是句型,而只由终结符组成的句型就是句子,文法的所有句子的全体集合就是语言
在上图中,E就是文法的开始符号,我们要通过这个开始符号结合终结符集合,非终结符集合以及生成式集合推导出一个句子。
第四部分 --- 文法与语言![](https://i-blog.csdnimg.cn/blog_migrate/0d978b8306c286d4673750edf6dea502.png)
1.在文法中,终结符用小写字母表示,非终结符用大写字母表示
2.非终结式A推导出包含自己的非终结式AB,这种推导方式称为递归推导
1.首先写出满足语言要求的简单句子,这个最简单的句子一定能够通过文法 + 开始符号推出
(如上图第一条式子,满足要求的简单句子可能有多个,此时一个句子作为一个候选式由开始符号推导)
2.然后从递归的角度出发,找到符合语言要求的递归推导(从开始符号推导至由开始符号和 1 中得到的简单语句组成的递归句型(递归句型可能有多个,此时每一个句型都作为一个候选式由开始符号推导))
3.综合1,2的结果我们就得到了符合语言要求的文法的形式描述了
第五部分 --- 推导与语法树![](https://i-blog.csdnimg.cn/blog_migrate/4295ca846667e62cc3e64f0d85f7b166.png)
1.不同的推导方式会有不同的推导过程,但是它们具有相同的语法树
2.比如最左推导的推导过程是将语法树从上往下,从左往右推导,而最右推导则是将语法树从上往下,从右往左推导
第六部分 --- 语法树与二义性![](https://i-blog.csdnimg.cn/blog_migrate/d271c2a15bbd4e639b71e0ef9d5c4521.png)
1.设语言L,如果不存在非二义的文法能够得到这个语言L的话,则这个语言L是二义的
1.语言和文法的二义性会导致我们得到的计算结果不是确定的,这是我们在计算时不愿意看到的情况,为了解决这个问题,我们要用无二义的文法来推导句型和语言
1.在无二义文法中,一个句子只有唯一对应的一棵语法树
1.满足这些充分条件的文法是无二义文法,但是不满足这些充分条件的文法也可能是无二义文法
第七部分 --- 形式语言总览![](https://i-blog.csdnimg.cn/blog_migrate/97aa8aad6ff740bc9958fc05d9544eaa.png)
1.上下文无关文法是2型文法
2.这些文法的终结符,非终结符和开始符号的定义都是一样的,唯一有区别的就是它们的产生式集合的形式
1.1型文法中的最后一个要求是指:箭头左边的阿尔法串的长度要小于等于右边的β串的长度
唯一的一个例外就是将左边的串定义为空集的时候
3.三型文法具有两种类型,一种是右线性文法,这个文法要求它的产生式中要么没有非终结符,如果有的话则这个非终结符只能够出现在产生式的最右边
另一种类型是左线性文法,这个文法要求它的产生式中要么没有非终结符,如果有的话则只能够出现在产生式的最左边
1.3型文法能够描述的2型文法也能够描述,2型文法能够描述的1型文法也能够描述,1型文法能够描述的0型文法也能够描述
1.尽管我们无法用上下文无关文法完全描述现在的程序设计语言,但是我们依然可以用上下文无关文法来描述现在的程序设计语言的大部分内容,对于上下文无关文法无法描述的内容再用其它的方法来解决。