在语法分析(一)中我们指出:
自顶向下分析法 LL(1)分析法
最左推导
下推自动机(2型文法)比有穷自动机多了一个栈
left to right and leftmost derivation,1表示的是每次只用往下读一个字符
一个LL分析器包含一个总控程序,一张分析表和一个符号栈组成
- 输入串即待分析的符号串,在输入串的末尾放置一个#来表示输出串的结束,#不属于文法符号
- 分析表M可用一个矩阵来表示, $M=[A,a] = A::=\alpha _i\ or\ error$
执行程序
- 把#和文法识别符号E推进栈中,并读入输入串的第一个符号a,重复下属过程知道正常结束或出错
- 根据站定符号X和当前输入符号a,执行如下操作:
- 如果 $X \in V_t = a = \#$,程序分析成功
- 如果 $X \in V_t = a != \# $,X弹栈,读入下一个符号
- 如果 $X \in V_t != a$,出错
- 如果 $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弹出栈,(不读下一符号)继续分析。

紫色的部分只是对称的
分析表的构造

FIRST集是可以有空的;FOLLOW集如果这个推到最后了,加入#
FIRST集的计算(从文法规则的底向上求),前两条很简单,但是加入$\epsilon$需要有以下条件:

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

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

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

同时还要消除左递归和二义性等
自底向上分析法(全书的重点)
最左规约,即最右推导
LR分析法
从左到右扫描,自底向上规约


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


????
- 移进 (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报错

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



举个栗子:

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


