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

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


相关推荐

  • SpringBoot线程池的创建、@Async配置步骤及注意事项

    SpringBoot线程池的创建、@Async配置步骤及注意事项前言:最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了。但是遇到了许多问题,使得@Async无效,也一直没有找到很好的文章去详细的说明@Async的正确及错误的使用方法及需要注意的地方,这里简单整理了一下遇见的问题,Sring是以配置文件的形式来开启…

    2022年6月24日
    32
  • Hadoop入门(八)——本地运行模式+完全分布模式案例详解,实现WordCount和集群分发脚本xsync快速配置环境变量 (图文详解步骤2021)[通俗易懂]

    Hadoop入门(八)——本地运行模式+完全分布模式案例详解,实现WordCount和集群分发脚本xsync快速配置环境变量 (图文详解步骤2021)[通俗易懂]Hadoop运行模式1)Hadoop官方网站:http://hadoop.apache.org/2)Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。完全分布式模式:多台服务器组成分布式环境。生产环境使用。本地运行模式(官方WordCount案例)1

    2022年6月2日
    40
  • JAVA线程通信详解[通俗易懂]

    JAVA线程通信详解[通俗易懂]目录一、概述二、wait/notify机制三、Condition四、生产者/消费者模式五、线程间的通信——管道六、方法Join的使用一、概述    线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列…

    2022年6月19日
    28
  • 数据库四种隔离级别

    首先用通俗的语言介绍以下事务的特性(ACID): 原子性(Atomicity):原子性是指一个事务中的操作,要么全部成功,要么全部失败,如果失败,就回滚到事务开始前的状态。 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。那转账举栗子,A账户和B账户之间相互转账,无论如何操作…

    2022年4月3日
    49
  • 在小程序/mpvue中使用flyio发起网络请求「建议收藏」

    在小程序/mpvue中使用flyio发起网络请求「建议收藏」Fly.js一个基于Promise的、强大的、支持多种JavaScript运行时的http请求库.有了它,您可以使用一份http请求代码在浏览器、微信小程序、Weex、Node、ReactNative、快应用中都能正常运行。同时可以方便配合主流前端框架,最大可能的实现WriteOnceRunEverywhere。上一篇文章介绍了在快应用中使用flyio,本文主要介绍一下如何在…

    2022年9月7日
    2
  • dsp28335复位电路_28335串口不能中断

    dsp28335复位电路_28335串口不能中断0前言本期实验目标:采用外部中断方式响应按键触发,实现LED电平反转。外部中断是DSP十分常用的功能,通常用来响应一些控制操作,比如判断按键是否按下,传感器是否接收到信号等等。那么通过该例程,大家则可以快速学会使用外部中断的功能!本节仍然将分为硬件部分、软件部分和实验展示三个方面进行介绍。1硬件部分DSP28335支持XINT1-XINT7和XNMI共8路外部中断源,其中中断源XINT1/2和XNMI可以设定为从GPIO端口A的任意一个管脚输入,即GPIO0-GPIO31。而XINT3/4/5/

    2022年9月6日
    4

发表回复

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

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