4语法分析-递归下降法_第1页
4语法分析-递归下降法_第2页
4语法分析-递归下降法_第3页
4语法分析-递归下降法_第4页
4语法分析-递归下降法_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章:语法分析

递归下降法自顶向下语法分析的实现方式LL(1)递归下降法(Recursive-DescentParsing)

对每个非终极符构造相应的一个子程序(称为语法分析子程序),其功能是识别、分析该非终极符所能推导出的字符串.

1.1递归下降法的基本原理例如:一条产生式:While_Stm→whileExpdoStm则对应产生式右部的语法分析程序部分如下:begin

Match(while);

Exp;

Match(do);

Stm;

end

begin

Match(while);Exp;

Match(do);

Stm;

end

while

x>y

do

ifx>ythenx:=y+xelsey:=x递归下降分析示图复杂任务的不断拆解细化,直至直接匹配。1.2对文法的要求为了保证推导的唯一性,对文法的要求与LL(1)文法相同。即对于文法G中任一非终极符A,其任意两个产生式A和A,都要满足下面条件:

Predict(A)Predict(A)=2.语法分析程序的构造两个标准函数ReadToken:把输入流的头符读入变量token中Match(a):iftoken=athenReadToken else出错匹配两个动作读取下一个字符2.语法分析程序的构造当产生式形如:A

1|2|…|n,则按下面的方法编写子程序A:

procedureA()beginiftokenPredict(A1)then(1)elseiftokenPredict(A2)then(2)

else……iftokenPredict(An)then

(

n)

elseerror()end其中对

i=X1X2…Xn,(

i)='(X1);'(X2);…;'(Xn);如果XVN,

'(X)=X();如果XVT,'(X)=Match(X);//即if(token==X)ReadToken();如果X=,'(

)=skip(空语句).两句话①对于终极符匹配②对于非终极符调用2.语法分析程序的构造主程序:voidmain(){

ReadToken();S(); if(token=='#')成功; else失败}

2.语法分析程序的构造具体构建流程给定一个文法G求每条规则的Predict集写针对每个非终极符的函数写主函数优点:构造简单缺点:频繁的函数调用影响效率程序比较长终极符产生匹配命令,而非终极符则产生调用命令.因为文法递归相应子程序也递归,所以称这种方法为递归子程序方法或递归下降法.与文法相关,文法变,程序变例:假设有文法

Z→aBa B→bB|cPredict(Z→aBa)={a},Predict(B→bB)={b},Predict{B→c}={c}则相应的递归子程序可如下:procedureZ()beginiftoken=athenMatch(a);

B;

