语法树的画法(根据文法求字符串)

news2024/9/29 15:23:53

目录

1.语法树的画法

2.语法树的短语

3.直接短语(直接到根部)

4.素短语

5.句柄

6.算符优先分析句型


1.语法树的画法

文法G[E]:E->E+E | E*E | (E) | i ,字符串 i+i*i

推导方式有两种最左推导和最右推导(推导的技巧就是逐步靠近字符串的形式)

最左推导(从左往右替换):

E->E+E->i+E->i+E*E->i+i*E->i+i*i

最左推导得到的语法树如下:

最右推导(从右往左替换):

E->E+E->E+E*E->E+E*i->E+i*i->i+i*i

最右推导得出的语法树:

如果两种推导画出来的树相同,则说明他们有无二义性,如果树不同就是有二义性

2.语法树的短语

一个节点的最根部就是这个节点的短语,那么短语有几个呢,就看语法树中有分支的字符有几个,就有几个短语

由上图分析,第一个节点(①)的短语是i+i*i        第二个节点的短语i*i            ③④⑤的短语为i

3.直接短语(直接到根部)

所以上面这棵语法树的直接短语就是i,例如这里的直接短语就是 S,a(注意"("")"不是直接短语)

4.素短语

寻找素短语的前提是在短语中找,这些短语要满足以下条件

(1)至少包含一个终结符

(2)该短语不再包含满足第一个条件的更小的短语

由上面的语法树可以得到的语法为①i+i*i        ②i*i        ③i

①i+i*i,其中包含了满足第一个条件的②

②i*i,包含了满足第一个条件的③

所以素短语只有③

注:有些地方会提到最左素短语,最左素短语就是素短语中位于语法树最左的字符

5.句柄

最左最小的树对应的符号串,或者是直接短语中最左的符号串,在上面的语法树中,句柄就是i

例题1:

这里注意T+T也是素短语,因为他不包含满足第一个条件的短语

例题2:

消除左递归和消除回溯(这一部分比较难,还是要多做题感受下)

消除左递归:

例题1:

E-->E+T|T:

① 将T提前,其他改写为文法E':E->TE'

②剩下的写下来,"|"右边的T由于已经被提出来所以变为\varepsilon(空串):E'--->+TE'|\varepsilon

T-->T*F|F:

①T--->FT'

②*FT'|\varepsilon

F-->(E)|i:不符合左递归的形式,所以照搬即可

例题2:

消除回溯:

例题1:G[A] = A->aAB|a|b

①:将公共左因子"a"提走,另一部分改写为A',没有公共左因子的照抄:A-->aA'|b

②:将改造后的文法A'补齐:A'-->AB|\varepsilon

例题2:

6.算符优先分析句型

若有句型...N_{i}a_{i}...N_{j}a_{j}N_{j+1}....,当a_{i}...N_{j}a_{j}属于句柄时,则 N_{i} 和N_{j+1}也在句柄中,这是由于算符文法的任何句型中均无两个相邻的非终结符,且终结符和非终结符相邻时,含终结符的句柄必含相邻的非终结符,句柄终结符之间的关系如下:

例题:
 

第一步:需要将算符优先分析表得出来

这可以看:算符优先分析的方法

第二步:进行算符优先分析

①默认的#是小于当前输入符号(a)的,所以动作为移入

②接下来继续看栈顶的终结符(a),#<a且a>;所以a就形成了句柄

③对句柄进行归约

由式子可以看到:H->a|(S),可以看到句柄a可以归约为H,但是由于这里是算符优先级分析, 只考虑终结符,所以写任何非终结符是没有关系的,所以这里也可以写T

由于栈中最顶层的终结符为#,又因为#<;所以继续移进

接下来继续下一步的操作:

这里最顶层的终结符a满足,a>+,且"("< "a",所以a是这个整个语句的句柄,继续归约为T

继续下一步操作:

