LL文法与其分析程序教学讲义_第1页
LL文法与其分析程序教学讲义_第2页
LL文法与其分析程序教学讲义_第3页
LL文法与其分析程序教学讲义_第4页
LL文法与其分析程序教学讲义_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

LL文法与其分析程序教学讲义自上而下分析算法要点:.由根向下构造语法树.构造最左推导.推导出的终结符是否与当前输入符匹配

SaaabABaAS–>ABA–>aA|B–>b|bBaaab.S

ABS–>AB

aABA–>aA

aaABA–>aA

aaaABA–>aA

aaaBA–>

aaabB–>b2带回溯的自上而下分析S–>ABA–>aA|B–>b|bBaaabb.S(1)A...S–>AB(2)aA...A–>aA(3)aaA...A–>aA(4)aaaA...A–>aA(5)aaa

B...A–>(6)aaabB–>baaabb.S(1)A...S–>AB(2)aA...A–>aA(3)aaA...A–>aA(4)aaaA...A–>aA(5)aaaBA–>(6’)aaabBB–>bB(7)aaabbB–>b3预测分析程序Predictiveparser无回溯的自顶向下分析程序特征——根据下一个输入符号为当前要处理的非终结符选择产生式要求——文法是LL(1)的第一个L从左到右扫描输入串第二个L生成的是最左推导

1向前看一个输入符号(lookahead)预测分析程序的实现技术

1递归下降子程序

2表驱动分析程序4PL/0语言的EBNF〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义部分〉{,〈常量定义〉};〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈过程说明部分〉∷=PROCEDURE〈标识符〉〈分程序〉{;〈过程说明部分〉};〈语句〉∷=〈标识符〉:=〈表达式〉|IF〈条件〉then〈语句〉|CALL…|READ…|BEGIN〈语句〉{;〈语句〉}END|WHILE…|…5begin(*statement*)ifsym=identthen(*parsingass.st.*)begingetsym;ifsym=becomesthengetsymelseerror(13);expression(fsys);endelseifsym=readsymthen(*parsingreadst.*)begingetsym;ifsym<>lparenthenerror(34)elserepeatgetsym;ifsym<>identthenerror(35)elsegetsymuntilsym<>comma;ifsym<>rparenthenerror(33);end6递归下降子程序program–>function_listfunction_list–>functionfunction_list|

function–>FUNCidentifier(parameter_list)statementvoidParseFunction(){MatchToken(T_FUNC);ParseIdentifier();MatchToken(T_LPAREN);ParseParameterList();MatchToken(T_RPAREN);ParseStatement();}7voidMatchToken(intexpected){if(lookahead!=expected){printf("syntaxerror\n");exit(0);}else//ifmatch,consumetokenandmoveonlookahead=yylex();}8例:递归子程序实现表达式的语法分析表达式的EBNF

〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉}

〈项〉∷=〈因子〉{(*|/)〈因子〉}

〈因子〉∷=ident|number|‘(’〈表达式〉‘)’9procedureexpr;

begin

ifsymin[plus,minus]then

begin

getsym;term;

end

elseterm;

whilesymin[plus,minus]do

begin

getsym;term;

end

end;10

Procedureterm;beginfactor;whilesymin[times,slash]dobegingetsym;factorendend;11

Procedurefactor;beginifsym=identthengetsymelseifsym=numberthengetsymelseifsym=‘(‘thenbegingetsym;expr;ifsym=‘)’thengetsymelseerrorendelseerrorend;

12表驱动予测分析程序模型

Input#总控程序预测分析表stack13

带a0a1a2a3a4a5a6a7a8…an-1an

有限控制器磁头识别程序的数学模型下推自动机14

上下文无关语言句型分析(识别)程序的数学模型下推自动机Pda=(K,Σ,f,H,h0,S,Z)H:下推栈符号的有穷字母表

h0:H中的初始符号

f:K(Σ{})

H–>KH*Pda的一个组态是KΣ*

H中的一个(k,w,)k:当前状态,w:余留输入串,:栈中符号,最左边的符号在栈顶。Pda的一次移动用组态表示终止和接受的条件:

1.到达输入串结尾时,处在Z中的一个状态或2.某个动作序列导致栈空时

15

例:PdaP=({A,B,C),{a,b,c),f,{h,i},i

A,{})

f(A,a,i)=(B,h)f(B,a,h)=(B,hh)f(C,b,h)=(C,)f(A,c,i)=(A,)f(B,c,h)=(C,h)接受输入串aacbb的过程(A,aacbb,i)读a,popi,pushh,gotoB(B,acbb,h)读a,poph,pushhh,gotoB(B,cbb,hh)读c,poph,pushh,gotoC(C,bb,hh)读b,poph,push,gotoC(C,b,h)读b,poph,push,gotoC(C,,)16

