![LL1文法及其分析程序_第1页](http://file4.renrendoc.com/view/7e691fd459100092821bd862bc70d3cb/7e691fd459100092821bd862bc70d3cb1.gif)
![LL1文法及其分析程序_第2页](http://file4.renrendoc.com/view/7e691fd459100092821bd862bc70d3cb/7e691fd459100092821bd862bc70d3cb2.gif)
![LL1文法及其分析程序_第3页](http://file4.renrendoc.com/view/7e691fd459100092821bd862bc70d3cb/7e691fd459100092821bd862bc70d3cb3.gif)
![LL1文法及其分析程序_第4页](http://file4.renrendoc.com/view/7e691fd459100092821bd862bc70d3cb/7e691fd459100092821bd862bc70d3cb4.gif)
![LL1文法及其分析程序_第5页](http://file4.renrendoc.com/view/7e691fd459100092821bd862bc70d3cb/7e691fd459100092821bd862bc70d3cb5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章自顶向下语法分析方法主要内容:自上而下的语法分析预测分析程序递归下降子程序表驱动的预测分析程序
LL(1)分析程序的生成LL(1)文法FIRST和FOLLOW集定义和计算非LL(1)文法的改造
1第五章LL1文法及其分析程序
5.1确定的自顶向下语法分析思想1.语法分析概念2.自上而下的语法分析的一般过程3.自上而下的语法分析面临的问题4.开始符号集5.后跟符号集6.select集7.LL(1)文法2第五章LL1文法及其分析程序1。语法分析在语言的编译实现中,把句子分析的过程称为语法分析,即完成这个任务的程序称为语法分析程序或称为识别程序。分析算法又称识别算法。从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号,直到分析结束。3第五章LL1文法及其分析程序(上下文无关文法)句型的分析句型分析就是识别一个符号串是否为某文法的句型的过程,或者说是某个推导的构造过程。4第五章LL1文法及其分析程序语法树-推导的几何表示句型aabbaa的可能推导序列和语法树
例:G[S]: S→aAS A→SbA A→SS S→a A→baS
aASSbAa
a
b
aSaASaAaaSbAaaSbbaaaabbaaSaASaSbASaabASaabbaSaabbaaSaASaSbASaSbAaaabAaaabbaa5第五章LL1文法及其分析程序分析算法分类分析算法可分为:自上而下分析法:
从文法的开始符号出发,寻找与输入符号串匹配的推导,或者说,为输入串寻找一个最左推导。自下而上分析法:
从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。
6第五章LL1文法及其分析程序两种方法反映了语法树的两种构造过程。自上而下方法是从文法符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串自下而上方法则是从输入符号串开始,以它做为语法树的结果,自底向上的构造语法树7第五章LL1文法及其分析程序2。自上而下分析方法
对任何输入串,试图用一切可能的办法,从文法开始符号着手,自上而下地为输入串构造一棵语法树,或者说,为输入串寻找一个最左推导。本质上是一个试探过程,反复使用不同地产生式谋求匹配输入串的过程。
8第五章LL1文法及其分析程序自上而下的语法分析的一般过程例:文法G:S→cAd
A→ab
A→a
识别输入串w=cabd是否为该文法的句子 S S S
c A d
c A d
a
b推导过程:S
cAd
cAd
cabd9第五章LL1文法及其分析程序
自上而下的语法分析的一般过程
(1)S→cAd(2)A→ab(3)A→a
识别输入串w=cad是否为
该文法的句子1.ScAd2.后选择(2)扩展A,得到推导ScAdcabd这时
w的第二个符号可以与叶子结点a得以匹配,但第三个符号d却不能与下一叶子结点b匹配怎么办?-查看A有无另一个选择,有!回溯,把A为根的子树剪掉,扫描过的输入串中的a吐出来,再试探用产生式(3)构造推导ScAdcad识别输入串w=caa的过程:1.ScAd2.选择(2)扩展A,得到推导ScAdcabd3.回溯回到推导ScAd4.选择(3)扩展A,得到推导ScAdcad5.A没有选择了!回溯到推导ScAd6.再回溯S有无另一个选择?没有!
宣告分析失败。(请思考若有
(4)S→cB
(5)B→aa会怎样?
)10第五章LL1文法及其分析程序自上而下分析的进一步讨论自上而下分析也称面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入的符号串完全匹配的句子,若能构造出推导则表明输入串是给定文法的句子,否则表明该输入不是给定文法的句子。自上而下分析对文法的要求-文法不能含有左递归规则。自上而下分析又可分为确定的和不确定的两种
不确定的分析方法称为带回溯的分析方法,这种方法实际上是一种穷举的试探方法
确定的分析方法需对文法有一定的限制11第五章LL1文法及其分析程序3。自上而下的语法分析面临的问题-实现考虑回溯文法的左递归性
S→Sa12第五章LL1文法及其分析程序自上而下分析对文法的要求例文法G0[S]:(1)S→Sa(2)S→b
分析baa是不是文法的句子按照自上而下的分析思想选用产生式(1)来推导SSa
语法树末端结点最左符号为非终结符,所以选用(1)继续推导SSaSaa
此时语法树末端结点最左符号仍为非终结符,所以选用(1)继续推导SSaSaaSaaa问题——试图用S匹配输入串时,出现:在没有读入任何输入符号的情况下,又得重新要求S去进行新的匹配.无法确定什么时候使用(2)产生式最适当,只能采用带回溯的不确定方法解决。原因——文法含有左递归。13第五章LL1文法及其分析程序回溯的原因例G[S]:S→xAyA→ab|a
若当前输入串为xay,首先构造的推导SxAy
匹配进一步推导对A可选择A→ab替换,得SxAyxabyxayxaby
匹配xa都已匹配,当前面临输入符为y与b不能匹配,所以将输入串指针退回到a,对A的替换重新选用下一个产生式A→a进行试探,SxAyxay输入串中当前符a得到匹配,指针向前移动到y,与语法树中y匹配,匹配成功。由于相同左部的产生式的右部开始符号相同而引起回溯。14第五章LL1文法及其分析程序在自上而下的分析方法中如何选择使用哪个产生式进行推导? 假定要被代换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B?-------什么信息用于Parser做正确选择?(输入串,文法特点)15第五章LL1文法及其分析程序可预测的试探推导过程例文法G’[S]:S→
pA|qBA→cAd|a
B→dB|c
识别输入串w=pccadd是否是G1[S]的句子可预测的试探推导过程:SpApcAdpccAddpccadd
试探成功。16第五章LL1文法及其分析程序4。开始符号集---FIRST集设G=(VT,VN,P,S)是上下文无关文法FIRST()={a|=>*a,a∈VT,、∈V*}
若=>*ε则规定ε∈FRIST()17第五章LL1文法及其分析程序FOLLOW(A)={aS=>*A且a∈
FRIST(),∈V*,∈V+}
若S=>*
uA,且=>*
ε,则#∈FOLLOW(A)5。后跟符号集--FOLLOW集18第五章LL1文法及其分析程序6。SELECT集给定上下文无关文法的产生式AαA∈VN,∈V*若α≠>*
,则SELECT(Aα)=FIRST(α)若α=>*
,则SELECT(Aα)=(FIRST(α)-{})∪FOLLOW(A)19第五章LL1文法及其分析程序
7。LL(1)文法一个文法G是LL(1)的,当且仅当对于G的每一个非终结符A的任何两个不同产生式A
αβ,下面的条件成立:
SELECT(Aα)∩SELECT(Aβ)=Ф
其中α和β不能同时=>*
ε
20第五章LL1文法及其分析程序书中例子21第五章LL1文法及其分析程序
5.2LL(1)文法的判别判别步骤:1)。求出能推出ε的非终结符
22第五章LL1文法及其分析程序2)。计算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(Yi)中的所有元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj,
j=1,2,…,K)均含有,则把加到FRIST(X)中.
23第五章LL1文法及其分析程序3)。计算FOLLOW集1.对于文法的开始符号S,置#于FOLLOW(S)中;2.若AαBβ是一个产生式,则把FIRST(β)-{}加至FOLLOW(B)中;3.若AαB是一个产生式,或A
αBβ是一个产生式而β=>*
(即FIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中.24第五章LL1文法及其分析程序G[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)={(,a}FIRST(E′)={+,ε}FIRST(T)={(,a}FIRST(T′)={*,ε}FIRST(F)={(,a}·各非终结符的FOLLOW集合为:FOLLOW(E)={),#}FOLLOW(E′)={),#}FOLLOW(T)={+,),#}FOLLOW(T′)={+,),#}FOLLOW(F)={*,+,),#}
25第五章LL1文法及其分析程序4)。计算SELECT集计算产生式的SELECT集26第五章LL1文法及其分析程序G[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)的27第五章LL1文法及其分析程序5)。判断文法是否LL(1)文法若文法所有具有相同左部产生式的SELECT集两两不相交,则文法是LL(1)文法。28第五章LL1文法及其分析程序
LL(1)文法的性质:
LL(1)文法是无二义的
LL(1)文法不含左递归29第五章LL1文法及其分析程序5.3某些非LL(1)文法的改造1。提取左公共因子提左公因子:将产生式A
β|变换为:A
BBβ|30第五章LL1文法及其分析程序一般形式:A
β1|β2|…|βn提取左公共因子后:
AA’A’β1|β2|…|βn31第五章LL1文法及其分析程序2。消除左递归左递归-关于非终结符P的规则直接左递归:
P→Pα|βα、β∈V*且α、β不以P开头一般左递归:P=>*Pα
例:
S→AaA→Sb…32第五章LL1文法及其分析程序消除文法中左递归规则1)消除直接左递归:形如:P→Pα|βα非,α,β不以P打头
改写为:P→
βQ
Q
→
αQ|
其中Q为新增加的非终结符33第五章LL1文法及其分析程序消除文法中左递归规则举例例:E→E+T|TT
→T*F|FF
→(E)|a
G[E]:(1)E→TE’(2)E’→+TE’(3)E’→
(4)T→FT’(5)T’→*FT’(6)T’→
(7)F→(E)(8)F→a34第五章LL1文法及其分析程序消除一般左递归对文法要求:
1.无回路(A(=>+(A)2.无空产生式2)消除一般左递归的方法:(1)
.以某种顺序将文法非终结符排列A1,A2…An(2)
fori:=1tondobegin
forj:=1toi-1do
用Aj-->1|2…|k
替代形如Ai-->Ajr的规则,
其中Aj-->1|2…|k是关于Aj的全部产生式;
消除Ai规则的直接左递归;
end;(3)化简由(2)得到的文法:去掉无用产生式35第五章LL1文法及其分析程序例P9036第五章LL1文法及其分析程序消除左递归和提左公因子并不一定都能将非LL(1)文法改造为LL(1)的S→ifCtS|
ifCtSeSC→b提左因子
S→ifCtSAA→eS|
First集Follow集Sif#,eAe,#,eCbtSelect(A→eS)∩Select(A→)={e}∩{#,e}≠Φ改造后文法不是LL(1)文法37第五章LL1文法及其分析程序5.5确定的自顶向下分析方法特征——根据下一个(几个)输入符号为当前要处理的非终结符选择产生式要求——文法是LL(1)的第一个L从左到右扫描输入串第二个L生成的是最左推导
1向前看一个输入符号(lookahead)38第五章LL1文法及其分析程序无回溯的自顶向下分析程序预测分析程序的实现技术
1.递归(下降)子程序
2.表驱动分析程序39第五章LL1文法及其分析程序例:递归下降子程序ParseFunction()BNF(Backus-NaurForm)描述program–>function_listfunction_list–>functionfunction_list|
function–>FUNCidentifier(parameter_list)statement…voidParseFunction(){MatchToken(T_FUNC);ParseIdentifier();MatchToken(T_LPAREN);ParseParameterList();MatchToken(T_RPAREN);ParseStatement();}40第五章LL1文法及其分析程序例:递归下降子程序ParseFunction()(续)voidMatchToken(intexpected){if(lookahead!=expected){printf("syntaxerror\n");exit(0);}else//ifmatch,consumetokenandmoveonlookahead=yylex();//读入一个单词}41第五章LL1文法及其分析程序预测分析程序的实现
表驱动预测分析程序模型Input#总控程序预测分析表stack42第五章LL1文法及其分析程序预测分析表构造算法1.对文法G的每个产生式A
执行第二步和第三步;2.对每个终结符aFIRST(),把A
加至[A,a]中,3.若FIRST(),则对任何bFOLLOW(A)
把A
加至[A,b]中,4.把所有无定义的[A,a]标上“出错标志”。可以证明,一个文法G的预测分析表不含多重入口,当且仅当该文法是LL(1)的43第五章LL1文法及其分析程序
例:表驱动予测分析程序G[E]:(1)E–>TE’(2)E’–>+TE’(3)E’–>
(4)T–>FT’(5)T’–>*FT’(6)T’–>
(7)F–>(E)(8)F–>a
用预测分析表表示状态转换。44第五章LL1文法及其分析程序
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–>a
预测分析表45第五章LL1文法及其分析程序表驱动预测分析程序分析算法
首先把’#‘然后把文法开始符号推入栈;把第一个输入符号读进b;
FLAG:=TRUE;
WHILEFLAGDOBEGIN
把栈顶符号上托出去并放在X中;
IFXVtTHENIFX=bTHEN
把下一个输入符号读进bELSEERRORELSEIFX=‘#’THENIFb=‘#’THENFLAG:=FALSEELSEERRORELSEIF[X,b]={X–>
X1X2..XK}THEN把XK,XK-1,..,X1一一推进栈ELSEERRORENDOFWHILE;STOP/*分析成功,过程完毕*/46第五章LL1文法及其分析程序分析输入串#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###47第五章LL1文法及其分析程序LL(1)分析中的一种错误处理办法发现错误1栈顶的终结符与当前输入符不匹配2非终结符A于栈顶,面临的输入符为a,但分析表M的M[A,a]为空“应急”恢复策略跳过输入串中的一些符号直至遇到“同步符号”为止。同步符号的选择1把FOLLOW(A)中的所有符号作为A的同步符号。跳过输入串中的一些符号直至遇到这些“同步符号”,把A从栈中弹出,可使分析继续2把FIRST(A)中的符号加到A的同步符号集,当FIRST(A)中的符号在输入中出现时,可根据A恢复分析48第五章LL1文法及其分析程序review---parsingThesyntaxanalysisphaseofacompilerverifiesthatthesequenceoftokensreturnedfromthescannerrepresentvalidsentencesinthegrammaroftheprogramminglanguage.Therearetwomajorparsingapproaches:top-downandbottom-up.Intop-downparsing,youstartwiththestartsymbolandapplytheproductionsuntilyouarriveatthedesiredstring.Inbottom-upparsing,youstartwiththestringandreduceittothestartsymbolbyapplyingtheproductionsbackwards.49第五章LL1文法及其分析程序Inthetop-downparsing,webeginwiththestartsymbolandateachstep,expandoneoftheremainingnonterminalsbyreplacingitwiththerightsideofoneitsproductions.Werepeatuntilonlyterminalsremain.Thetop-downparseprintsaleftmostderivationofthesentence.Abottom-upparseworksinreverse.Webeginwiththesentenceofterminalsandeachstepappliesaproductioninreverse,replacingasubstringthatmatchestherightsidewiththenonterminalontheleft.Wecontinueuntilwehavesubstitutedourwaybacktothestartsymbol.Ifyoureadfromthebottomtotop,thebottom-upparseprintsoutarightmostderivationofthesentence.50第五章LL1文法及其分析程序
lookaheadsymbol.Thelookaheadsymbolisthenextsymbolcomingupintheinput.backtracking.Basedontheinformationtheparsercurrentlyhasabouttheinput,adecisionismadetogowithoneparticularproduction.Ifthischoiceleadstoadeadend,theparserwouldhavetobacktracktothatdecisionpoint,movingbackwardsthroughtheinput,andstartagainmakingadifferentchoiceandsoonuntiliteitherfoundtheproductionthatwastheappropriateoneorranoutofchoices.51第五章LL1文法及其分析程序predictiveparserandLL(1)grammarPredictiveparserisanon-backtrackingtop-downparser.Apredictiveparserischaracterizedbyitsabilitytochoosetheproductiontoapplysolelyonthebasisofthenextinputsymbolandthecurrentnonterminalbeingprocessed.Toenablethis,thegrammarmusttakeaparticularform.WecallsuchagrammarLL(1).Thefirst“L”meanswescantheinputfromlefttoright;thesecond“L”meanswecreatealeftmostderivation;andthe1meansoneinputsymboloflookahead.52第五章LL1文法及其分析程序recursive-descentThefirsttechniqueforimplementingapredictiveparseriscalledrecursive-descent.Arecursivedescentparserconsistsofseveralsmallfunctions(procedures),oneforeachnonterminalinthegrammar.Asweparseasentence,wecallthefunctions(procedures)thatcorrespondtotheleftsidenonterminaloftheproductionsweareapplying.Iftheseproductionsarerecursive,weendupcallingthefunctionsrecursively.53第五章LL1文法及其分析程序Table-drivenLL(1)parsingInarecursive-descentparser,theproductioninformationisembeddedintheindividualparsefunctionsforeachnonterminalandtherun-timeexecutionstackiskeepingtrackofourprogressthroughtheparse.Thereisanothermethodforimplementingapredictiveparserthatusesatabletostorethatproductionalongwithanexplicitstacktokeeptrackofwhereweareintheparse.54第五章LL1文法及其分析程序Howatable-drivenpredictiveparserworksWepushthestartsymbolonthestackandreadthefirstinputtoken.Astheparserworksthroughtheinput,therearethefollowingpossibilitiesforthetopstacksymbolXandtheinputtokennonterminala:1.IfX=aanda=endofinput(#):parserhaltsandparsecompletedsuccessfully2.IfX=aanda!=#:successfulmatch,popXandadvancetonextinputtoken.Thisiscalledamatchaction.3.IfX!=aandXisanonterminal,popXandconsulttableat[X,a]toseewhichproductionapplies,pushrightsideofproductiononstack.Thisiscalledapredictaction.4.Ifnoneoftheprecedingcasesappliesorthetableentryfromstep3isblank,therehasbeenaparseerror55第五章LL1文法及其分析程序Thefirstsetofasequenceofsymbolsu,writtenasFirst(u)isthesetofterminalswhichstartallthesequencesofsymbolsderivablefromu.Abitmoreformally,considerallstringsderivablefromubyaleftmostderivation.Ifu=>*v,wherevbeginswithsometerminal,thatterminalisinFirst(u).Ifu=>*,then
isinFirst(u).56第五章LL1文法及其分析程序ThefollowsetofanonterminalAisthesetofterminalsymbolsthatcanappearimmediatelytotherightofAinavalidsententialform.Abitmoreformally,foreveryvalidsententialformS=>*uAv,wherevbeginswithsometerminal,thatterminalisinFollow(A).57第五章LL1文法及其分析程序CalculatingfirstsetTocalculateFirst(u)whereuhastheformX1X2...Xn,dothefollowing:1.IfX1isaterminal,thenaddX1toFirst(u),otherwiseaddFirst(X1)-
toFirst(u).2.IfX1isanullablenonterminal,i.e.,X1=>*
,addFirst(X2)-
toFirst(u).Furthermore,ifX2canalsogoto,thenaddFirst(X3)-
andsoon,throughallXnuntilthefirstnonnullableone.3.IfX1X2...Xn=>*
,add
tothefirstset.58第五章LL1文法及其分析程序Calculatingfollowsets.Foreachnonterminalinthegrammar,dothefollowing:1.Place#
inFollow(S)whereSisthestartsymboland#
istheinput'srightendmarker.Theendmarkermightbeendoffile,itmightbenewline,itmightbeaspecialsymbol,whateveristheexpectedendofinputindicationforthisgrammar.Wewilltypicallyuse#astheendmarker.2.ForeveryproductionA–>uBvwhereu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一年级数学先学后教下册教案前五单元
- 癫痫疾病查房
- 五年级下册语文教案 语文园地五(人教部编版)
- 逆向设计与3D打印案例教程 课件 2-1认识3D打印技术、2-2 3D打印的种类及应用、2-3 3D打印国内外发展现状及发展前景
- 三年级下册美术教学设计及教学反思-第20课 小泥人|苏少版
- 2022年度辽宁省安全员之B证(项目负责人)题库综合试卷A卷附答案
- 2022年度辽宁省安全员之A证(企业负责人)题库检测试卷B卷附答案
- 学生歌颂老师的演讲稿
- 打架处分决定范文(11篇)
- 2024年平板型太阳热水器项目投资建议书
- 电源管理芯片测试的综述报告
- 福建省福州某中学2022-2023年七年级下册期末数学试题
- 完整的弱电项目实施方案
- 2024年德阳经济技术开发区社会事业局招考聘用编外保教工作人员11人高频考题难、易错点模拟试题(共500题)附带答案详解
- 国家开放大学(电大)-汉语言文学(本科)笔试(2018-2023年)真题摘选含答案
- 化学与艺术设计
- 对外汉语听力课教学课件
- 诗词大赛试题题库及答案
- 2023年四川省眉山市中考生物真题(含答案)
- 超级沟通力:美国传奇主持人拉里金的说话之道
- 教育评估报告的撰写步骤
评论
0/150
提交评论