此时最顶层的终结符为+,因为“(”<"+",且“+” > ")",所以+为句柄,又因为,两端有两个非终结符,也在句柄中,所以由T-->T+S|S ,形似T+S,将“T+T”归约为T

由于“(“=”)“,且";" < "(" ,所以这里的"("是句柄,由于公式中含有H->G|(S),所以我们可以将其归约为H,但是这里非终结符是什么没有关系,所以统一归结为T

由于式子中包含S-->S;G|G,这里还是可以归约为S,但是同理我们归约为非终结符T也没有影响

所以可得结论:a;(a+a)G[S]文法中推出来的

但是这里我们注意:a;(a+a)的最右推导,无法推导出a;(a+a),所以a;(a+a)不是G[S]文法的句子

这与算符优先分析中的结论矛盾了,但是最右推导属于规范推导,正确答案是: (不是)

所以算符优先分析可能会错误地接受非法的句子,其推导的过程不规范。

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

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

相关文章

数禾使用 Knative 加速 AI 模型服务部署丨KubeCon China 2023

作者&#xff1a;李鹏&#xff08;阿里云&#xff09;、魏文哲&#xff08;数禾科技&#xff09;&#xff0c; 此文基于 KubeCon China 2023 分享整理 摘要 AI 服务的数据、训练、推理等都需要消耗大量的计算资源以及运维成本&#xff0c;在数禾科技的金融业务场景下&#xf…

LaTex中参考文献引用

一、引用参考文献 这里我们使用的是BibTeX的引用格式&#xff0c;因此文件中应包括两个文件&#xff08;.bib-参考文献 和 .bst-文献格式&#xff09;。 有了这两个文件后&#xff0c;我们在bib文件中创建参考文献&#xff1a;&#xff08;注意&#xff0c;作者的名字是逗号前…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Image图片组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Image图片组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Image组件 Image 用来加载并显示图片的基础组件&#xff0c;它支持从内存、本…

Ps:图框工具

图框工具 Frame Tool是自 Ps 2019 版开始新增的一个工具。 图框 Frame可用于限制图像的显示范围&#xff0c;在设计过程中&#xff0c;还常常可起到占位符的功能。 快捷键&#xff1a;K 使用图框工具&#xff0c;对于快速相册排版、创建某种形式的特效等有一定的帮助。比起使用…

变量的存储类型(storage class)

变量的存储类型(storage class) 对于变量的存储类型&#xff0c;前面遇到过一些疑惑&#xff0c;再简单的在这里说一下。存储类型是指存储变量值的内存类型&#xff0c;它用来决定存储空间的大小。变量的存储类型决定着变量的存储器和作用域。有三个地方可以用于存储变量&#…

java进阶(二)-java小干货

java一些精干知识点分享 2. java小干货2.1循环遍历2.2可变参数2.3 list和数组转化2.3.1 数组转list2.3.2 list转数组 2.4 值传递和地址传递2.4.1值传递2.4.2 地址传递2.4.3易错点总结 2.5 数组数组帮助类Arrays 2.5 基本数据类型和包装类2.5集合2.6文件流2.7java代码块、内部类…

MQ(消息队列)相关知识

1. 什么是mq 消息队列是一种“先进先出”的数据结构 2. 应用场景 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高&#xff0c;容错性就越低。以电商应用为例&#xff0c;用户创建订单后&#xff0c;如果耦合调用库存系统、物流系统、支付系统&#xff0c;任何…

python dash 写一个登陆页 4

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

Git安装及基本操作

1.安装Git 配置用户 git config --global user.name "用户名" git config --global user.email "邮箱"配置完成后查看配置 git config -l生成SSH秘钥 ssh-keygen -t rsa -C “邮箱” 输入完成后需要按3次Enter键 $ ssh-keygen -t rsa -C "邮箱&quo…

【MySQL学习笔记009】事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 二、事务操作 1、操作1 查看/设置事务提交方式 select a…

基于Hexo+GitHub Pages 的个人博客搭建

基于HexoGitHub Pages 的个人博客搭建 步骤一&#xff1a;安装 Node.js 和 Git步骤二&#xff1a;创建Github Pages 仓库步骤二&#xff1a;安装 Hexo步骤三&#xff1a;创建 Hexo 项目步骤四&#xff1a;配置 Hexo步骤五&#xff1a;创建新文章步骤六&#xff1a;生成静态文件…

c语言:从函数中返回指针

return关键词可以从被调函数中返回一个值到主调函数。现在我们尝试让它返回一个指针到主调函数中。 #include <stdio.h> int* func() { int n 100; return &n; } int main() { int* p func(); printf("%d\n", *p); return 0; } 我们在函数 func 中定义…

【FPGA 器件比较】Altera -- Xilinx

比较以下市场前二名的产品线及定位 应用场景XilinxAltera高性能VersalAgilex F/I性能Virtex / Kintex / Artix / Zynq UltraScaleAgilex F/I / Stratix 10中档Virtex / Kintex / Zynq ~ 7 / UltraScaleStratix 10 / Arria 10低成本Artix-7 Sparton-7Cyclone 10 如上表&#x…

sql_lab之sqli中的head头注入,less18

报错注入中的head注入&#xff08;less-18&#xff09; 1.输入用户名和密码123 123显示登录错误 2.输入用户名和密码123’ 123显示登录错误 则证明不是普通报错注入&#xff0c;因为有用户名和密码框&#xff0c;如果不是普通报错注入则尝试head注入 3.用burp进行爆破&#x…

1865_发动机控制器ECU

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_ECU_hacking: some learning notes about ECU(engine control unit) hacking. 发动机控制器ECU ECU有多种解释&#xff0c;这里的解释主要是指发动机控制器。这一份笔记&#xff0c;整理了发动机控制器的基本功能以…

网线制作,集线器、交换机、路由器的介绍以及路由器的设置

目录 一. 网线制作 1.1 制作材料 1.2 网线标准 1.3 网线做法 二. 集线器、交换机、路由器介绍 前言 简介 简单来说 三. 路由器的设置 设置1 设置2 设置3 设置4 无线设置 一. 网线制作 1.1 制作材料 网线 …

实现打印一个数字金字塔。例如:输入5,图形如下图所示

1*12**123***1234**** 12345*****#include<stdio.h> void main() {int i,j,l,n,k;scanf("%d",&n);/**********Program**********//********** End **********/ } 当我们拿到这个题目的时候可以看见题目给了我们五个变量&#xff0c;其中n是我们输入的数…

pip 常用指令 pip install 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip install 是一个 Python 包管理器命令&#xff0c;用于安装 Python 包。pip 是 Python 的一个重要工具&#xff0c;可以用来安装、升级和卸载 Python 包。 pip install 命令的一些常见参数有 -r&#xff1a;从一个需求文件中安装所有的…

vue 实现签字功能

1、安装&#xff1a;npm install vue-esign --save 2、main.js文件中全局引入&#xff1a; // 签字 import vueEsign from vue-esign Vue.use(vueEsign) 3、页面内容 <vue-esign ref"esign" :width"800" :height"300" :isCrop"isCro…

vue3(六)-基础入门之自定义组件与插槽、ref通信

一、全局组件 html: <div id"app"><mytemplace></mytemplace> </div>javascript: <script>const { createApp } Vueconst app createApp({})app.component(mytemplace, {template: <div><button>返回</button>…