语法分析--要点、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文法判定--确定性
posted @   guanyubo  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示