编译原理:高级程序设计语言的语法描述
true beginning
高级程序设计语言的语法描述
文法:描述语言的语法结构的形式规则
比如在自然语言中
<句子> → <主语><谓语><直接宾语><间接宾语>
<主语> → <代词>
<谓语> → <动词>
<间接宾语> → <代词>
<直接宾语> → <冠词> <名词>
这样就定义了一个句子的组成形式
语法描述的基本概念
字母表:一个有穷字符集,记为Σ
字母表中的每个元素称为字符
Σ上的字(字符串):由Σ中的字符构成的一个有穷序列
不包含任何字符的序列称为空字,记为ε
Σ*表示Σ上所有字的全体(Σ上所有字符所能产生的字),包含空字ε
例:设Σ={ a,b },则
Σ* = { ε,a,b,aa,ab,bb,ba,aaa,…}
若U、V为Σ*的两个子集,则U和V的连接(积)定义为
UV = { αβ | α∈U & β∈V },顺序不可颠倒
例:设U = { a,aa }、V = { b,bb }
则UV = { ab,abb,aab,aabb }
V自身的n次积记为Vn
V0 = { ε }
V*是V的闭包:V*=V0∪V1∪V2∪V3∪…
V+是V的正规闭包:V+ = VV*
例:设U={ a,aa }
U* = { ε,a,aa,aaa,……}
U+ = { a,aa,aaa,aaaa,……}
可以看出正规闭包是不包含 ε 的闭包
上下文无关文法
高级程序设计语言使用上下文无关文法进行描述
至于文法的分类,请往后看
上下文无关文法G是一个四元组
G =(VT,VN,S,P)其中
VT:终结符(Terminal)集合(非空)
终结符:不可以再进行翻译的原子单位
VN:非终结符(Nonterminal)集合(非空),且 VT ∩ VN=∅
(一个非终结符往往是一个类/集合,比如算术表达式,代表一定算术表达式组成的类;
也可以说,一个非终结符表示一定符号串的集合)
S:文法的开始符号,(一个句子,从S开始翻译)S∈VN
P:产生式集合(有限),每个产生式形式为P→α,其中P∈VN,α∈(VT∪VN)*
开始符号S必须至少在某个产生式的左部出现一次,否则文法没有意义
例:定义只含+,*的算术表达式的文法 G = < { i,+,*,(,) },{E},E,P>,其中,P 由下列产生式组成:
E → i
E → E + E
E → E * E
E → (E)
通常
P → α1
P → α2
……
P → αn
简写为 P →α1|α2|…|αn
其中,| 读作 或,αi称为P的一个候选式
文法G简写为 G(E) : E → i | E+E | E*E | (E)
上面这种语法的描述形式称为巴克斯范式
巴克斯范式(BNF)是一种严谨描述文法的表达形式
由文法到语言
- 直接推出:当 A → γ 是一个产生式时,称αAβ直接推出αγβ,即 αAβ ⇒ αγβ,且 α,β ∈ ( VT ∪ VN )*
- 若α1 ⇒ α2 ⇒ … ⇒ αn,则我们称这个序列是 从α1到αn的一个推导。
若存在一个从α1到αn的推导,则称α1可以推导出αn
句型、句子和语言的概念
α 若可由 S 推导出,则称 α 是一个句型
仅含终结符号的句型是一个句子
文法G产生的句子的全体是一个语言
例:
请证明(i*i+i)是文法
G(E):E →i| E+E | E*E | (E)
的一个句子
证明: E ⇒ (E) ⇒ (E+E) ⇒ (E*E+E) ⇒ (i*E+E) ⇒ (i*i+E) ⇒ (i*i+i)
(i*i+i)是文法G的句子 E,(E),(E*E+E),…,(i*i+i)均是句型。
推导与语法树
从一个句型到另一个句型的推导往往不唯一
E + E ⇒ i + E ⇒ i + I
E + E ⇒ E + i ⇒ i + i
最左推导:任何一步 α ⇒ β 都是对 α 中的最左非终结符进行替换
最右推导:任何一步 α ⇒ β 都是对 α 中的最右非终结符进行替换
语法树:用一张图表示一个句型的推导,称为语法树
一棵语法树可以是不同推导过程的共性抽象
比如下面这棵树
既可以表示最左推导,也可以表示最右推导的过程
只是最左推导时,语法树由上至下,从左到右生长;最右推导时,语法树从上到下,由右至左生长
语法树与二义性(ambiguity)
一个句子对应的语法树是否唯一?
文法的二义性:若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的
上图说明 G(E):E →i|E+E|E*E|(E) 是二义文法
语言的二义性:一个语言是二义的,当它不存在无二义的文法
( 对于语言L,可能文法存在文法G,G’,使得L(G) = L(G’) = L,然而文法G无二义,G’是二义的 )
如上图,限制了 * 运算在 + 运算基础上产生,消除了原文法的二义性
二义性问题是不可判定问题,即不存在一个算法,能在有限步骤内,确切地判定一个文法是否是二义的,但可以找到一组无二义文法的充分条件
2019/1/26
编译原理:高级程序设计语言的语法描述相关推荐
- 编译原理 --- 高级程序设计语言概述
第一部分 --- 程序设计语言的定义 一个程序设计语言一般有三个定义:1.语法:2.语义:3.语用 在编译原理这门课中我们主要考虑语法和语义这两个定义 1.程序本质上是一定字符集合上的字符串,但是字符 ...
- 编译原理学习笔记2——高级程序设计语言概述
编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...
- 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...
- [编译原理学习笔记2-2] 程序语言的语法描述
[编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...
- 编译前奏:高级程序设计语言概述
以下内容均由编译原理视角展开 高级程序语言概述 程序设计语言的定义 高级程序设计语言的一般特性 先介绍一些有代表性的程序设计语言 语言 特点 FORTRAN 数值计算 COBOL 事务处理 Pas ...
- 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言
嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...
- 高级程序设计c语言试卷答案,高级程序设计语言半期试卷答案.doc
高级程序设计语言半期试卷答案 西南交通大学2009-2010学年第1学期半期试卷 课程代码 3243800 课程名称 高级语言程序设计 考试时间 90分钟 题号一二三四五六七八九十总成绩得分 阅卷教师 ...
- 编译原理词法分析程序设计
编译原理词法分析程序设计 1. 课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...
- C语言是应用最为广泛的一种高级程序设计语言
前 言 近年来,C语言是应用最为广泛的一种高级程序设计语言,它不仅是计算机专业学生的必修课,也是许多非计算机专业学生所青睐的技术学科.C语言程序设计是全国和各省计算机等级考试的重要考试内容.C语言功能 ...
最新文章
- (实用)将wordpad添加到Windows PowerShell中
- python把列表样式的字符串重新转换为列表
- BPMF论文辅助笔记:采样Ui 部分推导
- poj 2817 WordStack (状态dp)
- 过滤器链模式PK匿名方法实现,哪个更优雅?
- Java学习日报—JVM垃圾回收全解—2021/11/26
- oracle until freed,ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法...
- mfc opengl 三维地形图_衢州三维动画制作传媒企业哪家好2020收费
- 让VMware ESXi 5.5与Windows时间服务器同步
- python生成html表格_如何使用Python生成html目录列表
- 【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分
- python取反运算
- Macbook变速播放视频
- JavaScript学习笔记01——简介(李炎恢JavaScript教程)
- Matlab的fprintf函数使用百分号问题
- Placing Medals on a Binary Tree
- c51单片机烧录程序 控制台显示正在检测目标单片机
- 陪你一起看草原 在线Flash,在线歌曲
- 加解密遇到的JCE cannot authenticate the provider BC问题解决方案
- linux .gz文件 解压缩命令的简单使用