第四章 语法分析 - 自顶向下分析方法

33
第第第 第第第第 第第第 第第第第 - - 第第第第第第第第 第第第第第第第第 第第第第 第第第第第第 第第第第第第第 第第第第第第第第第 第第第第第第第第 LL(1) 第第第第

Upload: lassie

Post on 20-Jan-2016

150 views

Category:

Documents


0 download

DESCRIPTION

第四章 语法分析 - 自顶向下分析方法. 主要内容: 语法分析简介 三个重要的集合 自顶向下分析的条件 递归下降语法分析 LL(1) 语法分析. 语法分析简介. 语法分析的功能 语法错误类别 语法错误的处理 自顶向下分析的基本思想. Parser. Token/TokenList. 语法树/语法错误信息. 语法分析器的功能 语法错误类别 1) 程序的开始符,语句(表达式)的开始 符 ( 后继符 ) 错 2) 标识符(常量)错:该出现时未出现 3) 括号类错误:不匹配   4) 分隔符错: assignment. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第四章 语法分析 - 自顶向下分析方法

第四章 语法分析第四章 语法分析 -- 自顶向下分析方自顶向下分析方法法

主要内容:语法分析简介三个重要的集合 自顶向下分析的条件递归下降语法分析LL(1) 语法分析

Page 2: 第四章 语法分析 - 自顶向下分析方法

语法分析简介语法分析简介

语法分析的功能 语法错误类别 语法错误的处理 自顶向下分析的基本思想

Page 3: 第四章 语法分析 - 自顶向下分析方法

语法分析器的功能

语法错误类别 1) 程序的开始符,语句(表达式)的开始 符(后继符)错    2) 标识符(常量)错:该出现时未出现     3) 括号类错误:不匹配   4) 分隔符错: assignment

Token/TokenList Parser 语法树 / 语法错误信息

Page 4: 第四章 语法分析 - 自顶向下分析方法

语法错误处理 要求:报告错误出现的位置 修复错误并继续检查后续部分 执行开销不应太大 处理策略:

1 )紧急方式恢复; 2 )短语级恢复;

3 )出错产生式;4 )全局纠正;

Page 5: 第四章 语法分析 - 自顶向下分析方法

自顶向下分析基本思想自顶向下分析基本思想 从文法开始符出发试图推导出所给的终极符串。 例 G[z] : [1] Z aBd [2] B d

[3] B c [4] B bB 对给定的终极符串 abcd ,推导过程: Z [1] aBd [4] abBd [3] abcd

Z

a B d

b B

c

aBd # abcd # Match

Bd # bcd # Derivation

bBd # bcd # Match

Bd # cd # Derivation

cd # cd # Match

d # d # Match

# # Success

自顶向下的语法分析过程【 Sf,Rest,Action(D/M/S/E) 】 Z # abcd # Derivation

Page 6: 第四章 语法分析 - 自顶向下分析方法

三个重要的集合三个重要的集合 FirstFirst 集集的定义的定义

设 G=(VT , VN , S , P) 是上下文无关文法 ,

(VT VN )* ,则: First()={ a VT | * a...}

(if * then {} else )

作用:可以根据当前的输入符号是属于哪个产生式右部的首符集而决定选择相应产生式进行推导。

Page 7: 第四章 语法分析 - 自顶向下分析方法

文法 G3[S]:

S aA | d

A bAS | 输入串 W=abd 。自顶向下的推导过程为 :

S

aA

abAS

abS

abd

相应的语法树为:

S

a A

b A S

d

Page 8: 第四章 语法分析 - 自顶向下分析方法

FollowFollow 集集的定义的定义

设 G=(VT , VN , S , P) 是上下文无关文法,AVN , S 是开始符号,则:Follow(A)={ a VT | S+ ...Aa... }

