编译-第12章-语法分析(二)(重要)

在语法分析(一)中我们指出:
image

自顶向下分析法 LL(1)分析法

最左推导

下推自动机(2型文法)比有穷自动机多了一个栈

left to right and leftmost derivation,1表示的是每次只用往下读一个字符

一个LL分析器包含一个总控程序,一张分析表和一个符号栈组成
image

  • 输入串即待分析的符号串,在输入串的末尾放置一个#来表示输出串的结束,#不属于文法符号
  • 分析表M可用一个矩阵来表示, $M=[A,a] = A::=\alpha _i\ or\ error$

执行程序

  1. 把#和文法识别符号E推进栈中,并读入输入串的第一个符号a,重复下属过程知道正常结束或出错
  2. 根据站定符号X和当前输入符号a,执行如下操作:
  3. 如果 $X \in V_t = a = \#$,程序分析成功
  4. 如果 $X \in V_t = a != \# $,X弹栈,读入下一个符号
  5. 如果 $X \in V_t != a$,出错
  6. 如果 $X \in V_n$,查M表
    1. M [ X , a ] = X∷= U V W,则将 X 弹出栈,将 U V W逆序入栈,注:U在栈顶 (最左推导)
    2. M [ X , a ] = error 转出错处理
    3. M [ X , a ] = X:: =ε,a为X的后继符号,则将X弹出栈,(不读下一符号)继续分析。

image

紫色的部分只是对称的

分析表的构造

image

FIRST集是可以有空的;FOLLOW集如果这个推到最后了,加入#

FIRST集的计算(从文法规则的底向上求),前两条很简单,但是加入$\epsilon$需要有以下条件:

image

FOLLOW集的计算(从文法规则的顶向下),重要的是找产生式的右侧。E -> TE’,先加入E’的FIRST,再看E’->?\epsilon,如果能再加入FOLLOW(E):

image

构造分析表基本思想:当文法中某一非终结符呈现在栈顶时,根据当前的输入符号,分析应指示要用该非终结符里的哪一条规则去匹配输入串(即进行下一步最左推导)。

image

能够构造出来以上的文法就是LL(1)文法,每个表项只有一条规则

LL(1)文法

image

同时还要消除左递归和二义性等

自底向上分析法(全书的重点)

最左规约,即最右推导

LR分析法

从左到右扫描,自底向上规约

image

image

分析表包括:goto, action两个表

  • SLR分析表(简单LR分析表,主要讲这个,并且一定是属于后面两个的)
  • LR分析表
  • LALR(超前LR分析表)

image

image

????

  • 移进 (shift),ACTION[ Si , a ] = s
    • 动作:将 a 推进栈,并设置新的栈顶状态为 Sj 。
    • Sj = GOTO[ Si, a ],并将指针指向下一个输入符号。
  • 规约 (reduce),ACTION[ Si , a ] = rd,d:文法规则编号 (d) A→β
    • 动作:将符号串β(假定长度为n ) 连同状态从栈内弹出,再把 A 推进栈,并设置新的栈顶状态为Sj。
    • Sj = GOTO[ Si-n , A ]
  • ACCEPT接受了
  • ERROR报错

image

构造LR分析表

  • 构造LR分析器的关键是构造其分析表!
  • 构造LR分析表的方法是:
    • 根据文法构造识别规范句型活前缀的有穷自动机 DFA
    • 由DFA构造LR分析表。

image

image

image

举个栗子:

image

closure(I)中的每个项目A→α.Bβ(B∈Vn),将B→. r ( r∈V* )加入closure(I)

image

image

image