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

【编译原理】 第四章 自上而下语法分析

目录

语法分析器的功能

不确定的自上而下分析

确定的自上而下分析

LL(1)文法

左递归的消除

间接左递归的消除

消除文法中全部左递归的算法

消除回溯、提左因子

FIRST集

FOLLOW集

预测分析法

递归下降分析法


语法分析器的功能

按照文法从源程序单词串(符号串)中识别各类语法成分,判断所给出单词串是否是给定文法的正确句子,并为语义分析和代码生成做准备

  按照语法分析树的建立方法可以将语法分析方法分为: 自上而下分析法、自下而上分析法。

不确定的自上而下分析

算法思想:        

对于任一输入符号串,试用一切可能的办法从树根 结点出发根据文法自上而下的为输入串建立一棵语法树。

对应最左推导:

以上为输入符号串建立语法树的过程,实际上也是一个 建立最左推导的过程,之所以使用最左推导,是因为我 们对输入串是从左到右扫描的,只有使用最左推导,才 能按扫描顺序去匹配输入串。

存在问题:

1.左递归问题:自顶向下分析方法,在匹配过程中,假若 用到非终结符号U去匹配输入串,而U为左递归的(例如: U\rightarrowU…),那么为了用它的右部匹配输入串,又要用到非 终结符号U,循环往复,没有终止。若文法存在间接递归, 也有相同问题发生。

2.回溯问题:对某个非终结符,当有多条规则时,需采用 逐个选择的方法,若不能匹配需要回溯,代价高,效率低。

还有虚假现象、出错位置不确切等。

确定的自上而下分析

算法思想:

对于任一输入符号串,从文法的识别符号出 发,根据当前的输入符号,唯一确定一个产生式,用产 生式右部的符号串替代相应的非终结符往下推导,或构 造一棵语法树。若能推导出输入串或构造语法树成功则 输入串是句子,否则不是。

LL(1)文法

 该文法满足确定的自上而下的分析方法, 其中,第一个L表明自左(Left)向右扫描输入串,第二个L表明分析过程采用最左(Left)推导,括号中的1表明只需向右看一个符号便可决定选择哪个产生式进行推导。

左递归的消除

P=E        \alpha=+T        \beta=T

P=T       \alpha=*F        \beta=F

间接左递归的消除

先将间接左递归变为直接左递归, 再按消除直接左递归的方法进行。

消除文法中全部左递归的算法

前提:该文法不含回路。

消除回溯、提左因子

FIRST集

FOLLOW集

预测分析法

 预测分析程序是一种自顶向下分析程序,预测分析

要求文法是LL(1)文法,它由分析栈分析表分析程序 三部分组成,其中分析表的构成与文法有关。

构造预测分析表

预测分析表的构造算法

递归下降分析法

方法思想:

对源程序中每个语法成分编制一个处理子程序,即对每个非终结符号编制一个递归过程,每个 子程序的功能是识别由该非终结符号推出的串。它要 求文法满足LL(1)文法,以便当某个非终结符号有多条 产生式时,可以根据当前的输入符号唯一地确定选择 某个产生式进行匹配。

http://www.xdnf.cn/news/1881.html

相关文章:

  • 【速写】钩子与计算图
  • B 树失败结点个数计算好题分享
  • 【黑马 微服务面试篇】
  • 多模态深度学习: 从基础到实践
  • 星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。
  • windows编程字符串处理
  • 【QQMusic项目界面开发复习笔记】第二章
  • 工业相机——镜头篇【机器视觉,图像采集系统,成像原理,光学系统,成像光路,镜头光圈,镜头景深,远心镜头,分辨率,MTF曲线,焦距计算 ,子午弧矢】
  • 【TS入门笔记2---基础语法】
  • python_BeautifulSoup提取html中的信息
  • 1GB与1MB的数值换算关系
  • DeepSeek本地部署保姆级教程
  • tkinter的文件对话框:filedialog
  • Graph Database Self-Managed Neo4j 知识图谱存储实践2:通过官方新手例子入门(未完成)
  • 软考中级-软件设计师 知识点速过1(手写笔记)
  • 五一去荣昌吃卤鹅?基于Java和天地图的寻找荣昌卤鹅店实践
  • C++入侵检测与网络攻防之暴力破解
  • 系统架构师2025年论文《论非功能性需求对企业应用架构设计的影响》
  • Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
  • 深度剖析!GPT-image-1 API 开放对 AI 绘画技术生态的冲击!
  • 【HTTP通信:生活中的邮局之旅】
  • docker的安装和简单使用(ubuntu环境)
  • 【2026第十三季】国考行测模考大赛复盘
  • 如何解决windows端口被占用
  • Python数据分析案例72——基于股吧评论数据的情感分析和主题建模(LDA)
  • 数字化转型的“暗礁“与突围:失败案例深度复盘
  • 联合体和枚举类型
  • WebUI可视化:第4章:Streamlit数据可视化实战
  • uni-app 小程序中的定位问题 以及 页面安全距离
  • 【前端】如何检查内存泄漏