3.3语法分析-分析树与二义性

2023-10-21 20:40

本文主要是介绍3.3语法分析-分析树与二义性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前端

  • 源程序–<词法分析器–记号–语法分析–抽象语法树–语义分析器>–中间表示

语法分析器的任务

  • 记号流和语言的语法规则–>语法分析器–>语法树

推导与分析树

S -> N V N  (名词 动词 名词)
N -> s      // 羊| t      // 老虎| g      // 草| w      // 水
V -> e      // 吃| d      // 喝

  • 在推导的过程中有多条路可以走,不同的路可能导致不同的结果
  • 如果选错路径就要回溯重新走另一条路径,如果走完所有路径都还没有匹配到那就报错,如果中间有匹配到,就算语法正确

分析树

  • 推导可以表达成树状结构
    • 和推导所用的顺序无关(最左、最右、其他)
  • 特点:
    • 树中的每个内部节点代表非终结符
    • 每个叶节点代表终结符
    • 每一步推导代表如何从双亲节点生成它的直接孩子节点

表达式的例子

E -> num| id| E + E| E * E
  • 推导:3+4*5
    • 左推导

这里写图片描述

E -> E + E-> 3 + E
  -> 3 + E * E
  -> 3 + 4 * E
  -> 3 + 4 * 5
  • 右推导

E -> E * E-> E + E * E-> 3 + E * E-> 3 + 4 * E-> 3 + 4 * 5
  • 根据左右推导的结果可以看出,同样的文法推导出来的结果有所不同,其中涉及优先级问题

二义性文法

  • 给定文法G,如果存在句子S,它有两棵不同的分析树,那么称G是二义性文法
  • 从编译器角度,二义性文法存在问题:
    • 同一个程序会有不同的含义
    • 因此程序运行的结果不是唯一的
  • 解决方案:文法的重写

表达式文法的重写

E -> E + T| T
T -> T * F| F
F -> num| id
  • 推导:3+4*5
E -> E + T-> T + T
  -> F + T
  -> 3 + T
  -> 3 + T * F
  -> 3 + F * F
  -> 3 + 4 * F
  -> 3 + 4 * 5
  • 推导:3+4+5
E -> E + T-> E + T + T
  -> T + T + T
  -> F + T + T
  -> 3 + T + T
  -> 3 + F + T
  -> 3 + 4 + T
  -> 3 + 4 + F
  -> 3 + 4 + 5

这篇关于3.3语法分析-分析树与二义性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256852

相关文章

3.3V数字信号转5V信号(低成本)

在调一次LED屏驱动的时候,用到了一款LED驱动芯片TM1629,供电5V,如何将单片机高电平3.3v的数字信号,转换成5V高电平的数字信号给LED屏呢?采用低成本的方案考虑。     1:硬件上,单片机引脚输出端外加5V上拉,上拉电阻10K(可选) 2:单片机输出高电平:将引脚配制成输入模式,因为输入状态单片机处于高阻输出状态,5V上拉,确保给LED驱动芯片的信号为5V高电平  单片机

图像处理---二义性、通路长度、Dm距离的概念

---------------------------------------------------------------------------------------------------------————————————----— 今天终将成为我们回不去的昨天!想做就做,就是现在! ----------------------------------

Java | Leetcode Java题解之第385题迷你语法分析器

题目: 题解: class Solution {public NestedInteger deserialize(String s) {if (s.charAt(0) != '[') {return new NestedInteger(Integer.parseInt(s));}Deque<NestedInteger> stack = new ArrayDeque<NestedIntege

【计算机组成原理】3.3 主存储器与CPU的连接

3.3 主存储器与CPU的连接 00:00 各位同学大家好,在这一小节中我们要学习主存储器与CPU之间的连接。首先我们会回顾之前小结学习过的内容,我们已经知道了单块存储芯片它对外暴露出来的一些接口,我们首先会探讨单块存储芯片和CPU之间的连接如何实现,接下来会介绍多块存储芯片和CPU之间的连接,分别是位扩展、字扩展和字位同时扩展,这个小节的最后我们还会补充一些关于译码器的知识,补充的内容可能在

Photomator 3.3.22 (macOS Universal) - 照片编辑软件

Photomator 3.3.22 (macOS Universal) - 照片编辑软件 适用于 Mac、iPhone 和 iPad 的终极照片编辑器 请访问原文链接:https://sysin.org/blog/photomator/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Photomator 适用于 Mac、iPhone 和 iPad 的终极照

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目: 题解: func deserialize(s string) *NestedInteger {index := 0var dfs func() *NestedIntegerdfs = func() *NestedInteger {ni := &NestedInteger{}if s[index] == '[' {index++for s[index] != ']' {ni.Add(

Python | Leetcode Python题解之第385题迷你语法分析器

题目: 题解: class Solution:def deserialize(self, s: str) -> NestedInteger:index = 0def dfs() -> NestedInteger:nonlocal indexif s[index] == '[':index += 1ni = NestedInteger()while s[index] != ']':ni.ad

ZCC4105 48V 1MHz Synchronous Buck With 3.3V LDO Output

1 Features 。输入电压范围7V to 48 V 。输出电压可调节2.5V to 24 V 。1.2 A逐周期峰值限流                      。  内部环路补偿 。1MHz工作频率,支持小型L、C器件                                                    。内部集成同步管,无需外部肖特基二极管自适应恒压/恒流工

Rockchip开发系列 - 3.3.GPIO扩展芯片AW95016A和PCA953X(1)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述硬件信息AW95016A寄存器信息GPIO OUTPUT输出寄存器GPIO INPUT输入寄存器INTERRUPT寄存器 调试 返回总目录:Rockchip开发

3.3 【实战】爬取BOSS直聘招聘信息

第四节:爬取招聘网站信息 课程目标 对boss直聘招聘信息爬取并进行简单的分析 课程内容 编码实现 解析网站:https://www.spidertools.cn/#/curl2Request 1. 爬虫部分 import requestsimport pandas as pdfrom tqdm import tqdmimport timedef get_job_list(p