编译原理学习笔记之上下文无关文法

编译原理学习笔记之上下文无关文法一 上下文无关文法 1 定义上下文无关文法是这样一个四元组 VT VN S P VT 终结符集合 非空有限集合 记号名是其同义词 VN 非终结符集合 非空有限集合且 VT VN S 开始符号 P 产生式集合 形如 A gt a A VN a VN VT 其中 终结符可以理解为词法单元 即是符号的最终形式 非终结符就是匹配终结符过程中引入的中间量 例 i

一、上下文无关文法

1.定义

上下文无关文法是这样一个四元组VT , VN , S, P

VT:终结符集合,非空有限集合,记号名是其同义词

VN:非终结符集合,非空有限集合且VT∩VN=Φ

S:开始符号

P:产生式集合,形如A -> a,A∈VN,a∈(VN∪VT)*

其中,终结符可以理解为词法单元,即是符号的最终形式,非终结符就是匹配终结符过程中引入的中间量,

({
id, +, *, , (, )}, {
expr,op}, expr,P )

编译原理学习笔记之上下文无关文法

以下符号通常表示终结符:

  • 字母表中前面的小写字母,如a,b,c
  • 黑体串,idwhile
  • 数字 0,1,,9
  • 标点符号,如括号,逗号等
  • 运算符号,如+,-

以下符号通常表示非终结符

  • 字母表中前面的大写字母,如A,B,C
  • 字母S, 通常它表示开始符号
  • 小写字母的名字,如exprstmt

2.上下文无关文法与正规式比较

上下文无关文法:

E -> E A E | (E ) | E | id

A -> + | *

正规式:

letter ->[A-Za-z]

digit ->[0-9]

id ->letter(letter|digit)*

  • 正规式来定义一些简单的语言能表示给定结构的固定次数的重复或者没有指定次数的重复
  • 正规式不能用于描述配对或嵌套的结构例如配对括号串的集合

因此通过引入上下文无关文法来进行语法分析

3.推导

推导:用于确定符合文法规则所规定的结构的串的集合(用来确定一个语言)

推导从一个结构名字开始,并在得到记号串作为结束

把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替

例:E -> E + E | E * E | (E ) | E | id

E — E (E) (E + E) -(id + E) (id + id)

上下文无关语言:由一个文法推导出来的结果

句型:包含非终结符的推导结果

句子:全部为终结符的推导结果-》即最终结果

推导就是一个把上下文无关文法转化为句子的过程

在推到的过程中涉及到同级别表达式的替换,因此按推到顺序可以分为最左推导最右推导,顾名思义:

最左推导:推导过程中始终最先代换最左侧的文法

最右推导:推导过程中始终最先代换最右侧的文法

举个例子:

编译原理学习笔记之上下文无关文法

编译原理学习笔记之上下文无关文法

可以看出最左推导和最右推导产生的分析树结构是不一样的,为什么会产生这种情况,就是因为文法的二义性

4.二义性

文法的二义性,是指对于符合文法规则的同一个句子,存在两种可能的分析树

产生原因

类似+ 和*这种不同的优先级在文法中没有得到体现

消除方法

用层次的观点看待表达式

根据运算符优先级不同,引入新的非终结符

比如将上式产生二义性的文法引入一个中间量

E ->E + T | T

  T -> T * F | F

  F -> id | (E)

 

5.分析树

上文中多次涉及分析树,其实分析树就是根据推导过程建立的树形结构,他的所有叶子节点都是终结符,所有非叶子结点都是非终结符,根节点是文法的开始符号

6.上下文无关文法的优缺点

优点:

  • 给出了精确的,易于理解的文法说明
  • 自动产生高效的分析器
  • 可以给语言定义出层次结构
  • 以文法为基础的语言实现便于语言的修改

缺点:

文法只能描述编程的部分语法

二、NFA->上下文无关文法

  1. 确定终结符集合
  2. 为每个状态引入一个非终结符Ai
  3. 如果状态i有一个a转换到状态j,引入产生式Ai->aAj,如果i是接受状态,则引入Ai->e(空串)

编译原理学习笔记之上下文无关文法编译原理学习笔记之上下文无关文法

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233278.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux下的文本编辑器介绍「建议收藏」

    Linux下的文本编辑器介绍「建议收藏」关于文本编辑器文本编辑器有很多,比如图形模式的gedit、kwrite、OpenOffice……,文本模式下的编辑器有vi、vim(vi的增强版本)和nano……vi和vim是我们在Linux中最常用的编辑器。我们有必要介绍一下vi(vim)最简单的用法,以让Linux入门级用户在最短的时间内学会使用它。 nano工具和DOS操作系统下的edit操作相似,使用简单…

    2022年7月26日
    7
  • gis中char是什么字段_gis中字段类型char

    gis中char是什么字段_gis中字段类型char维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abcQ abcQ ab

    2022年8月9日
    6
  • ElasticSearch集群搭建图文解析

    ElasticSearch集群搭建图文解析/前言/      ElasticSearch作为一个分布式搜索引擎有着广泛的应用场景,而搜索服务在在一个项目中的权重还是比较高的,所以我们要想办法去提高搜索服务的可用性,这就是ElasticSearch集群的作用,为搜索服务提供高可用的特性       何为高可用呢,其实就是字面意思,假设我们的搜索服务可以一直不停的提供服务,那么高可用性就是100%,

    2022年10月13日
    4
  • 优秀ASP.NET程序员修炼之路

    初级的程序员或经验不足的程序员往往只意识到自己的程序是写给计算机的,而不会在意程序其实也是写给人的,或在意得不够、不全面。写给机器的程序,往往追求的是运行正确、执行效率能满足要求。但程序员的任务仅仅

    2021年12月25日
    48
  • pytest报错_eclipse提交代码到git

    pytest报错_eclipse提交代码到git前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月29日
    10
  • 我们究竟在为谁而工作?80%的人没有搞懂.

    首问: 我们的价值观是什么?首先要明白自己的价值观是什么?我们想过什么样的生活,我们将来要成为什么样的人?我现在的工作我满意吗?我现在的工作态度满意吗? 我觉得首先要问清楚自己这些…

    2021年6月21日
    148

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号