上下文无关文法是描述程序语言语法的强有力的数学工具。

乔姆斯基文法体系

3型文法:正则文法:词法结构

2型文法:上下文无关文法:语法结构

1型文法:上下文有关文法

0型文法:任意文法

每一个外部文法(大圈)都比内部文法(小圈)表达能力强。

举个自然语言处理的例子

  • 自然语言中的句子的典型结构

    • 主语 谓语 宾语
    • 名词 动词 名词
  • 例子:
    • 名词:{羊, 老虎, 草, 水}
    • 动词:{吃, 喝}
  • 句子:
    • 羊 吃 草
    • 羊 喝 水
    • 老虎 吃 老虎
    • 草 吃 老虎
    • ......

对这个例子,我们进行形式化分析:

(S 表示句子, -> 表示推出, N 表示名词, V 表示动词)

S -> N V N
N -> s(sheep)| t(tiger)| g(grass)| w(water)
V -> e(eat)| d(drink)

我们将其中的大写符号叫做非终结符:{S, N, V}

将小写的符号(名词+谓词)叫做终结符:{s, t, g, w, e, d}

开始符号是:S

上下文无关文法

上下文无关文法 G 是一个四元组:

G = (T, N, P, S)

  • 其中 T 是终结符集合
  • N 是非终结符集合
  • P 是一组产生式规则
    • 每条规则的形式: X -> β1 β2 ... βn, n >= 0

      • 其中 X ∈ N, βi ∈(T ∪ N)
  • S 是唯一的开始符号(非终结符)
    • S ∈ N

对于之前给出的上下文无关文法的例子

S -> N V N
N -> s| t| g| w
V -> e| d

G = {N, T, P, S}

非终结符号:N = {S, N, V}

终结符号: T = {s, t, g, w, e, d}

开始符号:S

产生式规则集合:

{ S -> N V N,

N -> s,

N -> t,

N -> g,

N -> w,

V -> e,

V -> d}

在给一个上下文无关文法的例子

E -> num| id| E + E| E * E

G = {N, T, P, S}

非终结符: N = {E}

终结符: T = {num, id, +, *}

开始符号:E

产生式规则集合:

{ E -> num

E -> id

E -> E + E

E -> E * E }

也可以将上述集合中的四条语句相互连接起来,组合成如题所示的用或表示的一条语句。

推导

  • 给定文法 G, 从 G 的开始符号 S 开始,用产生式的右部替换左侧的 非终结符
  • 此过程不断重复,直到不出现非终结符为止
  • 最终的串称为句子

举个例子,如下面的文法 G

S -> N V N
N -> s| t| g| w
V -> e| d

首先,从开始符号 S 开始进行替换。 S -> N V N

此中还有三个非终结符,对其进行循环,替换 V, 得到 N d N ;

接着,替换第三个 N 为 g , 得到 N d g ;

最后,替换仅剩下的最后一个非终结符 N 为 t, 得到 t d g。

对于上面的三个终结节点 N V N 的选取先后顺序可以自行调整,没有严格的规定。

最左推导和最右推导

  • 最左推导:每次总是选择最左侧的符号进行替换。

    • 即对于上例中的 N V N ,首先替换最左边的 N, 再替换之后最左侧的非终结符 V, 最后替换最有一个非终结符 N。
  • 最右推导:每次总是选择最右侧的符号进行替换。

语法分析

给定文法 G 和句子 S, 语法分析要回答的问题:是否存在对句子 S 的推导?

若仍然选择上面的文法 G,当 S = t d g 时,我们能够实现 S 通过若干步的推导得到 t d g。所以回答 是。

若 S = t d d, 则不能实现该推导,回答 否。

语法分析器的任务

语法分析器从记号流中获取 句子 S ,再接受使用 上下文无关文法 G 描述的语言的语言规则,回答在 G 中是否存在对 S 的推导。是或者否。并给程序员反馈精确的出错信息。


原文链接:

  • 编译原理 - 网易云课堂

