实验4 基于预测分析表法的语法分析程序_第四章 语法分析笔记

本文详细介绍了语法分析的任务和上下文无关文法的基本概念,包括最左推导、最右推导以及文法的二义性。讨论了正则表达式与上下文无关文法的关系,并重点讲解了消除左递归和提取左公因式在提升分析效率中的作用。此外,阐述了LL(1)文法和LR(k)文法分析表的构造方法,对比了LL与SLR分析表的区别。
摘要由CSDN通过智能技术生成

词法分析的任务

  • 分析从词法分析获得的token在程序中扮演什么juese
  • 检查语句或者程序是否符合程序语言的语法。

一个上下文无关文法(CFG)组成部分

  • 终端符号(terminal)的集合T
  • 非终端符号的集合N
  • 唯一的开始符号S
  • 产生式

为什么CFG的能力比正则表达式强?

因为CFG允许递归定义

练习:

用上下文无关文法定义下列语言。

(1)

S->0S1|01

(2)只含有0和1的回文串

(3)只含有(和)的匹配括号串

最左推导:每次推导都替换最左边的非终端符号

最右推导:每次推导都替换最右边的非终端符号

文法的二义性:如果对于一个文法,存在一 个句子,对这个句子可以构造两棵不同的分析树(一般来说如果有对称的推导式,那么这个文法一般来说就是二义性的)

例子:

有两种推导方式

717feb78de3dfa2bd467a01e5362d990.png

每个能用正则表达式的语言一定能用上下文无关文法来表示,反之不成立。

正则表达式(NFA和DFA)与右线性文法的表达能力是等价的。

因为一个左递归的文法会使它的递归下降语法分析器进入无限循环,所以我们需要进行左递归的消除。

消除立即左递归

4cc1cdd597587cb9378011351ce968ee.png

消除左递归

1e771f4e8395f9cdaf9caa4de1acc8c3.png

例子:

7e6ecbda145231afaea3bbbf0426e4bd.png

提取左公因式:找出生成式中的最长公共前缀,合并之,不同后缀部分用一个新的非终端符号表示

为什么需要提取左公因式:因为全部回溯的效率太低了。(剪枝)

但是单纯的提取左公因式的效果还是太局限了。

就我看来,加上了预测表其实就是剪枝了。

对于LL(1)文法(第一个L是指从左到右,第二个L是指产生最左推导)

那么如何构造这个预测表呢?

需要用到两个函数

first(A) 是指可由 A 导出的串的首终端符号的集合(含 ε)

FOLLOW(A) 定义为可能紧跟在 A 右边的终端符号的集合,不含 ε,但包含字符串结束符号 $

First()的求法:

e5621700a202e09ccecff5f665239908.png

例子:

Follow()的求法:

ce01616ee6678d1a98a75d4e4f5120a9.png

例子:

如何构造预测表呢?

4478de0959d1779bcd54432fbd96a0bd.png

解释一下到底什么是LL(1)?

对于任意的生成式

  • 不相交
  • 如果
    中,那么
    是不相交的集合。如果
    中类似。

LR语法:目前最流行的自底向上语法分析器都基于所谓的LR(k)的语法分析的概念。

如何建立SLR的表呢?

这里想说一下LL预测分析表和SLR语法分析表的区别:

  • LL分析表是按照当前的非终结符号和输入符号来确定转换
  • SLR是根据当前栈顶和输入符号来确定是移入符号还是规约。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值