[编译原理] 学习笔记(二)——文法和语言

本贴最后更新于 3047 天前,其中的信息可能已经物是人非

一、 对程序设计语言的描述从语法、语义和语用三个因素考虑:
a) 语法:对语言结构的定义;
b) 语义:语言的含义;
c) 语用:从使用的角度描述语言。
形式语言理论是编译的理论基础。
二、 字母表:元素的非空有穷集合;
符号/字符:字母表中的元素;
符号串:符号的有穷序列。
三、 符号串运算:
a) 符号串的连接:εx=xε=x;
b) 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
c) 符号串的幂运算:x=abc,x^2=abcabc;
d) 集合的幂运算
e) 正闭包 A+ 与闭包 A*:A*={ε}∪A+
四、 形式语言:字母表上按照某种规则构成的所有符号串的集合,其不考虑语义。描述形式语言的方式有两种:
a) 枚举——当语言为有穷集合时;
b) 文法——描述了无穷集合的语言。
五、 文法:G=(Vn,Vt,P,S)
a) 规则 P:也称为产生式,是一个符号与一个符号串的有序对(A,β)
A→β
i. 一组规则定义了一个语言的语法结构;
ii. 规则中出现的符号分为终结符号和非终结符号
b) Vn 为非终结符(non-terminate);
c) Vt 为终结符(terminate);
d) S 为非终结符号,称为文法的开始符号/识别符号,至少要在一条规则的左部出现。
六、 推导:推导的依据是规则
a) 直接推导:仅使用一次规则;
b) 推导:至少使用一次规则;
c) 广义推导:经过 0 步或若干步的推导。
d) 最右推导又称规范推导,推导出的句型为规范举行;与之对应的最左规约为规范规约。
七、 句型、句子和语言:
a) 句型:S=*>x, x∈(Vn∪Vt)*,其中 S=*>x 为广义推导。
b) 句子:S=*>x, x∈Vt*,其中 S=*>x 为广义推导,x 必须是终结符的闭包(可为 ε)。
c) 语言:L(G[S])={x|S=+>x 且 x 属于 Vt*},其中 S=+>x 为推导,至少使用一次规则。
八、 递归:
a) 递归规则:在规则的左部和右部具有相同非终结符的规则;
i. 规则左递归:A->A…;
ii. 规则右递归:A->…A;
iii. 规则递归:A->…A…;
b) 文法递归:对文法中的任一非终结符,若能建立一个推导过程使得右部再次出现该非终结符,则文法是递归的。如:U->Vx, V->Uy|z,虽然这两个规则都不是递归规则,但组成的文法是递归文法 U->Vx->Uyx。所以含有递归规则的文法一定是递归文法,而递归文法不一定含有递归规则。
九、 短语、直接短语和句柄:都是针对某一句型的
a) 短语:S=*>αAδ 且 A=+>β,则称 β 是相对于非终结符 A 的句型 αAδ 的短语;对应语法树中的子树概念。
b) 直接短语:其中 A=>β 为直接推导;对应语法树中的简单子树。每个直接短语都是某规则的右部。
c) 句柄:是直接短语(即某规则的右部),且具有最左性;对应简单子树中最左的一棵。
十、 文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树 | 包含两个或两个以上的最右(最左)推导(规约),则该文法是二义性的,可以利用文法之间的等价性来消除二义性。
a) 不改变文法中原有的语法规则,进增加一些语法的非形式定义,如优先级;
b) 构造一个等价的无二义性文法。
十一、 文法的分类:
a) 0 型文法/无限制文法:α->β,其中 α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。
b) 1 型文法/上下文有关文法:αAβ->αuβ,其中 A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
c) 2 型文法/上下文无关文法:A->β,其中 A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。
d) 3 型文法/正规文法:常用于词法分析
i. 右线性文法:只能对推出式的右边展开,A->αB|α,A,B∈Vn,α∈Vt*。
ii. 左线性文法:只能对推出式的左边展开,A->Bα|α,A,B∈Vn,α∈Vt*。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 674 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 76 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 25 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 62 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 262 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 175 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 570 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    180 引用 • 821 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 85 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 528 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 701 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 638 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 737 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 5 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    31 引用 • 96 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 500 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 650 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 651 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 8 关注