【编译原理】文法和语言的基本知识——基本知识要点汇总

halo~我是bay_Tong桐小白
本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言、指点

【更新日志】

最近更新:

  • 暂无编辑内容,持续更新中……

程序设计语言的描述

程序设计语言的三个考虑因素:语法、语义、语用

  • 语法:对语言结构的定义
  • 语义:描述了语言的含义
  • 语用:从使用的角度描述语言

非形式化定义与形式化定义

  • 非形式化定义:自然语言描述
  • 形式化定义:用符号式子组成的序列描述

字母表、符号、符号串

基本概念

字母表: 字母表 ∑ 是一个元素的非空有穷集合

  • 非空——至少包含一个元素
  • 元素——可以是字母、数字或其他符号

符号(字符): 字母表中的元素

符号串(字): 指字母表中符号的有穷序列

  • 建立在指定字母表上,有字母表上的有穷个符号组成
  • 符号串中符号的顺序不可忽视,如 ab 与 ba 是字母表上的两个不同的符号串

串的长度: 符号串中符号的长度。eg:串 s 的长度,通常记作|s|

不包含任何符号的符号串称为符号串,其长度为0,用 ε 表示
在这里插入图片描述

运算法则

符号串的连接: 设 x 和 y 是符号串,则串 xy 称为它们的连接。eg:设 x = abc,y = 10a,则 xy = abc10a,yx = 10aabc

  • 空串是连接运算的单位元,即对任意一个符号串x,有 ε x = x ε = x
  • 设 x,y,z是三个字符串,如果x=yz,则称y是x的前缀,z是x的后缀

符号串的幂运算: 串s的n次幂,即将n个s连接起来
在这里插入图片描述
集合的乘积:(以字母表运算为例)
在这里插入图片描述
集合的幂运算: (以字母表运算为例)字母表 ∑ 的 n 次幂, 即长度为n的符号串构成的集合
在这里插入图片描述
集合的正闭包与闭包:(以字母表运算为例)

  • 正闭包:字母表 ∑ 的正闭包,即长度正数的符号串构成的集合在这里插入图片描述
  • 闭包(也称克林闭包):字母表 ∑ 的克林闭包, 即任意符号串构成的集合在这里插入图片描述

注:符号串的集合和元素的集合(即字母表)都遵循此集合运算法则

文法的形式定义

在这里插入图片描述

语言的形式定义

推导: 从文法开始符号开始,通过产生式的右部取代左部,最终产生句子(由终结符构成的符号串)的过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

规约: 从给定源语言的句子开始,通过产生式的左部取代右部,最终到达开始符号的过程

推导和规约的关系:
在这里插入图片描述
推导和规约的每一步只能用一个产生式进行替换

在这里插入图片描述
即一个句型中既可以包含终结符,又可以包含非终结符,也可能是空串
在这里插入图片描述
即句子是不包含非终结符的句型

语言: 由文法 G 的开始符号 S 推导出的所有句子构成的集合称为文法 G 生成的语言,记为L(G)

L( G[S] ) = { x|S正数步推导到x 且 x∈终结符号集合闭包}

【ps:S 经过正数步推导得到 x,而不是用广义推导】

∵ S∈非终结符号集合
若用广义推导,则有可能有S=x
则与x属于终结符号集合闭包相矛盾
  • 由文法确定语言的中心思想:从文法符号出发,反复连续地使用规则,对非终结符施行替换和展开,找出句子的规律,用式子或自然语言描述出来
  • 给定一个文法,就能从结构上唯一地确定其语言(即当文法给定,语言也就确定)
  • 给定一种语言,能确定其文法,但文法不是唯一的
  • 若G和G’是两个不同的文法,如果它们描述的语言相同,那么G和G‘为等价文法

在这里插入图片描述
最左推导: 对于一个推导序列中的每一步直接推导,都是对最左非终结符进行替换

最右推导: 对于一个推导序列中的每一步直接推导,都是对最右非终结符进行替换

  • 也称规范推导
  • 用规范推导推导出的句型称为规范句型
  • 规范推导的逆过程称为最左规约,也称为规范规约

在这里插入图片描述

语法分析树

语法分析树: 对句型的推导过程给出一种图形表示,这种表示称为语法树,也称推导树;从左到右排列叶节点得到的符号串称为是这棵树的产出或边缘

语法分析树特点:

  • 每个结点的符号均包含在集合V中
  • 文法的开始符号作为树根
  • 若某一结点至少有一个分支节点,则该节点上的标记一定是非终结符
  • 若A的结点有k个分支结点,则 A→A1A2···Ak 一定是G的一条规则
  • 若该语法树中的叶子节点自左向右排列为w,则w为该文法的句型;若w中所有符号都是终结符,则w是该文法的一个句子

子树: 由某一结点连同其所有分支组成的部分

简单子树: 只有单层分支的子树

在这里插入图片描述

短语、直接短语、句柄的直观解释:

  • 短语:子树的末端结点形成的符号串是相对于子树根的短语
  • 直接短语:简单子树的末端结点形成的符号串是相对于简单子树根的直接短语
  • 句柄:最左简单子树的末端结点形成的符号串是句柄

文法化简变换

  • 文法中不能含有形如 A→A 的规则,这种规则称为有害规则,没有必要存在,且还会引起文法的二义性
  • 文法中不能有在推导文法的所有句子中始终都不可能用到的规则
  • 对文法中的某个非终结符A无法从它推导出任何终结符号串来,这样的规则不能出现。如 C→Ce

文法的二义性

文法二义性的概念: 如果一个文法存在某个句子对应两棵或两棵以上不同的语法分析树,则称这个文法是二义性的

或如果一个文法存在某个句子有两个或两个以上不同的最左(最右)推导,则这个文法是二义性的

在这里插入图片描述

文法二义性的消除方法:

  • 不改变文法中原有的语法规则,仅加进一些语法的非形式规定。如运算符运算规定好优先顺序和结合规则
  • 构造一个等价的无二义性文法,把排除二义性的规则合并到原有文法中,改写原有的文法

【 PS:文法的二义性与语言的二义性是两个不同的概念 】

  • 文法的二义性指存在某个句子是有二义性的
  • 语言的二义性指描述该语言的文法全部是二义性的,对它不存在无二义性的文法,这样的语言称为先天二义性的语言

文法和语言的分类

在这里插入图片描述

常见题型

  • 设计一个文法,定义一个已知的语言(已知语言,设计文法):
    在这里插入图片描述

  • 已知一个文法,确定该文法所定义的语言(已知文法,确定语言):
    做题方法:从文法符号出发,反复连续地使用规则,对非终结符施行替换和展开,找出句子的规律,用式子或自然语言描述出来

  • 求句型的短语、直接短语、句柄: 做题方法:画出语法分析树,通过剪枝,自左向右收集叶子结点,从而完成短语、直接短语、句柄的求解。eg:
    在这里插入图片描述

  • 判断文法的二义性: 做题方法:根据定义进行证明

  • 文法的化简变换: 做题方法:根据限制条件进行化简

持续更新中……
我是桐小白,一个摸爬滚打的计算机小白

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值