语法分析树(先看例子再看定义)

news2024/11/26 11:27:51

语法分析树(先看例子再看定义)

先讲例子

书上讲问题,先讲定义,一顿学术操作,让人云里雾里,然后出例子。其实这样往往让人觉得看书的过程就是放弃的过程。

关于语法分析树,我先从上篇文章的例子讲起。

书接上回,9-5+2的产生式表达为

list -> list + digit | list - digit | digit
digit -> 0|1|2|3|4|5|6|7|8|9

对应于语法分析树,首先把表达式作为写在树的最下面

9 - 5 + 2

然后从底往上构建语法表达树,首先看99digit,因此9可以表示为

 digit
   |
   9

-list->list-digit的中间部分,因此-的语法表达式部分为

     list
   /  |  \
list  -  digit

然后是55digit,且5-后面的字符,对应于上面的语法树,直接放在digit下面

        list
       / | \
      /  |  \
    list |  digit
         |    |
         -    5

这个时候可以看到左侧的list没有放任何东西,我们试着看看能不能把9对应的语法树部分放上去?

         list
       /  |  \
      /   |   \
    list  -  digit
     |         |     
   digit       5
     |    
     9    

我们发现在产生式

list -> digit

list可以具有形式如digit。也就是二者是等价关系,上述图是可以的。然后一次类推。最后形成图如下。

在这里插入图片描述

再看定义

定义

如果非终结符A有一个产生式A->XYZ,那么在语法分析树种就可能有一个标号为A的内部结,该结点有3个子结点,从左到右标号分别为X、Y、Z。

如图

在这里插入图片描述

即:给定一个上下文无关文法,则该文法就有一颗语法分析树(parse tree)

语法分析树的性质

  1. 根节点的标号为文法的开始符号。比如list

  2. 每个叶子结点的标号为一个终结符号或ee为空集。

    比如9-5形成的语法分析树

            list
           /  |  \
          /   |   \
        list  -  digit
         |         |     
       digit       5
         |    
         9   
    

    可以看到叶子结点分别为9,-,5,对于子树

     digit
       |
       9
    

    而言。可以看到digit非终结符作为根节点,9作为叶子结点,那么依据语法分析树的定义A->XYZ可知,YZ都是空集。

  3. 每个内部结点的标号是一个非终结符号

    即,除了叶子结点之外都必须是非终结符

  4. 如果非终结符号A是某个内部结点的标号,并且它的子结点的标号是从左至右分别是X1,X2,X3,...,Xn,,那么必然存在产生式A->X1X2X3...Xn。其中,X1,X2,X3,...,Xn既可以是终结符号,也可以是非终结符号。

    例如

            list
           /  |  \
          /   |   \
        list  -  digit
         |         |     
       digit       5
         |    
         9   
    

    list->list-digit中产生式右部listdigit就是非终结符

    另一个需要注意的方面

    作为一个特殊情况,如果A->e是一个产生式,那么一个标号为A的结点可以只有一个标号为e的子结点。
    

有关术语

对于术语(term),我更喜欢用英文表述,因为有些书翻译成中文的时候词不达意(本人雅思7分,口语单项8分)。

在这里插入图片描述

  • 语法分析树相关的术语
英文中文备注
node结点
label标号list,digit等
root最上面的list
parent父结点叶子结点以外的结点
child子结点父结点的下级
sibling兄弟节点同一父结点下的同级结点。sibling是兄弟姐们的意思
leaf叶子结点没有子结点的结点称为叶子结点
interior node内部结点有一个或多个子节点的结点
descendant后代节点N的后代要么是N本身,要么是N的子结点
ancestor祖先结点M是结点N的后代,那么N是M的祖先
yield结果一颗语法树的叶子结点从左到右构成了树的结果。在上述的例子中就是9-5+2
  • 语法分析

为一个给定的终结符号串构建一颗语法分析树的过程称为对该符号串进行语法分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1332431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…

线性回归简介

线性回归简介 1、情景描述2、线性回归 1、情景描述 假设,我们现在有这么一张图: 其中,横坐标x表示房子的面积,纵坐标y表示房价。我们猜想x与y之间存在线性关系: y k x b ykxb ykxb 现在,思考一个问题&…

PHP HTTPoxy CGI 应用程序漏洞 CVE-2016-5385

HTTPoxy CGI 应用程序漏洞 CVE-2016-5385 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle Communications BRM 10.x/12.x(云软件)中发现漏洞。它已经被宣布为关键。此漏洞影响组件用户数据库的未…

