[编译原理]-----第四章 语法分析

1. 自顶向下分析概述

​ 从分析树的根节点向叶节点方向构造分析树,可以看做是从文法开始符号推导出词串的过程

(1). 最左推导

​ 在最左推导中,总是选择每个句型的最左侧非终结符进行替换.

(2). 递归向下分析

​ 计算机程序实现的自顶向下分析的通用形式.

​ 每层递归对应一个非终结符(相当于遍历一个树的子节点,非终结符对应的是非叶子节点)

​ 搭配回溯使用

2. 文法转换

(1). 消除直接左递归

​ 当同一个非终结符的多个候选式存在相同的前缀时,会导致回溯(最终只会匹配其中一个)

​ 将含有 A->Aα 形式产生式的文法称为是直接左递归的.使用最左推导的递归向下分析可能会无限递归.

A -> Aα | β ===> A -> βA' 其中 A' -> αA' | ε

​ 因为是左递归,所以都是A->βααααααα......这样的,那么把第一个β抽取出来,再新建立一个A'->αααααα....就可以替换左递归.其中后面新建立的这个式子是右递归的.

(2). 消除间接左递归

​ S -> Aa | b

​ A -> Ac | Sd | ε

​ 这里的递归是间接存在于两条文法中的.

​ 将两个式子代入,编程直接左递归,然后消除直接左递归

[图片上传失败...(image-8e7d85-1582632405566)]

1573666379351

(3). 提取左公因式

[图片上传失败...(image-6c6cf2-1582632405566)]

1573666482505

​ 推迟决定,等待获取到了足够的信息在做出选择.

3. LL1文法

(1). 预测分析法

​ 在自顶向下的分析中,可能会遇到回溯.如果能够预先读取几个字符,就可以避免很多回溯.

​ LL1就是使用预先读取一个字符的预测分析技术的文法.

1). 工作过程

​ 从文法开始符号出发,每一步根据当前句型的最左非终结符和当前输入符号,选择正确的产生式,所选出的产生式必须是唯一的.

​ 文法最好满足的条件,即S_文法(简单的确定性文法):

  • 每个产生式的右部都以终结符开始(每一次推导都能确定一个字符)
  • 同一个非终结符的各个候选式的首终结符都不同.(每读入一个字符都决定依次推导,不会有回溯)

​ 在推导过程中,如果当前的文法不匹配,能否使用空产生式取决于当前输入的符号是否在使用空产生式后能够被接收.(也就是跳过空产生式能否匹配)

4. FIRST集和FOLLOW集

(1). 非终结符的后继符号集

​ 非终结符A的后继符号集就是指可能在某个句型中紧跟在A后面的终结符a的集合.记为==FOLLOW(A)==

(2). 产生式的可选集

​ 产生式 A -> β的可选集是指可以选用该产生式==进行推导时对应的输入符号==的概念.记为==SELECT(A->β)==

  • SELECT(A->aβ) = {a} (这里就是明显的可以接收字符a)
  • SELECT(A->ε) = FOLLOW(A) (这里是非终结符A选择推导为空产生式的条件就是遇到了可以接收的终结符)

q_文法:

  • 每个产生式的右部要么是ε,要么以终结符开始
  • 相同左部的产生式有不想交的可选集

(3). 串首终结符集

​ 作为串首的第一个符号,并且是终结符.

​ 给定一个文法符号串α,α的串首终结符集==FIRST(α)==被定义为可以从α推导出的所有串首终结符构成的集合.

​ (α等价的所有串的首字符)

​ 如果α能推出空串,那么空串也在FIRST集中.

​ 那么,是不是意味着,如果FIRST(α)中不包含空串,那么SELECT(A->α) = FIRST(α).(如果该串A通过一个文法一定能推出来一个串,那么使用该文法记性推导时索要输入的字符一定是α的等价串的首字符.....好像废话了)

​ 如果FIRST(α)中包含空串,那么SELECT(A->α) = ( FIRST(α)-{ε} ) ∪ FOLLOW(A)(如果这个串A通过一个文法可能会推出空串,那么需要读入一个α等价串首字符-空字符 和 A后面可以接受的任意一个字符,也就是直接将A推导为空串)

​ 总结:有文法A->α, 如果α可以推出空串,那么本次推导可以输入α等价串的首字符(除去空串)和A的任意后继终结符(直接将A推导为空串).如果不能推出空串,那么只能输入α等价串的首字符.

(4). LL1文法

​ 文法G是LL(1)的,当且仅当G的任意两个拥有任意左部的产生式A -> α | β满足以下条件:

  • 如果α和β都不能推导出空串,那么FIRST(α)∩FIRST(β) = Ø(不相交)
  • α和β至多有一个能推出空串(FOLLOW(A)部分会相交)
  • 如果α能推出空串,那么FIRST(β)∩FOLLOW(A) = Ø(原因同上)

(5). 预测分析表

1). 求FIRST集

​ 根据定义,求出等价串的所有首字符即可.

2). 求FOLLOW集

​ 根据定义求出所有跟随的字符,这里如果作为产生式的最右侧出现,要添加结束符$.

​ 适当的参考FIRST集

3). 求SELECT集

​ 右部的FIRST集,如果右部能推出空串,还要加上左部的FOLLOW集.

4). 预测分析表

[图片上传失败...(image-aec080-1582632405566)]

1573677228209

​ SELECT集的含义是非终结符能通过读取那个字符通过产生式进行推导,这里装换为非终结符通过那个产生式读取某个符号.

5. 递归的预测分析法

6. 非递归的预测分析法

7. 预测分析法中的错误处理

8. 自底向上的分析概述

​ 从分析树的底部叶节点向顶部根节点方向构造分析树.

​ 可以看做是将输入串归约为开始符号的过程.

(1). 移入-归约分析

​ 最右归约.

​ 使用栈,将出入串输入到栈中,每次入栈后判断栈顶的n个元素是否是某个产生式的右部,如果是,进行归约.直到栈中包含开始符号且输入缓冲区为空.

​ 所选栈顶的字符串要尽可能长,保证推导的唯一性.

9. LR分析法概述

​ LR文法是最大的,可以构造出移入-归约语法分析器的文法类.

​ LR(k)分析是指需要提前查看k个符号,一般k=0或者1是有实践意义的.

(1). 基本原理

[图片上传失败...(image-b9e62f-1582632405566)]

1573712334292

​ 当输入栈中没有字符时,为移进状态.

​ 当输入栈中的字符不能进行归约,需要继续输入字符时,为待约状态.

​ 当输入栈中的字符符合某个产生式的右部时,为归约状态.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 语法分析的基本任务就是根据给定的文法识别数据中的各类短语并构造它的分析树。如果输入串的各个单词恰好自左向右地分布在...
    衣忌破阅读 1,313评论 0 0
  • 自顶向下语法分析方法 什么叫确定:两个确定:①确定对最左的非终结符进行替换(最左推导)②对于同一个非终结符,确定一...
    getianao阅读 1,619评论 0 1
  • 一、绪论 编译程序 功能:高级pro转低级目标pro 形式编译执行转obj在执行,效率高跨平台性差解释执行逐行解释...
    rh_Jameson阅读 3,549评论 0 10
  • 要想分析器以预测分析法的方式去工作,我们希望文法最好符合S_文法。预测分析法的工作过程: 从文法开始符号出发,在每...
    衣忌破阅读 1,708评论 0 0
  • 大学期间的笔记补全。编译原理内容太多分几次。课本《编译原理》第三版,陈火旺等编著。笔记总目录:一、引论二、高级语言...
    嘟噜嘟噜啪阅读 734评论 0 1