【编译原理】第4章 LL(1)文法及其分析程序

4 LL(1)文法及其分析程序


在这里插入图片描述
语法分析任务:在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则

分析算法分类(语法分析方法)

  • 自上而下分析法:从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的最左推导。
  • 自下而上分析法:从输入符号串开始,逐步进行归约(最右推导的逆过程),直至归约到文法的开始符号。

一、自顶向下分析的问题

自上而下分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程

自上而下语法分析的问题
出现一些产生式左部相同的问题,什么文法可用确定的自顶向下分析(左递归、回溯)
在这里插入图片描述

二、LL(1)文法

LL(1):L从左至右扫描 L最左推导 1向右看一个符号

1、FIRST集、FOLLOW集和SELECT集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、LL(1)文法定义及判断步骤

LL(1)文法:所有产生式(左部相同)SELECT集的交集为空集,则为LL(1)文法
在这里插入图片描述
判断LL(1)文法步骤
在这里插入图片描述
判断LL(1)文法——例题2
文法G[S]为:
S → AB | bC
A → ε \varepsilon ε | b
B → ε \varepsilon ε | aD
C → AD |b
D → aS | c

1)判断能否推出 ε \varepsilon ε

2)求FIRST集
在这里插入图片描述
3)求FOLLOW集
在这里插入图片描述
4)求SELECT集(凡是左部有相同的)
在这里插入图片描述

LL(1)分析程序实现:递归子程序、预测分析器

三、非LL(1)文法的改造

对于某些非LL(1)文法→LL(1)文法之间的等价变换
提取左公共因子;消除左递归

提取左公共因子
在这里插入图片描述
在这里插入图片描述
消除左递归
在这里插入图片描述
在这里插入图片描述

四、判断LL(1)文法的充要条件

LL(1)文法不确定的因素有3个:①存在左公共因子 ②存在左递归 ③A→ ε \varepsilon ε
当无左公共因子、左递归和A→ ε \varepsilon ε 时,则为LL(1)文法,即LL(1)文法的充要条件是:
①无左公共因子 ②无左递归 ③无A→ ε \varepsilon ε (A代表非终结符)

五、LL(1)文法分析程序

LL(1)分析程序实现:递归子程序 预测分析器

使用自上而下分析方法的前提:消除左递归、提取公共左因子

1、递归子程序法

递归子程序法原理
对文法中每个非终结符都编写出一个子程序,以完成该非终结符所对应的语法成分的分析和识别任务。

每个非终结符号的子程序功能:用该非终结符的产生式规则右部符号串去匹配输入串。
注: ε \varepsilon ε 可匹配任何终结符,但搜索指针不前进。
在这里插入图片描述
在这里插入图片描述

递归下降分析程序构造

文法的另一种表示法
在这里插入图片描述  在这里插入图片描述
在这里插入图片描述

2、预测分析器

预测分析程序模型
在这里插入图片描述


LL(1)分析程序由预测分析程序、先进后出栈和预测程序表3个部分组成,其中只有预测分析表与文法有关,而分析表又可用一个矩阵 M M M(或称二维数组)表示。

  • 矩阵的元素M[A,a]中的下标A表示非终结符,a为终结符或句子括号#
  • 矩阵元素M[A,a]中的内容是一条关于A的产生式,表明当用非终结字符A向下推导时,面临输入符a时所采取的候选产生式。
  • 当元素内容无产生式时,则表明A为左部向下推导时遇到了不该出现的符号,因此元素内容转向出错处理的信息。

预测分析程序的工作过程
在这里插入图片描述
上图(流程图)中符号说明如下:

  • ‘#’是句子括号,即输入串的括号
  • ‘S’是文法的开始符号
  • ‘X’是存放当前栈顶符号的工作单位
  • ‘a’是存放当前输入括号a的工作单位

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

bingo~   ✨ 每个人的心中都应该是整个世界

  • 21
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值