RabbitMQ如何做到不丢不重

目录 MQTT协议 如何保证消息100%不丢失 生产端可靠性投递 ​编辑 RabbitMQ的Broker端投 (1)消息持久化 (2)设置集群镜像模式 (3)消息补偿机制 消费端 ACK机制改为手动 总结 MQTT协议 先来说下MQTT…

springCould中的consul-从小白开始【4】

目录 1.consul介绍 ❤️❤️❤️ 2.安装 ❤️❤️❤️ 3.创建8006模块 ❤️❤️❤️ 4.创建80模块❤️❤️❤️ 1.consul介绍 ❤️❤️❤️ Consul 是一种用于服务发现、配置和分布式一致性的开源软件。它由HashiCorp开发和维护,可用于帮助构建和管理现代化的分布…

新建项目EasyUiAutotest,安装Appium-Python-Client

一、前置说明 Appium-Python-Client 是 Appium 的 Python 客户端库,它提供了一系列的类和方法,用于与 Appium 服务器进行通信,并执行各种移动应用测试操作,包括启动应用、模拟用户输入、点击等操作。 二、操作步骤 1. 启动Pych…

MySQL中MVCC的流程

参考文章一 参考文章二 当谈到数据库的并发控制时,多版本并发控制(MVCC)是一个重要的概念。MVCC 是一种用于实现数据库事务隔离性的技术,常见于像 PostgreSQL 和 Oracle 这样的数据库系统中。 MVCC 的核心思想是为每个数据行维护…

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网,开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因:虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …

网络7层架构

网络 7 层架构 什么是OSI七层模型? OSI模型用于定义并理解数据从一台计算机转移到另一台计算机,在最基本的形式中,两台计算机通过网线和连接器相互连接,在网卡的帮助下共享数据,形成一个网络,但是一台计算…

如何使用固定二级子域名公网访问多个本地Windows Web网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

共建共享,创新同行!飞桨星河社区助力大模型时代开发者砥砺前行

大模型引领AI新浪潮,助力人工智能实现从感知理解到生成创造的飞跃。飞桨星河社区,覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等,是国内最大的AI开发者社区,以飞桨和文心大模型为核心,集开放数据、…

NPOI 导出Excel

NPOI是一个用于处理Office文档的开源项目。它是用C#编写的,允许开发人员在.NET平台上读取、写入和操作Word、Excel和PowerPoint文件。NPOI提供了一组API,使开发人员能够以编程方式创建、修改和处理Office文档,这对于自动化生成报表、导出数据…

go写的海盗王数据库重置工具

很久没有用go去写代码了,很多语法都快忘记了。 为了测试一下界面库govcl的用法,拉了一个界面窗口之后,想想还是把代码也补上去吧。 于是,就写了这个海盗王数据库重置工具。 这个工具适合开服的人使用,可以将海盗王的账…

1.关于浏览器

一、认识主流浏览器 Chrome谷歌浏览器Safari苹果浏览器Firefox火狐浏览器Opera欧朋浏览器 二、浏览器内核是什么? 三、五大浏览器,四大内核 四、前端做网页开发用什么浏览器? Chrome谷歌浏览器。

VM固定虚拟机IP

命令 vim /etc/sysconfig/network-scripts/ifcfg-enosystemctl restart network子网掩码、网关、DNS获取如下:

什么是MVC?MVC框架的优势和特点

目录 一、什么是MVC 二、MVC模式的组成部分和工作原理 1、模型(Model) 2、视图(View) 3、控制器(Controller) 三、MVC模式的工作过程如下: 用户发送请求,请求由控制器处理。 …

windows下切换JDK8、JDK11、JDK17

问题背景: 需要同时使用不同版本的JDK进行开发和运行,可通过下述操作改变JDK版本。 一、java分类以及JDK、JRE、JVM的联系 1、JAVA分类 JAVA EE——Java Enterprise Edition, JAVA企业版,主要用于WEB开发。 JAVA SE——Java Stand…

LeetCode刷题--- 组合总和

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归递归、搜…

计算机是如何工作的(下)

4. 编程语言(Program Language) 本块内容主要是还原下我们已经熟悉的编程语言,即编程语言是如何和 CPU 指令对应起来的。 4.1 程序(Program) 所谓程序,就是一组指令以及这组指令要处理的数据。狭义上来说&…

python dash学习2

代码 内有说明: from dash import Dash, html, dcc, callback, Output, Input import plotly.express as px import pandas as pd# 从 Plotly 数据集中读取数据 df pd.read_csv(https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.c…