编译原理04-自顶向下语法分析方法

学习目标

  • 明确语法分析在编译过程所处的阶段和作用

  • 理解确定的自顶向下的语法分析法的思想

  • 了解并掌握表驱动LL(1)分析程序

  • 了解并掌握递归下降LL(1)分析程序

4.0 相关问题

1、什么是语法分析?
  • 识别由词法分析给出的单词符号串是否是给定文法的正确句子(程序)
2、什么是自顶向下分析法?
  • 面向目标的分析方法
  • 也就是从文法的开始符号企图推导出与输入的单词符号串完全相匹配的句子,若是输入串是给定文法的句子,则必能推导出,反之则必然出错。
3、在自顶向下的分析过程中,存在的问题是什么?
  • 需对文法有一定限制
4、什么是确定的自顶向下分析法?
  • 定义: 确定的自顶向下分析方法,是从文法的开始符号出发,考虑如何根据当前的输入符号 (单词符号)唯一地确定选用哪个产生式替换相应非终结符以往下推导,或如何构造一棵相 应的语法树。

  • 特点:实现方法简单、直观,便于手工构造或自动生成语法分析器,是最常用的语法分析方法之一

  • 区别:自顶向下的不确定分析方法是带回溯的分析方法(4.4节有提及)

5.存在的问题

当一个非终结符号对应若干个规则时,选择哪个规则的右部对该非终结符号进行展开呢?

例如:如果要被代换的最左非终结符号是U,且有n条规则:U::=A1|A2|…|An,那么如何确定用哪个规则的右部去替代U?

4.1 语法分析技术概况

img

  • 第四章:自顶向下的确定分析

  • 第五章:自底向上的算符优先分析

  • 第六章:自底向上的LR分析

练习题1:自定向下推导

img

img

定义4.1:First集的定义

设G=(VT,VN,S,P)是上下文无关文法,其中img

img

可以根据当前的输入符号是属于哪个产生式右部的首符集而决定选择相应产生式进行推导。

定义4.2:Follow集的定义

设G=(VT,VN,S,P)是上下文无关文法,img,S是开始符号

img

当文法中存在推导形如:img时,如果当前的字符属于Follow(A),则用空字符串取代A的出现。

定义4.3:Select集的定义

img

结论:文法G是LL(1)文法的充要条件是,对于每个非终结符U有多个不同的产生式,比如为U→α和U→β,满足:

img

练习题:

img

(1)求出所有非终结符的First集

(2)求出所有非终结符的Follow集

(3)求出所有产生式的select集

(4)判断此文法是否是LL(1)文法?

4.2 LL(1)文法的判别

  • 当需要选用自顶向下分析技术时,必须判别所给文法是否是LL(1)文法

4.2.1判别算法:

1、计算非终结符是否能推出ε

2、构造First集

3、构造Follow集

4、构造Select集并作判别

img

Step1:计算First(X)集

对每一文法符号X计算First(X)

  • 若XVT,First(X)={X}

  • 若XVN ,且有产生式Xa…P,aVT ,则aFirst(X)

  • 若XVN,且有产生式Xε,则 ε First(X)若XVN,有产生式XY1Y2…Yn,且Y1,Y2,…,Yi任意一 个文法符号,当Y1,Y2,…,Yi-1ε,则

First(Y1)-{ε},First(Y2)-{ε},…

First(Yi-1)-{ε}, First(Yi)都包含在First(X)中。

当Yi imgε(i=1,2,…n), 将{ε}并入First(X)中。 反复使用上述步骤,直到每个符号的First不再增大。

img

计算First(α)集

img

img

Step2:计算Follow(X)集

1:对所有X∈VN,令Follow(X)={};对开始符S, 令Follow(S)={ # };

2:若有产生式Y→αXβ, 如果img 则: Follow(X)= First(β) 否则 Follow(X)=(First(β)-{img}) ∪Follow(Y)

3:重复2和3,直至对所有X∈VN,Follow(X)收敛为止。

img

Step3:计算Select集

img

img

img

结论:如果相同左部产生式的Select交集都是空集,则该文法是LL(1)文法。因此,该文法是LL(1)文法。

4.3 貌似做了两个习题

书本4.3没讲

5.17 好像是讲了程序设计

img

5.24

img在这里插入图片描述

img

4.4 预测分析法(LL(1)分析法)

img

4.4.1 构造预测分析表

img

[1]初始化: Stack :=empty;Push(#S);

[2]读下一个输入符: Read(a);

[3]若当前格局是( #, # ),则成功结束; 否则转下;

[4]设当前格局为(… X, a…),则

img

4.4.2 LL分析实例:

img

符号串 i * i 的LL[1]分析过程:

img

img

img

4.4.3 预测分析程序流程图

img

4.3 文法等价变换

  • LL(1)文法不含左公共因子

某个非终极符A有如下的两个产生式:

A→ αβ,A→ αγ (即有左公共因子)

  • LL(1)文法不含左递归 某个非终极符A有直接左递归产生式:

A→ Aα | …

Step1:消除左公共因子

img

img

img

Step2:消除左递归

img

img

img

img

4.5 递归下降分析法

递归下降法(Recursive-Descent Parsing)

对每个非终结符按其产生式结构产生相应语法分析子程序。

  • 终结符产生匹配命令
  • 非终结符则产生调用命令

文法递归相应子程序也递归,所以称这种方法为递归子程序方法递归下降法

img

img

img

img

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我,Zack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值