(if S*...A then {#} else )

作用:当文法中存在产生式形如: A 时,如果当前的字符属于 Follow(A) ,则用空取代 A 的出现。

Page 9: 第四章 语法分析 - 自顶向下分析方法

PredictPredict 集集的定义的定义

Predict(A→)

= First() , 当 First()

= First()-{}Follow(A) ,当 First()

Page 10: 第四章 语法分析 - 自顶向下分析方法

计算计算 First(X)First(X) 集集对每一文法符号 X 计算 First(X)若 XVT,First(X)={X}若 XVN 则 First(X)={a| Xa…PSet,aVT}若 XVN, 且有产生式 X, 则 First(X)若 XVN, 有产生式 XY1Y2…Yn ,且 Y1,Y2,…,Yi

VN ,则 当 Y1,Y2,…,Yi-1* , 则 First(Y1)-{},First(Y2)-{},…

First(Yi-1)-{}, First(Yi) 都包含在 First(X) 中。 当 Yi * (i=1,2,…n), 将 {} 并入 First(X) 中。

Page 11: 第四章 语法分析 - 自顶向下分析方法

计算计算 First(First()) 集集

若符号串 =X1X2…Xn ,当 X1,X2,…Xi-1* , Xi 不能 * ,则

First()=1i-1(First(Xj)-{}) First(Xi)

若所有 Xi 都能 * ,则First()= 1

nFirst(Xj)

Page 12: 第四章 语法分析 - 自顶向下分析方法

计算计算 FollowFollow 集集

1: 对所有 BVN ,令 Follow(B):={ } ;对开始符 S,

令 Follow(S):={# } ;2: 若有产生式 A→xBy , 如果 First(y) 则: Follow(B):= First(y)

否则 Follow(B):=(First(y) - {}) Follow(A)

3: 重复 2 ,直至对所有 BVN , Follow(B) 收 敛为止。

Page 13: 第四章 语法分析 - 自顶向下分析方法

计算计算 PredictPredict 集集

Predict(A→)

= First() , 当 First() 不含 = First()-{ } Follow(A) ,

当 First() 含

Page 14: 第四章 语法分析 - 自顶向下分析方法

例子E T E’

E’ + T E’ | T F T’

T’ *F T’ | F id | ( E )

Page 15: 第四章 语法分析 - 自顶向下分析方法

Predict( ETE’ ) = first(TE’) = { id , ( }Predict( E’ +TE’ ) = first(+TE’) = { + }Predict( E’ ) = follow(E’) = { ) , # }Predict( T FT’ ) = first(FT’) = { id , ( }Predict( T’ *FT’ ) = first(*FT’) = { * }Predict( T’ ) = follow(T’) = { + , ) , # }Predict( F id ) = first(id) = { id }Predict( F (E) ) = first((E)) = { ( }

Page 16: 第四章 语法分析 - 自顶向下分析方法

自顶向下分析方法的条件:

predict(A→k) predict(A→j )= ,当 k j

产生式 A→ 被选择的条件是:

当前的输入符属于 predict(A→) 。

至多一个产生式被选择的条件是:

predict(A→k) predict(A→j )= ,当 k j

自顶向下分析的条件

Page 17: 第四章 语法分析 - 自顶向下分析方法

递归下降法递归下降法

递归下降法 (Recursive-Descent Parsing)

对每个非终极符按其产生式结构产生相应语法分析子程序 . 终极符产生匹配命令

非终极符则产生调用命令 文法递归相应子程序也递归,所以称这

种方法为递归子程序方法或递归下降法

Page 18: 第四章 语法分析 - 自顶向下分析方法

例: Stm→ while Exp do Stm

则对应产生式右部的语法分析程序部分如下:

begin

Match($while) ; Exp ; Match($do) ; Stm

end

Page 19: 第四章 语法分析 - 自顶向下分析方法

while x>y do if x>z then x:= x+y else x:= y

Begin Match($while); Exp; Match($do); Stm End

Page 20: 第四章 语法分析 - 自顶向下分析方法

当产生式中形如 : A 1| 2| …| n

则按下面的方法编写子程序 A : procedure A( )

begin if tokenPredict(A1) then (1) else

if tokenPredict(A2) then (2) else ……

if tokenPredict(An) then (n) else err( ) end

其中对 i=X1X2…Xn , (i) = ’(X1);’(X2);…;’(Xn);

如果 XVN ,’ (X)= X

如果 XVT ,’ (X)= Match(X) 如果 X= , () = skip( 空语句 )

Page 21: 第四章 语法分析 - 自顶向下分析方法

假设有文法Z → a B a

B → b B | c

则相应的递归子程序可如下:

procedure Z( )

begin

if token=a then Match(a) ;

B ;

Match(a)

else err( )

end;

procedure B ( )

begin

if token = b then Match(b);

B;

else

if token = c

then Match(c);

else err( )

end;主程序: Begin ReadToken; Z end

ReadToken

ReadToken

Page 22: 第四章 语法分析 - 自顶向下分析方法

LLLL 分析方法分析方法LL(1) 是 LL(k) 的特例 , 其中的 k 则表示向前

看 k 个符号。 LL(1) 方法和递归下降法属于同一级别的自顶

向下分析法,但有一些区别 . 递归下降法对每个非终极符产生子程序,而 LL(1)

方法则产生 LL 分析表; 递归下降法能判断每个产生式的结束,而 LL(1) 方

法则不能; 递归下降法分析法不用符号栈,而 LL(1) 方法则用

符号栈。

Page 23: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析方法的条件分析方法的条件

对于任一非终极符 A ,其任意两个产生式A→ 和 A→ ,都要满足下面条件: Predict(A→) Predict(A→)=

满足这一条件的文法称为 LL(1) 文法。

Page 24: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析例分析例

文法 G[A]: A a B c[1] B d [2]| b B[3]输入串: abbdc分析过程:(A,abbdc)1(aBc,abbdc) (Bc,bbdc)

3(bBc,bbdc) (Bc,bdc) 3 (bBc,bdc) (Bc,dc) 2 (dc,dc) (c,c) ( , )

Page 25: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析的动作分析的动作

替换:当 X1VN 时选相应候选式去替换X1 。

匹配:当 X1VT 时它与 Y1 进行匹配,其结果可能成功,也可能失败,如果成功则去掉X1 和 Y1 ,否则报错。

接受:当格局为(空,空)时报分析成功。报错:出错后,停止分析。

Page 26: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析器的组成分析器的组成LL(1) 语法分析表( LL(1) 矩阵)LL(1) 语法分析驱动程序

Page 27: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析表的构造分析表的构造

T : VN VT → P { Error }

T(A,t)=A→ 若 tPredict( A→ )

T(A,t)=Error 否则 其中 P 表示所有产生式的集合

Page 28: 第四章 语法分析 - 自顶向下分析方法

LL(1)LL(1) 分析的驱动器分析的驱动器

Stack

Input

a

栈为空情形的处理 X VT 情形的处理 X VN 情形的处理

X

LL[1] 分析表

Page 29: 第四章 语法分析 - 自顶向下分析方法

LL_DriverLL_Driver[1] 初始化: Stack :=empty ; Push(S) ;[2] 读下一个输入符: Read(a) ;[3] 若当前格局是 ( empty, # ) ,则成功结束;

否则转下;[4] 设当前格局为( X....., a.....) ,则

若 XVT & X=a 则 {Pop(1) ; Read(a) ; goto [3] }

若 XVT & Xa 则 Error ; 若 XVN ,则: if T(X,a)=X→Y1Y2 … Yn

then {Pop(1) ; Push(Y1 ,.....,Yn) ; goto[3]} else Error

Page 30: 第四章 语法分析 - 自顶向下分析方法

LLLL 分析实例分析实例文法 G:

E T E’[1]

E’ + T E’[2] | [3]

T F T’[4]

T’ * F T’[5] | [6]

F id[7] | ( E )[8]

符号串 i + i * i # 的 LL(1) 分析过程:

Page 31: 第四章 语法分析 - 自顶向下分析方法

Predict( [1] ) = first(TE’) = { id , ( }

Predict( [2] ) = first(+TE’) = { + }

Predict( [3] ) = follow(E’) = { ) , # }

Predict( [4] ) = first(FT’) = { id , ( }

Predict( [5] ) = first(*FT’) = { * }

Predict( [6] ) = follow(T’) = { + , ) , # }

Predict( [7] ) = first(id) = { id }

Predict( [8] ) = first((E)) = { ( }

Page 32: 第四章 语法分析 - 自顶向下分析方法

分析栈 S 输入流 T 矩阵元素 E # i + i * i # LL[ E ,i ] = [1]

T E’# i + i * i # LL [ T ,i ] = [4]

F T’ E’# i + i * i # LL [ F ,i ] = [7]

i T’ E’ # i + i * i # Match

T’ E’# + i * i # LL [ T’,+] = [6]

E’# +i * i # LL [ E’,+ ] = [2]

+T E’# +i * i # Match

T E’# i * i # LL [ T,i ] =[4]

F T’ E’# i* i # LL [ F,i ] = [7]

i T’ E’# i * i # Match

T’ E’# * i # LL [ T’,* ] = [5]

*FT’ E’# * i # Match

FT’ E’# i # LL[F,i] = [7]

iT’ E’# i # Match

T’ E’# # LL[T’,#] = [6]

E’# # LL[E’, #] = [3]

# # ok

Page 33: 第四章 语法分析 - 自顶向下分析方法

if-then-elseif-then-else 语句语句

BL 语言 { [i ]j | i j 0 } 不是 LL 文法

条件语句的产生式是无法变换成 LL(1) 型 产生式的。