G[E]:(1)E–>TE’(2)E’–>+TE’(3)E’–>

(4)T–>FT’(5)T’–>*FT’(6)T’–>

(7)F–>(E)(8)F–>a17

a+*()#E(1)(1)E’(2)(3)(3)T(4)(4)T’(6)(5)(6)(6)F(8)(7)G[E]:(1)E–>TE’(2)E’–>+TE’(3)E’–>

(4)T–>FT’(5)T’–>*FT’(6)T’–>

(7)F–>(E)(8)F–>a18分析算法BEGIN

首先把’#‘然后把文法开始符号推入栈;把第一个输入符号读进b;FLAG:=TRUE;WHILEFLAGDO

BEGIN

把栈顶符号上托出去并放在X中;

IFXVtTHENIFX=bTHEN

把下一个输入符号读进a

ELSEERROR

ELSEIFX=‘#’THENIFX=bTHENFLAG:=FALSEELSEERRORELSEIF[X,b]={X–>

X1X2..XK}THEN把XK,XK-1,..,X1一一推进栈

ELSE

ERRORENDOFWHILE;STOP/*分析成功,过程完毕*/END19分析输入串#a+a#栈内容栈顶符号当前输入余留串M[X,b]1#EEa+a#E–>

TE’2#E’TTa+a#T–>

FT’3#E’T’FFa+a#F–>

a4#E’T’aaa+a#5#E’T’T’+a#T’–>

6#E’E’+a#E’–>

+TE’7#E’T+++a#8#E’TTa#T–>

FT’9#E’T’FFa#F–>

a10#E’T’aaa#11#E’T’T’#T’–>

12#E’E’#E’–>

13###20FIRST集和FOLLOW集的定义设G=(VT,VN,P,S)是上下文无关文法FIRST()={a|=>*a,a∈VT,,∈V*}

若=>*

ε则规定ε∈FRIST()FOLLOW(A)={aS=>*A且a∈

FRIST(),∈V*,∈V+}

若S=>*

uA,且=>*

ε,则#∈FOLLOW(A)LL(1)文法21计算FIRST集1.若XV,则FIRST(X)={X}2.若XVN,且有产生式Xa…,则把a加入到FIRST(X)中;若X也是一条产生式,则把也加到FIRST(X)中.3.若XY…是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若XY1Y2…YK

是一个产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j≤i-1,FIRST(Yj)都含有(即Y1..Y(i-1)=>*

),则把FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj,

j=1,2,…,K)均含有,则把加到FRIST(X)中.

22计算FOLLOW集1.对于文法的开始符号S,置#于FOLLOW(S)中;2.若A

αBβ是一个产生式,则把FIRST(β)\{}加至FOLLOW(B)中;3.若A

αB是一个产生式,或A

αBβ是一个产生式而β=>*

