当前位置: 首页 > news >正文

编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)

进入今天的学习前,若不理解LL(1)文法中的首符号集,后跟符号集和选择符号集,可看:

http://t.csdnimg.cn/BjSHv

构造预测分析表的步骤:

步骤1:对文法的每个规则U->u,执行步骤2与3

步骤2:对于每个终结符a\varepsilonFirst(u),让A[U,a]='U->u';

步骤3:如果\varepsilon(空串)\epsilonFirst(u),则对Follow(U)中的每个终结符号b或#,让A[U,b]='U->u'或

A[U,#]='U->u';

步骤4:把A的每个未定义元素置为ERROR(用空白表示)

设有以下文法:

构造预测分析表之前需要列首符号集:

 注:当首符号集中出现\varepsilon(空串),那么就需要将“->”左边的Follow集计算出来

第一步:输入的一行表示文法中的终结符号,

第二步:

对于First(TE')={ ( , i }

 以此类推可得,剩余空格都为ERROR

示例:输入字符串:i+i*i,该字符串是否为文法G[E]产生的句子

步骤一:

对于第一个要处理的字符” i “,弹出E,放入TE'

注:左边是栈底,右边是栈顶

输入输出
#Ei+i*i#第一步,没有输出
#E'Ti+i*i#E->TE'(第一步输入的输出)

从第二步开始就一定要从上一步输入的输出来写栈,例如:

上一步输入的输出为:E->TE',E'先入栈,T再入栈,反序入栈 

步骤二:

接下来还是输入”i“,遇到的是栈顶T,结合分析表得到T->FT',再加上先弹出的”E“,得到栈#E'T'F,

接下来将”F“弹出来,对上输入的”i“,得到"F->i"

输入输出
#E'T'F“i+i*i#”T->FT'
#E'Ti“i+i*i#”F->i

此时看到指针指向的输入“i”与栈顶”i“相同,就可以将两者弹出,得到

输入输出
#E'T“+i*i#”

以此类推

输入输出
#E"+i*i#"T'->ε
#E'T+"+i*i#"E'->+TE'
#E'T"i*i#"
#E'T'F"i*i#"T->FT'
#E'T'ii*i#”F->i
#E'T'i*i#”
#E'T'F*"*i#"T'->*FT'
#E'T'F"i#"
#E'T'i"i#"F->i
#E'T'"#"
#E'"#"T'->ε
#"#"E'->ε

至此,可以判断此字符串是文法G(E)的句子

相关文章:

  • python第二课 变量的数据类型
  • github 上传代码报错 fatal: Authentication failed for ‘xxxxxx‘
  • 【网络协议】
  • 前后端交互常见的几种数据传输格式 form表单+get请求 form表单+post请求 json键值对格式
  • 远程运维用什么软件?可以保障更安全?
  • Visual Studio 2019光标变成灰色方块问题
  • python使用selenium做自动化,最新版Chrome与chromedriver不兼容
  • Android 10.0 系统默认打开OEM解锁开关功能实现
  • V90伺服 EPOS模式下回原(详细配置+SCL源代码)
  • rust变量绑定、拷贝、转移、引用
  • Jakarta-JVM篇
  • 【python海洋专题四十三】海洋指数画法--单色渐变柱状图
  • SpringDataJpa(三)
  • 【pytest】html报告修改和汉化
  • ubuntu20.04下apache启用php7.4-fpm
  • 【5+】跨webview多页面 触发事件(二)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【刷算法】求1+2+3+...+n
  • 0x05 Python数据分析,Anaconda八斩刀
  • 4. 路由到控制器 - Laravel从零开始教程
  • gcc介绍及安装
  • Java深入 - 深入理解Java集合
  • js学习笔记
  • leetcode46 Permutation 排列组合
  • MQ框架的比较
  • Octave 入门
  • PAT A1120
  • Spark学习笔记之相关记录
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 基于 Babel 的 npm 包最小化设置
  • ------- 计算机网络基础
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端学习笔记之观察者模式
  • 思否第一天
  • 2017年360最后一道编程题
  • Linux权限管理(week1_day5)--技术流ken
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​决定德拉瓦州地区版图的关键历史事件
  • #QT(TCP网络编程-服务端)
  • #QT项目实战(天气预报)
  • #宝哥教你#查看jquery绑定的事件函数
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)丶RabbitMQ的六大核心
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 材料检测系统崩溃分析
  • .NET学习全景图
  • [CLR via C#]11. 事件
  • [Geek Challenge 2023] web题解