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 →α12|…|α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. 编译原理 --- 高级程序设计语言概述

    第一部分 --- 程序设计语言的定义 一个程序设计语言一般有三个定义:1.语法:2.语义:3.语用 在编译原理这门课中我们主要考虑语法和语义这两个定义 1.程序本质上是一定字符集合上的字符串,但是字符 ...

  2. 编译原理学习笔记2——高级程序设计语言概述

    编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...

  3. 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言

    高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...

  4. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  5. 编译前奏:高级程序设计语言概述

      以下内容均由编译原理视角展开 高级程序语言概述 程序设计语言的定义 高级程序设计语言的一般特性 先介绍一些有代表性的程序设计语言 语言 特点 FORTRAN 数值计算 COBOL 事务处理 Pas ...

  6. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  7. 高级程序设计c语言试卷答案,高级程序设计语言半期试卷答案.doc

    高级程序设计语言半期试卷答案 西南交通大学2009-2010学年第1学期半期试卷 课程代码 3243800 课程名称 高级语言程序设计 考试时间 90分钟 题号一二三四五六七八九十总成绩得分 阅卷教师 ...

  8. 编译原理词法分析程序设计

    编译原理词法分析程序设计 1.   课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...

  9. C语言是应用最为广泛的一种高级程序设计语言

    前 言 近年来,C语言是应用最为广泛的一种高级程序设计语言,它不仅是计算机专业学生的必修课,也是许多非计算机专业学生所青睐的技术学科.C语言程序设计是全国和各省计算机等级考试的重要考试内容.C语言功能 ...

最新文章

  1. (实用)将wordpad添加到Windows PowerShell中
  2. python把列表样式的字符串重新转换为列表
  3. BPMF论文辅助笔记:采样Ui 部分推导
  4. poj 2817 WordStack (状态dp)
  5. 过滤器链模式PK匿名方法实现,哪个更优雅?
  6. Java学习日报—JVM垃圾回收全解—2021/11/26
  7. oracle until freed,ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法...
  8. mfc opengl 三维地形图_衢州三维动画制作传媒企业哪家好2020收费
  9. 让VMware ESXi 5.5与Windows时间服务器同步
  10. python生成html表格_如何使用Python生成html目录列表
  11. 【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分
  12. python取反运算
  13. Macbook变速播放视频
  14. JavaScript学习笔记01——简介(李炎恢JavaScript教程)
  15. Matlab的fprintf函数使用百分号问题
  16. Placing Medals on a Binary Tree
  17. c51单片机烧录程序 控制台显示正在检测目标单片机
  18. 陪你一起看草原 在线Flash,在线歌曲
  19. 加解密遇到的JCE cannot authenticate the provider BC问题解决方案
  20. linux .gz文件 解压缩命令的简单使用

热门文章

  1. 考研分享:炎炎夏日中清凉复习的三大妙招
  2. iPerf图形化工具Jperf图文使用教程
  3. 只需两步,教你正确识别百度蜘蛛
  4. Qt+Mplayer视频播放器
  5. 沁园春#183;咏史
  6. (包成功)Windows 11安卓子系统安装apk运行安卓App
  7. STATA学习笔记:外部命令
  8. underscore.js源码整体框架解析
  9. 阿里云ECS的优势有哪些?
  10. 达观数据CEO陈运文:“AI+RPA”如何赋能企业数字化转型