(即FIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中.23

一个文法G是LL(1)的,当且仅当对于G的每一个非终结符A的任何两个不同产生式A

αβ,下面的条件成立:1.FIRST(α)∩FIRST(β)=,也就是α和β推导不出以同一个终结符a为首的符号串;它们不应该都能推出空字.2.假若β=>*

,那么,

FIRST(α)∩FOLLOW(A)=.也就是,若β=>*

.则α所能推出的串的首符号不应在FOLLOW(A)中..

24G[E]:(1)E–>TE’(2)E’–>+TE’(3)E’–>

(4)T–>FT’(5)T’–>*FT’(6)T’–>

(7)F–>(E)(8)F–>a·各非终结符的FIRST集合如下:FIRST(E)={(,i}FIRST(E′)={+,ε}FIRST(T)={(,i}FIRST(T′)={*,ε}FIRST(F)={(,i}·各非终结符的FOLLOW集合为:FOLLOW(E)={),#}FOLLOW(E′)={),#}FOLLOW(T)={+,),#}FOLLOW(T′)={+,),#}FOLLOW(F)={*,+,),#}

25G[E]:(1)E–>TE’(2)E’–>+TE’(3)E’–>

(4)T–>FT’(5)T’–>*FT’(6)T’–>

(7)F–>(E)(8)F–>aE’–>+TE’|FIRST(+TE’)={+}

FOLLOW(E′)={),#}T’–>*FT’|FIRST(*FT’)={*}

FOLLOW(T′)={+,),#}F–>(E)|aFIRST((E))={(}

FIRST(a)={a}所以G[E]是LL(1)的26予测分析表构造算法1.对文法G的每个产生式A

执行第二步和第三步;2.对每个终结符aFIRST(),把A

加至[A,a]中,3.若FIRST(),则对任何bFOLLOW(A)

把A

加至[A,b]中,4.把所有无定义的[A,a]标上“出错标志”。可以证明,一个文法G的予测分析表不含多重入口,当且仅当该文法是LL(1)的27

LL(1)文法的性质:

LL(1)文法是无二义的

LL(1)文法不含左递归非LL(1)文法的改造消除左递归提左公因子将产生式A

β|变换为:A

BBβ|28E→E+T|TT→T*F|FF→i|(E)FIRST(E)={(,i}FIRST(T)={(,i}FIRST(F)={(,i}消左递归

E–>TE’E’–>+TE’E’–>

S→ifCtS|

ifCtSeSC→b提左因子

S→ifCtSAA→eS|

First集Follow集Sif#,eAe,#,eCbtM[A,e]={A→eSA→}29LL(1)分析中的一种错误处理办法发现错误1栈顶的终结符与当前输入符不匹配2非终结符A于栈顶,面临的输入符为a,但分析表M的M[A,a]为空“应急”恢复策略跳过输入串中的一些符号直至遇到“同步符号”为止。同步符号的选择1把FOLLOW(A)中的所有符号作为A的同步符号。跳过输入串中的一些符号直至遇到这些“同步符号”,把A从栈中弹出,可使分析继续2把FIRST(A)中的符号加到A的同步符号集,当FIRST(A)中的符号在输入中出现时,可根据A恢复分析30review---parsingThesyntaxanalysisphaseofacompilerverifiesthatthesequenceoftokensreturnedfromthescannerrepresentvalidsentencesinthegrammaroftheprogramminglanguage.Therearetwomajorparsingapproaches:top-downandbottom-up.Intop-downparsing,youstartwiththestartsymbolandapplytheproductionsuntilyouarriveatthedesiredstring.Inbottom-upparsing,youstartwiththestringandreduceittothestartsymbolbyapplyingtheproductionsbackwards.31Inthetop-downparsing,webeginwiththestartsymbolandateachstep,expandoneoftheremainingnonterminalsbyreplacingitwiththerightsideofoneitsproductions.Werepeatuntilonlyterminalsremain.Thetop-downparseprintsaleftmostderivationofthesentence.Abottom-upparseworksinreverse.Webeginwiththesentenceofterminalsandeachstepappliesaproductioninreverse,replacingasubstringthatmatchestherightsidewiththenonterminalontheleft.Wecontinueuntilwehavesubstitutedourwaybacktothestartsymbol.Ifyoureadfromthebottomtotop,thebottom-upparseprintsoutarightmostderivationofthesentence.32

lookaheadsymbolThelookaheadsymbolisthenextsymbolcomingupintheinput.backtracking.Basedontheinformationtheparsercurrentlyhasabouttheinput,adecisionismadetogowithoneparticularproduction.Ifthischoiceleadstoadeadend,theparserwouldhavetobacktracktothatdecisionpoint,movingbackwardsthroughtheinput,andstartagainmakingadifferentchoiceandsoonuntiliteitherfoundtheproductionthatwastheappropriateoneorranoutofchoices.33predictiveparserandLL(1)grammarPredictiveparserisanon-backtrackingtop-downparser.Apredictiveparserischaracterizedbyitsabilitytochoosetheproductiontoapplysolelyonthebasisofthenextinputsymbolandthecurrentnonterminalbeingprocessed.Toenablethis,thegrammarmusttakeaparticularform.WecallsuchagrammarLL(1).Thefirst“L”meanswescantheinputfromlefttoright;thesecond“L”meanswecreatealeftmostderivation;andthe1meansoneinputsymboloflookahead.34recursive-descentThefirsttechniqueforimplementingapredictiveparseriscalledrecursive-descent.Arecursivedescentparserconsistsofseveralsmallfunctions(procedures),oneforeachnonterminalinthegrammar.Asweparseasentence,wecallthefunctions(procedures)thatcorrespondtotheleftsidenonterminaloftheproductionsweareapplying.Iftheseproductionsarerecursive,weendupcallingthefunctionsrecursively.35Table-drivenLL(1)parsingInarecursive-descentparser,theproductioninformationisembeddedintheindividualparsefunctionsforeachnonterminalandtherun-timeexecutionstackiskeepingtrackofourprogressthroughtheparse.Thereisanothermethodforimplementingapredictiveparserthatusesatabletostorethatproductionalongwithanexplicitstacktokeeptrackofwhereweareintheparse.36Howatable-drivenpredictiveparserworksWepushthestartsymbolonthestackandreadthefirstinputtoken.Astheparserworksthroughtheinput,therearethefollowingpossibilitiesforthetopstacksymbolXandtheinputtokennonterminala:1.IfX=aanda=endofinput(#):parserhaltsandparsecompletedsuccessfully2.IfX=aanda!=#:successfulmatch,popXandadvancetonextinputtoken.Thisiscalledamatchaction.3.I

温馨提示

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

评论

0/150

提交评论