anbmcmdn 上下文无关文法_词法分析 | 上下文无关文法和推导相关推荐

  1. python进入上下文管理器_浅谈Python中with(上下文管理器)的用法

    例子一 首先来看一段代码: classFoo(object):def __init__(self):print('实例化一个对象')def __enter__(self):print('进入')def ...

  2. 怎么根据矩阵判断极大无关组_如何判断向量是否是矩阵的极大无关组?

    首先你这个提问不是很严谨哦ε3ε 极大无关组是向量组里面的概念,而在矩阵里没有极大无关组这个概念,虽然向量组合并在一起可以看成一个矩阵,但不能说矩阵有极大无关组. 我们先从概念出发,极大线性无关组:在 ...

  3. 上下文无关文法和正则文法_什么是上下文无关文法?

    上下文无关文法和正则文法 Have you ever noticed that, when you are writing code in a text editor like VS code, it ...

  4. xx是一个类型 这在给定的上下文_基于上下文的派发:挂起临时变量内存

    最近做一些蒙卡相关的东西,然后遇到有一个可能很多人都会遇到的问题: 把所有的步骤都手写成原地(in-place)操作由于需要自己来保管各种中间变量会很麻烦(增加心智负担),但是用比较正常的方式去写又由 ...

  5. 如何避免循环查询数据库_与数据库无关的查询是不可避免的

    如何避免循环查询数据库 As the amount of data managed by an organization grows, the difficulty of managing and q ...

  6. 利用classloader同一个项目中加载另一个同名的类_线程上下文类加载器ContextClassLoader内存泄漏隐患...

    前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器Cont ...

  7. 【随想】_无关技术_你是合格的项目经理人吗?

    ---恢复内容开始--- " 一流的领导,自己不干,下属拼了命为你干 二流的领导,自己和下属一起拼了命干 三流的领导,自己不干,要求下属拼了命为自己干 四流的领导,自己拼了命干,下属不干 五 ...

  8. axure9 邮件点击效果_总是收到无关的工作邮件?这个有意思的工具可以帮你消灭它们...

    尽管<微信><企业微信><钉钉>等即时沟通 app 的出现提高了沟通的效率,但邮件在我们的工作.生活中还是有不可或缺的作用. 比如工作出现争端的时候,你就可以直接甩 ...

  9. python上下文管理关键字_[宜配屋]听图阁

    前言 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器. 对于系统资源如文件 ...

  10. python上下文管理关键字_详解 Python 中的 with 与 上下文管理器

    with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管理的例子.你一定已经相当熟悉了,我就不再废话了 ...

最新文章

  1. [转]wxODBC(wxWidgets)中使用驱动程序方式打开数据库
  2. SPL--Serializable
  3. git 拉取分支代码 合分支
  4. scala for循环
  5. 腾讯云,物联网通信产品,动态注册步骤
  6. BOM之navigator对象和用户代理检测
  7. .NET中的异步编程(一)-为什么需要异步
  8. Oracle 日期加减运算
  9. 链路聚合_链路聚合实验
  10. 安裝MAVEN插件(轉)
  11. linux 命令缺失安装,Redhat7没有安装ifconfig命令的解决方法
  12. php 图片裁剪保存,PHP图片裁剪与缩放示例(无损裁剪图片)
  13. 2022年南京大学软件工程专硕考研初试第二411分上岸经验贴
  14. 书籍翻译 - Fundamentals of Computer Graphics, Fourth Edition 虎书第四版中文翻译
  15. 用了很多群控与云控,微信还是慢慢死掉了
  16. SCI收录期刊——遥感学科
  17. 前端的长度单位有哪些
  18. 总结 27 类深度学习主要神经网络:结构图及应用
  19. “特质波动率之谜”(Idiosyncratic Volatility),用Python计算特质波动率
  20. 关于Ajax跨域的解决方案

热门文章

  1. win10“无法完成操作,因为文件包含病毒或潜在的垃圾软件”解决办法
  2. 再次回归 IDEA 的部分修改记录...
  3. 轻松斩断信息安全黑手!就这?
  4. Excel练习线性回归
  5. 并查集(Union-Find)算法详解
  6. 【计算机考研408强化-操作系统】1. 操作系统的基本概念
  7. 【Android 逆向】Android 逆向通用工具开发 ( PC 端工具 hacktool 启动 main 函数分析 | hacktool 工程中的核心类 HackCommand 分析 )
  8. 海尔智慧电视如何进入工厂模式
  9. 全自动抠图换背景软件下载_抠图换背景app
  10. tkmybatis简单教程