Match(a)elseerr(1)end;procedureB()beginiftoken=bthenMatch(b);B;elseiftoken=cthenMatch(c);elseerr(2)end;语法分析主程序:BeginReadToken;Z;Match(#)

EndReadTokenReadToken

(aBa)

'(a);'(

B);'(a)匹配调用匹配读取下一个字符例: ETE’ E’+TE’|

TFT’ T’*FT’|

Fi|(E)Predict(ETE’)=first(TE’)={i,(}Predict(E’+TE’)=first(+TE’)={+}Predict(E’

)=follow(E’)={),#}Predict(TFT’)=first(FT’)={i,(}Predict(T’*FT’)=first(*FT’)={*}Predict(T’

)=follow(T’)={+,),#}Predict(Fid)=first(id)={i}Predict(F(E))=first((E))={(}procedureE()beginiftoken

{i,(}thenT;

E’

elseerr(1)end;语法分析主程序:BeginReadToken;E;Match(#)

endprocedureE’

()beginiftoken=“+”thenMatch(+);T;

E’

elseiftoken

{),#}

thenskipelseerr(2)end;例: ETE’ E’+TE’|

TFT’ T’*FT’|

Fi|(E)Predict(ETE’)=first(TE’)={i,(}Predict(E’+TE’)=first(+TE’)={+}Predict(E’

)=follow(E’)={),#}Predict(TFT’)=first(FT’)={i,(}Predict(T’*FT’)=first(*FT’)={*}Predict(T’

)=follow(T’)={+,),#}Predict(Fid)=first(id)={i}Predict(F(E))=first((E))={(}例: ETE’ E’+TE’|

TFT’ T’*FT’|

Fi|(E)Predict(ETE’)=first(TE’)={i,(}Predict(E’+TE’)=first(+TE’)={+}Predict(E’

)=follow(E’)={),#}Predict(TFT’)=first(FT’)={i,(}Predict(T’*FT’)=first(*FT’)={*}Predict(T’

)=follow(T’)={+,),#}Predict(Fid)=first(id)={i}Predict(F(E))=first((E))={(}procedureT()beginiftoken

{i,(}thenF;

T’

elseerr(3)end;procedureT’

()beginiftoken=“*”thenMatch(*);F;

T’

elseiftoken

{+,),#}

thenskipelseerr(4)end;例: ETE’ E’+TE’|

TFT’ T’*FT’|

Fi|(E)Predict(ETE’)=first(TE’)={i,(}Predict(E’+TE’)=first(+TE’)={+}Predict(E’

)=follow(E’)={),#}Predict(TFT’)=first(FT’)={i,(}Predict(T’*FT’)=first(*FT’)={*}Predict(T’

)=follow(T’)={+,),#}Predict(Fid)=first(id)={i}Predict(F(E))=first((E))={(}procedureF

()beginiftoken=“i”thenMatch(i

)

elseiftoken=“(”

thenMatch((

); E;

Match())elseerr(5)end;例: ETE’ E’+TE’|

TFT’ T’*FT’|

Fi|(E)Predict(ETE’)=first(TE’)={i,(}Predict(E’+TE’)=first(+TE’)={+}Predict(E’

)=follow(E’)={),#}Predict(TFT’)=first(FT’)={i,(}Predict(T’*FT’)=first(*FT’)={*}Predict(T’

)=follow(T’)={+,),#}Predict(Fid)=first(id)={i}Predict(F(E))=first((E))={(}ETFiiM(i)E’TFiiM(i)E’T’FT’例:i+i*i#递归下降分析过程+++M(+)*#*M(*)i###skip####M(i)skipE→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│iT’++skipTE’FT’+TE’FT’εiiiε*FT’ε语法分析主程序:BeginReadToken;E;Match(#)

endTEE'T'F大量函数调用!!ETFiiM(i)E’TFiiM(i)T’F例:i+i*+i#递归下降分析过程+++M(+)**M(*)+E→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│iT’++skipTE’+TE’FT’ii*FT’ε语法分析主程序:BeginReadToken;E;Match(#)

endFT’Err(5)ETE'T'F练习题:已知文法G[S]:SAB|bCA|bB|aDCAD|bDaS|c1、计算每个非终极符的First集、Follow集.2、计算每个产生式的Predict集合.3、判断该文法是否为递归下降文法?文法符号First集step1step2step3SABCD

SAB|bCA|bB|aDCAD|bDaS|c{b,a,

}{b,

}{a,

}{b,a,c}{a,c}{b}{b,

}{a,

}{b}{a,c}{b}{b,

}{a,

}{b}{a,c}文法符号First集S{a,b,

}A{b,

}B{a,

}C{a,b,c}D{a,c}

SAB|bCA|bB|aDCAD|bDaS|c文法符号Follow集step1S

ABS

bCBaDCADDaSSABCD{#}{

}{

}{}{}{#}{a,#

}{#}{}{}{#}{a,#

}{#}{#}{}{#}{a,#

}{#}{#}{#}{#}{a,#,c

}{#}{#}{#}Predict(SAB

)={a,b,#}Predict(SbC

)={b}Predict(A

)={a,c,#}Predict(Ab)={b}Predict(B

)={#}Predict(BaD)={a}Predict(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论