编译原理复习笔记-自上而下的语法分析

一般方法

对于输入序列,进行左推导,得到一个合法句子或者非法结构,是一种试探+回溯的方法,自上而下建立输入序列的分析树。

存在的问题

  1. 公共左因子,造成大量回溯。
  2. 左递归,造成死循环。

解决

  1. 消除直接左递归。
方法:首先,整理A产生式为如下形式:
    A→ Aα1|Aα2|...|Aαm|β1|β2|...|βn
    其中αi非空,βj均不以A开始。用下述产生式代替A产生式
    A → β1 A' |β2 A' | ...|βn A'   
    A'→ α1 A' | α2 A' | ... | αm A' |ε
    若αi为空,则形成一个有环的A产生式

  1. 消除左递归。

核心思想:将不是直接左递归的符号右部展开到其他产生式

关键步骤:合理排序非终结符:A1,A2,...,An;
    用Aj→δ1|δ2|...|δk右部替换Ai→Ajγ中的Aj,得到Ai→δ1γ|δ2γ|...|δkγ;
    消除Ai产生式中的直接左递归;
  1. 提取左因子(类似于有限自动机的确定化)
方法  重复过程,直到所有A产生式候选项中不再有公共前缀:
    重排A产生式:A→αβ1|αβ2| ...�|αβn|γ;
    并用 A→αA'|γ 和 A'→β1|β2| ...|βn取代原A产生式。

注意:既有左递归,又含左因子,先消除左递归(左递归可以看作左因子的一部分)。

递归下降分析法

限制:文法不能有左递归和公共左因子,必须先消除。

方法

  1. 构造文法状态图并化简
  2. 将转换图转化为EBNF表示。
  3. 从EBNF构造子程序。

具体操作

  1. 构造状态转换图并化简
    • 为每个非终结符A建立对应的状态转换图,也就是初态到终态的路径。
    • 化简原则
      1. 标记为A的边课等价为标记ε的边转向A转换图的初态;
      2. 可以合并:ε连接的两个状态(FA的确定化思想),标记相同的路径,不可区分的状态(DFA的最小化)
  2. 文法的拓展BNF(EBNF)表示
    • {}:重复任意次数。
    • []:可选择
    • |:或关系
    • ():用于改变优先级。
  3. 构造递归下降子程序
    每一行是一个完整的执行语句。
    1. 循环,包含{}的程序
    语句:E → T { ( + | - ) T }
    procedure E is
    begin
     T;
     while lookahead∈(+|-)
     loop match(lookahead); T;
     end loop;
    end E;
    
    1. 多类匹配,包含或的程序。
    语句:F → ( E ) | id | num 
    procedure F is
    begin
       case lookahead is
        '(' : match('('); E; match(')');
        id  : match(id);
        num : match(num);
        others : error("syntax error2");
       end case;
    end F;
    

预测分析法

核心:预测分析表+驱动器(模拟算法),预测分析表的构建。
LL,符号栈,输入记号流。

方法

  1. 如果已知当前栈顶是非终结符,下一输入终结符,预测分析表指示了下一步动作。
  2. 从初始状态到分析成功或者出错。一个状态(PPT中写作格局)是三元组(栈内容,剩余输入,改变格局的动作)。
    改变格局的动作
    1. 匹配终结符,则前往下一个。
    2. 展开非终结符,逆序放入符号栈。
    3. 成功:栈顶和剩余输入都是#。
    4. 出错:调用错误恢复例程。
  3. 驱动器算法(非递归的预测分析)
  4. 用预测分析器分析句子(及一个三元组(栈,剩余输入,动作)的顺序表示。

关键:构造预测分析表。

  1. 构造fIRST集合与FOLLOW集合,对于每个非终结符而言。
  2. 根据两个集合构造预测分析表。

文法符号序列α的FIRST集合为:
FIRST(α)={ a |α=*>a...,a∈T},若α=*>ε,则ε∈FIRST(α)

非终结符A的FOLLOW集合如下:
FOLLOW(A) = { a |S=*>...Aa...,a∈T}, 若A是某句型的最右符号,则#∈FOLLOW(A)。

通俗理解:FIRST(e)集合就是从e开始可导出的文法序列的开头终结符。Follow(e)集合就是从开始符号可导出的所有含e的文法序列中e之后的终结符。

求这两个集合的算法,需要来理解,first往后多步查看,follow复杂一点。

FIRST集合自下而上计算,FOLLOW集合自上而下计算。

方法 应用下述规则:

1. 加入#到FOLLOW(S),其中S是开始符号,#是输入结束标记
2. 若有产生式A→αBβ,则除ε外,FIRST(β)的全体加入到FOLLOW(B)。
3. 若有产生式A→αB或A→αBβ而ε∈FIRST(β),则FOLLOW(A)的全体加入到FOLLOW(B)。
对3的理解:因为 ε∈FIRST(β),B成为A产生式最右的文法符号,
所以对任何a∈FOLLOW(A),均有a∈FOLLOW(B),
反之不然,因为FIRST(β)不一定只有 ε。

构造预测分析表。

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

推荐阅读更多精彩内容