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

编译原理学习笔记之上下文无关文法一 上下文无关文法 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎样让浏览器变身代码编辑器?

    怎样让浏览器变身代码编辑器?将浏览器变成一个简易文本编辑器一开始的功能非常简单,根本没有语法高亮,也没有自动缩进,仅仅是将浏览器变成一个文本编辑器而已。Jose分享的代码如下:data:text/html,htmlcontenteditable>只需要将上面的代码复制粘贴到浏览器的地址栏,然后按回车,就可以让浏览器变成编辑器。是不是非常简单?背后的原理并不高

    2022年6月22日
    40
  • PhpStorm激活成功教程版及使用教程

    PhpStorm激活成功教程版及使用教程本文引自网络,仅供本人学习使用之用,感谢网友的分享PhpStormPhpStorm 是JetBrains公司开发的一款商业的PHP集成开发工具,旨在提高用户效率,可深刻理解用户的

    2022年8月2日
    9
  • Uniapp进行APP打包——iOS 系统[通俗易懂]

    1、创建唯一标识符(1)首先,申请苹果开发者账号。没有苹果开发者账号是无法进行ios打包上线的。(2)进入https://developer.apple.com这个网址,点击“account”并输入苹果开发者账号进入用户界面。(3)点击证书文件(4)进入到这界面以后,点击“APPIDs”,并新建一个APPid(5)设置name和BundleID注意,这个BundleID的格式不要写错在后面多处都会用到。(6)配置相应服务,并点击con

    2022年4月8日
    1.2K
  • SpringBoot的认识,SpringBoot与Spring关系[通俗易懂]

    SpringBoot的认识,SpringBoot与Spring关系[通俗易懂]一、概念1、SpringSpring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。2、SpringMVCSpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。S

    2022年5月27日
    35
  • Zabbix系列之入门介绍(一)

    Zabbix系列之入门介绍(一)

    2021年9月1日
    67
  • 金蝶迷你版云服务器没有响应,连接云服务器异常金蝶迷你版

    连接云服务器异常金蝶迷你版内容精选换一换云服务器列表页面显示了所有已创建的GPU加速型云服务器信息。您可以参考如下操作查看云服务器详情。云服务器详情中展示了如下信息:云服务器名称、ID、状态等。云服务器上会话的状态、当前应用、连接设备、连接用户等。VR云渲游平台中涉及的云服务器状态如表1所示。云服务器状态一览云服务器状态说明正常设备与该云服务器正在连接中。闲置处于该状态的云服务云服务器列表页面,…

    2022年4月8日
    281

发表回复

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

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