语法分析--要点、top_down、bottom_up
语法分析的任务:识别句子,确定句子的类型
对于不同类型的语句,后续的语义分析器将执行不同的语义动作
语法分析技术分类 (前提:CFG无二义性)
- top_down
- bottom_up
top_down
LL1(文法)
top_down步骤
- 消除歧义--无二义性
- 文法改造
- 消除左递归
- 提取左公因子
- LL(1)文法判定--确定性
如何实现自顶向下的分析?
- 递归下降分析法
什么样的文法能够实现确定的自顶向下分析?
- LL(1)文法
如何实现确定的自顶向下分析?
- 递归的方式:基于预测分析表对递归下降分析法进行扩展
- 非递归的方式:基于预测分析表构造自动机
递归的预测分析
非递归的预测分析
bottom_up
top_down | bottom_up | |
---|---|---|
通用框架 | 递归下降分析 | 移入归约分析 |
主要问题 | 候选式冲突 | 移入-归约冲突、归约-归约冲突 |
关键问题 | 如何正确选择候选式 | 如何正确识别句柄 |
移入-归约分析器的格局
如何正确地识别句柄?——LR 分析法
等价项目
LR 分析器(自动机)的总体结构
LR分析表结构
如何构造给定文法的LR分析表?
- LR(0)分析
- SLR分析
- LR(1)分析
- LALR分析
LR(0)分析
右部某位置标有圆点的产生式称为相应文法的一个LR(0)项目(简称为项目)
A→ α1·α2
LR(0)自动机
LR(0)自动机(分析表)构造方法
句柄都是相对一个句型而言的
LR(0)分析只关心构成某个成分A的各个子成分是否都已出现(如果都出现了就进行归约),但并没有考虑这个成分A是否是待分析句子中的一个成分
- 事实上,如果A不是待分析句子中的一个成分,那么即使把它归约出来也是徒劳,在后续分析过程中迟早会发现分析进行不下去的
因此应该将句柄的识别放在句型这样一个上下文环境中考虑
受技术上的限制,考虑整个上下文实现起来很困难,因此,LR(1)分析只考虑成分A下文的第1个(终结)符号
规范LR(1)项目
将一般形式为 [A→α·β, a]的项称为LR(1)项,其中A→αβ是一个产生式,a是一个终结符(这里将$视为一个特殊的终结符)它表示在当前状态下,A后面必须紧跟的终结符,称为该项的展望符(lookahead)
- 在形如[A→α·β, a]且β ≠ ε的项中,展望符a没有任何作用
- 但是一个形如[A→α·, a]的项在只有在下一个输入符号等于a时才可以按照A→α 进行归约
- 这样的a的集合总是FOLLOW(A)的子集,而且它通常是一个真子集
各种LR分析表构造方法的不同之处在于归约项目的处理上
bottom_up步骤
- 消除歧义--无二义性
- LR文法判定--确定性
Do not communicate by sharing memory; instead, share memory by communicating.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)