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

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

先讲例子

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

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

书接上回,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
  • 语法分析

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版IDEA中Git的使用(一)

说明:本文介绍如何在新版IDEA中使用Git 创建项目 首先,在GitLab里面创建一个项目(git_demo),克隆到桌面上。 然后在IDEA中创建一个项目,项目路径放在这个Git文件夹里面。 Git界面 当前分支&Commit …

python dash 写一个登陆页 4

界面 代码: 这里引入了dash_bootstrap_components 进行界面美化 ,要记一些className,也不是原来说的不用写CSS了。 from dash import Dash, html, dcc, callback, Output, Input, State import dash_bootstrap_components as dbcapp Dash(…

使用 KVM 管理程序优化虚拟化

KVM(基于内核的虚拟机)是一项强大的开源虚拟化技术,内置于Linux 内核。它支持在单个物理主机上运行多个虚拟机 (VM),这对于资源效率、服务器整合以及为不同目的创建隔离环境特别有帮助。 本文将深入介绍 KVM 管理程序&#xff0…

MySQL主从架构及读写分离实战

​​​​​​ 目录 一、实验目的与环境 二、基础环境介绍 三、搭建主从集群 1、理论基础 2、同步的原理 3、搭建主从集群 3.1 配置master主服务器 3.2 配置slave从服务 3.3 主从集群测试 3.4 集群搭建扩展: 3.5、GTID同步集群 4、集群扩容 5、半同步复…

Git的总体认知与具体实现

GIt概念 是一种分布式控制管理器 tips:敏捷开发 -> 先上线,后续开发再继续开发 集中式和分布式 集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅…

电力系统风储联合一次调频MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 简介: 同一电力系统在不同风电渗透率下遭受同一负荷扰动时,其频率变化规律所示: (1)随着电力系统中风电渗透率的不断提高,风电零惯性响…

要参加微软官方 Copilot 智能编程训练营了

GitHub Copilot 是由 GitHub、OpenAI 和 Microsoft 联合开发的生成式 AI 模型驱动的。 GitHub Copilot 分析用户正在编辑的文件及相关文件的上下文,并在编写代码时提供自动补全式的建议。 刚好下周要参加微软官方组织的 GitHub Copilot 工作坊-智能编程训练营&…

指针:传址调用

#include <stdio.h> void Swap1(int x, int y) {int tmp x;x y;y tmp; } int main() {int a 0;int b 0;scanf("%d %d", &a, &b);printf("交换前&#xff1a;a%d b%d\n", a, b);Swap1(a, b);printf("交换后&#xff1a;a%d b%d\n&…

深度学习(七):bert理解之输入形式

传统的预训练方法存在一些问题&#xff0c;如单向语言模型的局限性和无法处理双向上下文的限制。为了解决这些问题&#xff0c;一种新的预训练方法随即被提出&#xff0c;即BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;。通过在大规模…

sessionStorage可以在多个Tab之间共享数据吗?

文章目录 一、MDN二、求证三、答案四、最后 一、MDN 只读 sessionStorage 属性访问当前源的会话存储对象。sessionStorage与localStorage类似&#xff1b;不同之处在于 localStorage 里面存储的数据没有过期时间设置&#xff0c;而存储在 sessionStorage 里面的数据在页面会话…

《xHCI 1.2》3体系结构概览

3.2 xHCI数据结构 3.2.1 Device Context Base Address Array 3.2.2 Device Context 3.2.3 Slot Context

机器学习——模型评估与选择(拟合、)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、拟合 拟合是指机器学习模型在训练的过程中&#xff0c;通过更新参数&#xff0c;使得模型不断契合可观测数据(训练集)的过程。欠拟合指的是模型在训练和预测表现都不好&…

C# 使用Socket进行简单的通讯

目录 写在前面 代码实现 服务端部分 客户端部分 运行示例 总结 写在前面 在.Net的 System.Net.Sockets 命名空间中包含托管的跨平台套接字网络实现。 System.Net 命名空间中的所有其他网络访问类均建立在套接字的此实现之上。 其中的Socket 类是基于与 Linux、macOS 或 W…

STM32实现三个小灯亮

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_P…

使用教程之【SkyWant.[2304]】路由器操作系统,破解移动【Netkeeper】校园网【小白篇】

许多高校目前饱受Netkeeper认证的痛苦&#xff0c;普通路由器无法使用&#xff0c; 教你利用SkyWant的Netkeeper认证软件来使你的SkyWant路由器顺利认证上网&#xff0c;全宿舍又可以合作共赢了&#xff01; 步骤一&#xff1a;正确连接网线&#xff0c;插电开机 正确连接网…

一个简单例子更深入地理解BigQuery 的分区表

首先本文不会讲得很系统&#xff0c; 可以理解为是1个练习&#xff0c; 从这个简单例子中&#xff0c; 我们会体会到分区表与非分区表的操作和效果的区别 准备测试数据 首先&#xff0c; 本人准备了一份csv file &#xff0c; 测试数据&#xff0c; 大概样子如下&#xff1a;…

从零构建tomcat环境

一、官网构建 1.1 下载 一般来说对于开源软件都有自己的官方网站&#xff0c;并且会附上使用文档以及一些特性和二次构建的方法&#xff0c;那么我们首先的话需要从官网或者tomcat上下载到我们需要的源码包。下载地址&#xff1a;官网、Github。 这里需要声明一下&#xff…

Hadoop入门学习笔记——七、Hive语法

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 七、Hive语法7.1. 数据库相关操作7.1.1. 创建数据库7.1.2…

每日一题——LeetCode859

方法一 个人方法&#xff1a; 首先s和goal要是长度不一样或者就只有一个字符这两种情况可以直接排除剩下的情况s和goal的长度都是一样的&#xff0c;s的长度为2也是特殊情况&#xff0c;只有s的第一位等于goal的第二位&#xff0c;s的第二位等于goal的第一位才能满足剩下的我们…

生成allure报告出现:ALLURE REPORT UNKNOWN

问题&#xff1a;点击浏览器查看时无法查看到报告 错误代码&#xff1a; if __name__ "__main__":pytest.main([./test_study/test_fixture.py])os.system("allure generate ./temps -o ./temps --clean") 结果导向&#xff1a; 解决&#xff1a;因为…