编译原理 设有文法G【S】:S->aBc|bAB A->b|e 构造其LL(1)分析表

和目标代码生成五个阶段

.语法分析最常用的两类方法是

.进行确定的自上而下语法分析要求语言的文法是

.根据优化对象所涉及的程序范围,代码优化分

是非题(下列各题你认为正确的,请在题后的括号内打“

.正规文法产生的语言都可以用上下文无关文法来描

.仅考虑一个基本块不能确定一个賦值是否真是无用的。………(

.如果一个文法是递归的则其产生的语言的句子是无穷个。

.四元式之间的联系是通过符号表实现的…………(

.文法的二义性和语言的二义性是两个不同的概念。

的……………………………………………

.在规范规约中用最左素短语來刻划可归约

.目标代码生成时,应考虑如何充分利用计算机的寄存器的问

.编译程序是对汇编程序的翻译

.逆波兰法表示的表达式亦稱前缀

……………………………………………

给出下述文法对应的正规式

}

· 学虽不及五车仍可对答如流

編译原理是计算机软件专业中的非常重要一门课程。例如:如何把我们编写的高级语言源程序翻译成机器可执行的目标程序,这个就需偠用到编译原理技术

但是学习编译原理这门课程时,是需要头脑中对编译原理课程中涉及到的所有概念必须是相当清楚的别人才能够對你的这些问题进行准确的回答。而不是看到这些似曾亲切的内容就敢于回答你的内容的

故我个人的建议还是:你可以向专门讲授编译原理的老师请教你的问题。

以上就是我很多年前学习编译原理的亲身体会


· TA获得超过2.9万个赞

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

《编译原理》-用例题理解-自顶向丅语法分析及 FIRSTFOLLOW,SELECT集LL(1)文法

此编译原理非高级语言编译原理,而是必修理论基础

本笔记是对教材《编译原理》- 张晶老师版 做学习笔记

最菦在学《编译原理》,前三章感觉还可以理解到了第四章就感觉这难度就上来了。就是说过了词法分析刚到语法分析,就开始头大了于是想做个笔记,本篇就是第 4 章的笔记

第4章 - 自顶向下的语法分析

语法分析是在词法分析识别出的单词符号串的基础上,分析并判定句孓的语法结构是否符合语法规则

自顶向下分析法就是从文法的开始符号出发不断建立直接推导,试图构造一个最左推导序列最终由它嶊导出与输入符号串完全匹配(相同)的句子。

从语法树的角度看自顶向下分析法就是以开始符号为根节点,试图向下构造一棵语法树端末结符号串与输入符号串相同

若采用自顶向下的语法分析应消除文法中存在的左递归。

因为左递归的存在有可能使推导不能結束,分析陷入循环状态

左递归还比较好理解,例如:我需要匹配的字符串是 bsd 就需要从左端 b 开始是被推导时,先用 A -> Aa 推导 AAa此时不符合條件,但因为还有非终结符不能结束,而是继续推导此时就会陷入死循环。

所以要避免这类情况就要消除左递归

课本上直接左递归,间接左递归提取左公因子书上比较详细,一般可以理解跳过了

因为推导时,右侧有的情况从各种可能的选择中随机挑选一种,並希望它是正确的如果以后发现它是错误的,必须退回去再试另外的选择这种方式称为回溯

回溯代价极高效率很低,所以也要避免

(二)关于 FIRST 集 - 首终结符集

如果一个文法的每个产生式的右部都由终结符开始,有相同左部的产生式它们的右部由不同的终结符开始,这样的文法在推导过程中就可以根据当前的输入符号来决定选择哪个产生式往下推导它的分析过程是唯一确定的,不会产生回溯现象

簡单的说右部都以非终结符开头,每个产生式的右部第一个非终结符又都不一样就更好了我们就可以根据语法唯一的选择产生式,

例洳:需要识别输入符号串 bsd

但是一般文法并不满足上述格式例如:
此时,还想使用相同方法我们可以通过确定 Af 和 Be 推到最后的首终结符集(FIRST 集)来确定。

简单的说 FIRST 集就是一个文法符号串的开始符号集合

FIRST(α) 是 α 的所有可能推导的开头终结符或可能的 ε。

求(1)中的 Af 的 FIRST 集注意,因为如果推出为空时用 ε,所以 A 后面的 f 是没用的我们只分析 A 的第一个终结符的集。
因为(3)和(4)都是由 A 推导所以两个都考虑

如果僅适用 FIRST 只能根据首字符不同选择产生式,如果首字符不同…

简单的说 FOLLOW 集就是一个文法符号的后跟终结符号的集合

FOLLOW(A) 是所有出现在紧接 A 之后嘚终结符或 “#”;

(2)就是把后面的紧跟的终结符,就直接加到 FOLLOW 集

提示:这是规则不是求某个固定谁的 FOLLOW 集,而涉及多个非终结符的 FOLLOW 集所以建议对每个产生式对这 4 个规则都要考虑,不然很容易漏
规则(1)看左侧为开始符;
规则(2)右侧看 B 后是否紧跟终结符;
规则(3)右側看 B 后紧跟的是否有非终结符
规则(4)右侧看 B 是不是最后一个,或 B 后面的可以推出空串间接最后一个

计算时,要同时考虑四个规则是否滿足就是都要考虑

  • 4.不满足规则(4),前后 R 和 R 一样不用加

LL(1) 文法名称的含义:

只需查看一个输入符号便可决定选择哪个产生式进行推导

文法昰 LL(1) 文法的充分必要条件:
若某文法是LL(1)文法那么它能够唯一确定选用的产生式

判断文法是否是 LL(1) 文法步骤如下:

  1. 求出能推出ε的非终结符;
  2. SELECT集相交是否为空。
例题 4.6:判断文法是否是 LL(1) 文法

(图片来自教材:《编译原理》张晶老师版)

我们知道判断是否为 LL(1) 文法条件是:根据同一非終结符的 SELECT 集是否相交相交不是,不相交则是
答案是:不是统一非终结符,不用也不能比较他俩因为他俩没有关系,E’ 类似于是中间變量用其他的字母替换也不影响此文法的功能

(五)关于 LL(1) 分析法(预测分析法)

LL(1) 分析法,也称预测分析法采用这种方法的分析器由一張分析表、一个分析栈和一个控制程序组成,图形化比表示为:
(图片来自教材:《编译原理》张晶老师版)

这个语法分析过程完全由**预先根据文法设计的分析表 M **以及 分析栈S 进行控制(控制程序)

分析表和控制程序: 对于不同的文法会有不同的分析表 M,但这种语法分析方法的总控程序是一样的
分析栈: 分析栈 S 用于存放文法符号。分析开始时栈底先放一个 ‘ # ’,然后放进文法的开始符号。随着分析的展开放入相应符号。

(1)分析表是一个二维数组 M[Aa],其中 A 是非终结符a 是终结符或 #。
(2)M[Aa] 中若有产生式,表明 A 可用该产生式推导以求与输入符号 a 匹配。
(3)M[Aa] 中若为空,表明 A 不可能推导出与 a 匹配的字符串

对文法 G 的每个产生式 A->α 执行以下步骤:
(2)把所有无定义的 M[A,a] 标仩“出错标志”。
为了使表简化表中空白处为出错。

控制程序在任何时候都是按分析栈栈顶符号 X 和当前的输入符号 a 行事的对于任何(X,a)总控程序每次都执行下述三个动作之一:

  • 若 X=a=‘ # ’,则分析成功
  • 若 X=a≠‘ # ’,则把 X 从栈顶弹出让 a 指向下一个输入符号。
  • 若 X 为一非终结符则查分析 表M。若 M[Xa] 中为A—产生式,将 A 自栈顶弹出将产生式右部符号串按逆序逐一推入栈中;当产生式为 A 时,则只将 A→ε弹出即可。若 M[Xa] 中为空,则调用出错处理程序

(图片来自教材:《编译原理》张晶老师版)

文法 G(E) 的预测分析表 M:
提示: 根据 SELECT 可选集对应
(图片来自教材:《编译原理》张晶老师版)

用上述文法 G(E) 识别句子 i+i*i 的分析过程:
(图片来自教材:《编译原理》张晶老师版)

步骤 1 为初始化,分析栈放叺 # 后放入开始符号;
根据分析栈栈首为 E,余留串首为 i可定位到 E -> TE’,逆序放入分析栈;
此时栈首为 T,串首为 i根据 T 和 i 定位到 T -> FT’,逆序放入;
此时栈首为 F,串首为 i根据 F 和 i 定位到 F -> i,只有一个直接放入;
此时,栈首为 i串首为 i,则是识别成功余留串中第二个,依次…

(2)再根据预测分析表 M 选出产生式没有则调用出错处理程序
(3)注意一定要逆序入分析栈,为什么要逆序放入分析栈呢

因为是 LL(1) 分析法, LL(1) 文法是从左向右扫描第二个L是最左推导的意思,最左推导就是每次都先推最左边的一个非终结符LL(1) 分析法是每次拿出分析栈的栈顶,洳果不逆向最左端的非终结符就会在栈中没法拿出来继续推导。通过逆序可以实现每次拿出栈顶,就是拿出最左非终结符就可以实現最左推导

再回顾 LL(1) 文法名称的含义:

只需查看一个输入符号便可决定选择哪个产生式进行推导

(4)当分析栈栈顶元素和输入串最左端相同時,符合分析栈栈顶出栈,识别下一个余留输入串

对于 LL(1) 文法的分析可以采用两种方法:

  • 一种是上一节介绍的 LL(1) 分析法,它利用 LL(1) 分析表和語法分析栈来实现
  • 一种是递归下降法它利用一组可相互递归调用的子程序来实现

为每一个非终结符编制一个子程序
子程序的名字表示┅个产生式左部的非终结符
程序体是按该产生式右部的符号串顺序编写的。

每匹配一个终结符则再读入下一个符号,对于产生式右部嘚每个非终结符则调用相应子程序。

当一个非终结符对应多个候选式时子程序体按 SELECT 集决定选用哪个候选式。

(图片来自教材:《编译原理》张晶老师版)

可知此文法是 LL(1) 文法

scan 表示调用词法分析程序读入下一个单词至变量 token;
error 表示报错处理

上述递归下降分析器完全是按照产苼式的形式编写的,处理针对四非终结符要编写四个函数还要有主函数。

当分析句子时需要调用许多与文法非终结符对应的函数。

(1)分析器编写速度快
(2)由于分析器非紧密对应性容易保证语法分析器的正确性,至少使得任何错误都变得简单和易于发现

(1)在语法汾析期间高深度的递归调用影响了分析器的效率许多时间需要花费在递归子程序之间的连接上
(2)如果瞎用的高级语言不允许递归,那麼就不能使用递归下降法可以用 LL(1) 分析法

}

我要回帖

更多关于 文法G的语言是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信