版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四章 語法分析趙建華南京大學計算機系2010.31fhfh程序設(shè)計語言構(gòu)造的描述程序設(shè)計語言構(gòu)造的語法可使用上下文無關(guān)文法或BNF表示法來描述文法可給出精確易懂的語法規(guī)則可以自動構(gòu)造出某些類型的文法的語法分析器文法指出了語言的結(jié)構(gòu),有助于進一步的語義處理/代碼生成。支持語言的演化和迭代。2fhfh語法分析器的作用基本作用從詞法分析器獲得詞法單元的序列,確認該序列是否可以由語言的文法生成。對于語法錯誤的程序,報告錯誤信息對于語法正確的程序,生成語法分析樹。通常并不真的生產(chǎn)這棵語法分析樹3fhfh語法分析器的分類通用語法分析器可以對任意文法進行語法分析效率很低,不適合用于編譯器自頂向下語法分析器
2、從語法分析樹的根部開始構(gòu)造語法分析樹自底向上語法分析器從語法分析樹的葉子開始構(gòu)造語法分析樹后兩種方法總是從左到右、逐個掃描詞法單元。只能處理特定類型的文法,但是這些文法足以用來描述程序設(shè)計語言。4fhfh上下文無關(guān)文法定義:一個上下文無關(guān)文法包含四個部分終結(jié)符號:組成串的基本符號(詞法單元名字)非終結(jié)符號:表示串的集合的語法變量。給出了語言的層次結(jié)構(gòu)。在程序設(shè)計語言中通常對應(yīng)于某個程序構(gòu)造,比如stmt(語句)開始符號:某個被指定的非終結(jié)符號。它對應(yīng)的串的集合就是文法的語言產(chǎn)生式集合:描述將終結(jié)符號和非終結(jié)符號組成串的方法產(chǎn)生式的形式:頭/左部 體/右部頭部是一個非終結(jié)符號,右部是一個符號串;
3、例子:expression expression + term5fhfh上下文無關(guān)文法的例子簡單算術(shù)表達式的文法:終結(jié)符號:id + - * / ( )非終結(jié)符號:expression, term, factor開始符號:expression產(chǎn)生式集合:expression expression + termexpression expression termexpression termterm term * factorterm term / factorterm factorfactor (expression)factor id6fhfh文法書寫的約定終結(jié)符號靠前的小寫字母(a,b,c
4、);運算符號(+ *);標點符號;數(shù)位;黑體字符串(id, if, while)非終結(jié)符號靠前的大小字母(A,B,C);字母S(通常是開始符號);小寫斜體字母;表示程序構(gòu)造的大寫字母X,Y,Z文法符號(終結(jié)符號或非終結(jié)符號)小寫希臘字母表示文法符號串(, , )靠后的小寫字母表示終結(jié)符號串具有相同頭的產(chǎn)生式可以合并成A 1 | 2| | n的形式通常第一個產(chǎn)生式的左部就是開始符號。7fhfh文法簡單形式的例子E E + T | E T | TT T * F | T / F | FF ( E ) | id注意:| 是元符號(即文法描述方式中的符號,而不是文法符號)這里(,)不是元符號;在有些地方
5、會把( )看作元符號8fhfh推導(1)推導:將待處理的串中的某個非終結(jié)符號替換為這個非終結(jié)符號的某個產(chǎn)生式的體。從開始符號出發(fā),不斷進行上面的替換,就可以得到文法的不同句型例子文法: E -E | E+E | E*E | (E) | id推導序列:E = -E = -(E) = -(id)9fhfh推導(2)推導的正式定義如果A是一個產(chǎn)生式,那么A = 最左(右)推導:()中不包含非終結(jié)符號符號:經(jīng)過零步或者多步推導出:對于任何串 如果 且=,那么 經(jīng)過一步或者多步推導出: 等價于 且不等于10fhfh句型/句子/語言句型(sentential form):如果S=*= ,那么就是文法的句型
6、可能既包含非終結(jié)符號,又包含終結(jié)符號;可以是空串句子(sentence)文法的句子就是不包含非終結(jié)符號的句型語言文法G的語言就是G的句子的集合,記為L(G)w在L(G)中當且僅當w是G的句子,即S=*=w11fhfh語法分析樹推導的圖形表示形式根結(jié)點的標號時文法的開始符號每個葉子結(jié)點的標號是非終結(jié)符號、終結(jié)符號或每個內(nèi)部節(jié)點的標號是非終結(jié)符號。每個內(nèi)部結(jié)點表示某個產(chǎn)生式的一次應(yīng)用內(nèi)部結(jié)點的標號為產(chǎn)生式頭,結(jié)點的子結(jié)點從左到右是產(chǎn)生式的體有時允許樹的根不是開始符號(對應(yīng)于某個短語)。樹的葉子組成的序列是根的文法符號的句型一棵分析樹可對應(yīng)多個推導序列,但是分析樹和最左(右)推導序列之間具有一一對應(yīng)
7、關(guān)系12fhfh語法分析樹的例子文法: E -E | E+E | E*E | (E) | id句子:-(id+id)13fhfh從推導序列構(gòu)造分析樹假設(shè)有推導序列:A=a1=a2 = = an算法:初始化:a1的分析樹是標號為A的單個結(jié)點假設(shè)已經(jīng)構(gòu)造出ai-1=X1X2Xk的分析樹,且ai-1到a1的推導是將Xj替換為,那么在當前分析樹中找出第j個非結(jié)點,向這個結(jié)點增加構(gòu)成的子結(jié)點。如果=,則增加一個標號為的子結(jié)點)14fhfh構(gòu)造分析樹的例子推導序列:E = -E = -(E) = -(E+E) = -(id+E) = -(id+id)15fhfh二義性(1)二義性(ambiguous):一
8、個文法可以為某個句子生成多棵語法分析樹,這個文法就是二義性的例子:E = E+E = id+E=id+E*E = id+id*E=id+id*idE = E*E = E+E*E=id+E*E = id+id*E= id+id*id16fhfh二義性(2)程序設(shè)計語言的文法通常都應(yīng)該是無二義性的否則就會導致一個程序有多種“正確”的解釋。比如文法: E -E | E+E | E*E | (E) | id 的句子a+b*c但有些二義性的情況可以方便文法或語法分析器的設(shè)計。但是需要消二義性規(guī)則來剔除不要的語法分析樹比如:先乘除后加減17fhfh證明文法生成的語言證明文法G生成語言L可以幫助我們了解文法
9、可以生成什么樣的語言。基本步驟:首先證明L(G)L然后證明LL(G)一般使用數(shù)學歸納法證明L(G)L的方法之一:構(gòu)造L,使得LVt*=L;并證明SL,且對于L中的任意,=可推出也在L中。也可以按照推導序列長度進行數(shù)學歸納證明LL(G)時,通??砂凑辗柎拈L度來構(gòu)造推導序列。18fhfh文法生成語言的例子(1)文法:S(S)S | 語言:所有具有對稱括號對的串L(G)L的證明:令L=刪除S后括號對稱的串,顯然有LVt*=L且S L任意的刪除S后括號對稱的串,不管使用S還是(S)S 推導出串,刪除中的S后得到的串仍然是括號對稱的。有上面兩點可知:G的所有句型都屬于L,且L中的終結(jié)符號串就是L???/p>
10、知L(G)L。19fhfh文法生成語言的例子(2)LL(G)的證明:注意:括號對稱的串的長度必然是偶數(shù)。歸納基礎(chǔ):如果括號對稱的串的長度為0,顯然它可以從S推導得到歸納步驟:假設(shè)長度小于2n的括號對稱的串都能夠由S推導得到。假設(shè)w是括號對稱且長度為2n的串w必然以左括號開頭,且w可以寫成(x)y的形式,其中x也是括號對稱的。因為x、y的長度都小于2n,根據(jù)歸納假設(shè),x和y都可以從S推導得到。因此S=(S)S=*=(x)y。20fhfh上下文無關(guān)文法和正則表達式(1)上下文無關(guān)文法比正則表達式的能力更強。即:所有的正則語言都可以使用文法描述但是一些用文法描述的語言不能用正則文法描述。證明:首先S
11、aSb | ab 描述了語言anbn|n0,但是這個語言無法用DFA識別。假設(shè)有DFA識別此語言,且這個文法有K個狀態(tài)。那么在識別ak+1的輸入串時,必然兩次到達同一個狀態(tài)。設(shè)自動機在第i個和第j個a時進入同一個狀態(tài),那么:因為DFA識別L,ajbj必然到達接受狀態(tài),因此aibj必然也到達接受狀態(tài)。直觀地講:有窮自動機不能數(shù)(大)數(shù)。21fhfh上下文無關(guān)文法和正則表達式(2)證明(續(xù))其次證明:任何正則語言都可以表示為上下文無關(guān)文法的語言。任何正則語言都必然有一個NFA。對于任意的NFA構(gòu)造如下的上下文無關(guān)文法對NFA的每個狀態(tài)i,創(chuàng)建非終結(jié)符號Ai。如果有i在輸入a上到達j的轉(zhuǎn)換,增加產(chǎn)生
12、式AiaAj。如果i在輸入上到達j,那么增加產(chǎn)生式AiAj.如果i是一個接受狀態(tài),增加產(chǎn)生式Ai如果i是開始狀態(tài),令A(yù)i為所得文法的開始符號。22fhfhNFA構(gòu)造文法的例子A0aA0 | bA0 | aA1A1bA2A2bA3A3 考慮baabb的推導和接受過程可知:NFA接受一個句子的運行過程實際是文法推導出該句子的過程。23fhfh設(shè)計文法文法能夠描述程序設(shè)計語言的大部分語法但不是全部,比如:標識符的先聲明后使用無法用上下文無關(guān)文法描述。因此:語法分析器接受的語言是程序設(shè)計語言的超集。必須通過語義分析來剔除一些符合文法、但不合法的程序。24fhfh二義性的消除(1)一些二義性文法可以被改
13、成等價的無二義性的文法例子:stmt if expr then stmt| if expr then stmt else stmt|otherif E1 then if E2 then S1 else S2的兩棵語法樹25fhfh二義性的消除(2)為了保證“else和最近未匹配的then匹配”,我們要求在then分支的語句必須是匹配好的。引入matched_stmt表示匹配好的語句,有如下文法:stmt matched_stmt | open_stmtmatched_stmt if expr then matched_stmt else matched_stmt | otheropen_stm
14、t if expr then stmt| if expr then matched_stmt else open_stmt二義性的消除方法沒有規(guī)律可循。通常并不是通過改變文法來消除二義性。26fhfh左遞歸的消除左遞歸的定義:如果一個文法中有非終結(jié)符號A使得A=*=A,那么這個文法就是左遞歸的。立即左遞歸(規(guī)則左遞歸)文法中存在一個形如AA的產(chǎn)生式。自頂向下的語法分析技術(shù)不能處理左遞歸的情況,因此需要消除左遞歸;但是自底向上的技術(shù)可以處理左遞歸。27fhfh立即左遞歸的消除假設(shè)非終結(jié)符號A存在立即左遞歸的情形,假設(shè)以A為左部的規(guī)則有:A A1 | A2 | Am | 1 | 2 | | n 可
15、以替換為A1A | 2A| | n AA1A | 2A | mA | 由A生成的串總是以某個i開頭,然后跟上零個或者多個i的重復(fù)。28fhfh通用的左遞歸消除方法輸入:沒有環(huán)和產(chǎn)生式的文法G輸出:等價的無左遞歸的文法步驟:將文法的非終結(jié)符號任意排序為A1,A2,Anfor i=1 to n do for j = 1 to i-1 do將形如Ai Aj的產(chǎn)生式替換為Ai1| 2 | |n,其中Aj 1| 2| m是以Aj為左部的所有產(chǎn)生式;消除Ai的立即左遞歸;內(nèi)層循環(huán)的每一次迭代保證了Ai的產(chǎn)生式的右部首符號都比Aj更加靠后。當內(nèi)層循環(huán)結(jié)束時,Ai的產(chǎn)生式的右部首符號不先于Ai。消除立即左遞歸
16、就保證了Ai的產(chǎn)生式的右部首符號必然比Ai后。(不能有環(huán)和產(chǎn)生式)當外層循環(huán)結(jié)束時,所有的產(chǎn)生式都是如此。使用這些產(chǎn)生式當然不會產(chǎn)生左遞歸的情形。29fhfh通用左遞歸消除的例子S Aa | bAAc | Sd | 步驟1:排列為S,Ai=1時:內(nèi)層循環(huán)不運行,S沒有立即左遞歸;i=2時:j=1,處理規(guī)則ASd;替換得到AAc | Aad | bd | 消除A的立即左遞歸SAa | bAbdA | AAcA | adA | 通用左遞歸消除的問題在于很難找到新文法和舊文法的推導之間的對應(yīng)關(guān)系,因此很難依據(jù)新文法進行語義處理。本例子中的產(chǎn)生式恰好沒有影響算法的正確性30fhfh預(yù)測分析法簡介試圖從
17、開始符號推導出輸入符號串;以開始符號作為初始的當前句型每次為最左邊的非終結(jié)符號選擇適當?shù)漠a(chǎn)生式;通過查看下一個輸入符號來選擇這個產(chǎn)生式。有多個可能的產(chǎn)生式時預(yù)測分析法無能為力比如文法:E +EE | -EE | id;輸入為+ id - id id當兩個產(chǎn)生式具有相同的前綴時無法預(yù)測文法:stmt if expr then stmt else stmt | if expr then stmt輸入:if a then 新文法:stmt if expr then stmt elsePart elsePart else stmt | 需要提取公因子31fhfh提取公因子的文法變換算法:輸入:文法G輸
18、出:等價的提取了左公因子的文法方法:對于每個非終結(jié)符號A,找出它的兩個或者多個可選產(chǎn)生式體之間的最長公共前綴。A 1 | 2 | | n | AA | A1 | 2 | | n 其中是不以開頭的產(chǎn)生式體32fhfh提取公因子的例子文法:S i E t S | i E t S e S | aE b對于S而言,最長的前綴是i E t S,因此:S i E t S S| aSe S | E b33fhfh非上下文無關(guān)語言的構(gòu)造抽象語言 L1=wcw | w在(a|b)*中這個語言不是上下文無關(guān)的語言它抽象地表示了C或者Java中“標識符先聲明后使用”的規(guī)則。說明了這些語言不是上下文無關(guān)語言,不能使用
19、上下文無關(guān)文法描述。通常用上下文無關(guān)文法描述其基本結(jié)構(gòu),不能用文法描述的特性在語義分析階段完成。原因是上下文文法具有高效的處理算法。34fhfh自頂向下的語法分析為輸入串構(gòu)造語法分析樹從分析樹的根結(jié)點開始,按照先根次序,深度優(yōu)先地創(chuàng)建各個結(jié)點對應(yīng)于最左推導。基本步驟確定對句型中最左邊的非終結(jié)符號應(yīng)用哪個產(chǎn)生式然后對句型中的非終結(jié)符號和輸入符號進行匹配關(guān)鍵問題是:確定對最左邊的非終結(jié)符號應(yīng)用哪個產(chǎn)生式35fhfh自頂向下分析的例子文法:ETE E+TE | TFT T*FT| F(E) | id輸入id + id * id分析樹序列見右面(圖4-12)36fhfh遞歸下降的語法分析遞歸下降語法分
20、析程序由一組過程組成每個非終結(jié)符號對應(yīng)于一個過程,該過程負責掃描非終結(jié)符號對應(yīng)的結(jié)構(gòu)程序執(zhí)行從開始符號對應(yīng)的過程開始當掃描整個輸入串時宣布分析成功完成37fhfh遞歸下降分析技術(shù)的回溯如果沒有足夠的信息來唯一地確定可能的產(chǎn)生式,那么分析過程就產(chǎn)生回溯。前面的算法報告錯誤(第7行)并不意味著輸入串不是句子,而可能是表示前面選錯了產(chǎn)生式。第一行上保存當前的掃描指針在第七行上應(yīng)該改成回退到保存的指針;GOTO (1)并選擇下一個產(chǎn)生式;如果沒有下一個產(chǎn)生式可選,報告錯誤?;厮菪枰獊砘貟呙?,低效如果嵌入了語義處理,則需要撤銷已經(jīng)完成的語義處理動作。解決方法:設(shè)法通過一些信息確定唯一可能的產(chǎn)生式38fh
21、fh遞歸下降分析中回溯的例子文法:ScAdAab | a輸入串:cad步驟:調(diào)用函數(shù)S;S選擇唯一產(chǎn)生式ScAd輸入中的c和句型中的c匹配,繼續(xù)調(diào)用AA首先選擇產(chǎn)生式Aab,a和輸入的a匹配,b和輸入的d不匹配;回溯并選擇下一個產(chǎn)生式Aa;a和輸入的a相匹配;對A的調(diào)用返回;到S的調(diào)用;ScAd中的d和下一個輸入匹配;對S的調(diào)用返回,已經(jīng)讀入所有輸入符號;因此掃描結(jié)束,cad是句子。39fhfhFIRST和FOLLOW(1)在自頂向下的分析技術(shù)中,通常使用向前看幾個符號來唯一地確定產(chǎn)生式(這里假定只看一個符號)當前句型是xA,而輸入是xa。那么選擇產(chǎn)生式A的必要條件是下列之一:=*=,且以a開
22、頭;也就是說在某個句型中a跟在A之后;=*=a;如果按照這兩個條件選擇時能夠保證唯一性,那么我們就可以避免回溯。因此,我們定義FIRST和FOLLOW40fhfhFIRST和FOLLOW(2)FIRST():可以從推導得到的串的首符號的集合;如果=*=,那么也在FIRST()中;FOLLOW(A):可能在某些句型中緊跟在A右邊的終結(jié)符號的集合。41fhfhFIRST的計算方法計算FIRST(X)的方法如果X是終結(jié)符號,那么FIRS(X)=X如果X是非終結(jié)符號,且XY1Y2Yk是產(chǎn)生式,如果a在FIRST(Yi)中,且在FIRST(Y1), FIRST(Y2), FIRST(Yi-1)中,那么a
23、也在FIRST(X)中。如果在FIRST(Y1), FIRST(Y2), FIRST(Yk)中,那么在FIRST(X)中。如果X是非終結(jié)符號,且X是一個產(chǎn)生式,那么在FIRST(X)中計算FIRST(X1X2Xn)的方法向集合中加入FIRST(X1)中所有非的符號;如果在FIRST(X1)中,再加入FIRST(X2)中的所有非的符號;如果在所有的FIRST(X1)中,將加入FIRST(X1X2Xn)中。42fhfhFOLLOW的計算方法算法將右端結(jié)束標記$放到FOLLOW(S)中按照下面的兩個規(guī)則不斷迭代,直到所有的FOLLOW集合都不再增長為止。如果存在產(chǎn)生式AB,那么FIRST()中所有非
24、的符號都在FOLLOW(B)中。如果存在一個產(chǎn)生式AB,或者AB且FIRST()包含,那么FOLLOW(A)中的所有符號都加入到FOLLOW(B)中。請注意各個步驟中將符號加入到FOLLOW集合中的理由。43fhfhFIRST/FOLLOW的例子(1)文法:ETEE+TE | T FTT*FT | F(E) | idFIRST集合FIRST(F) = (, id;FIRST(E) =FIRST(T) = (,idFIRST(E) = +, ;FIRST(T)=*, 由此可以推出各個產(chǎn)生式右部的FIRST集合。44fhfhFIRST/FOLLOW的例子(2)FOLLOW集合的計算過程$在FOLL
25、OW(E) 中(E是開始符號)由規(guī)則F(E)可知,)也在FOLLOW(E)中由規(guī)則ETE 可知FOLLOW(E)也包含了$和)。注意:因為E只出現(xiàn)在E和E的產(chǎn)生式的尾部,因此FOLLOW(E)必然等于FOLLOW(E)。由規(guī)則E+TE,F(xiàn)IRST(E) 中的+在FOLLOW(T)中;且FIRST(E) 包含,因此FOLLOW(E)中的$和)也在FOLLOW(T)中。因為T只出現(xiàn)在T和T的產(chǎn)生式的末尾,可以FOLLOW(T)=FOLLOW(T);由規(guī)則TFT且T可以推導出,因此可知FOLLOW(F)包含F(xiàn)OLLOW(T);同時FIRST(T)也在FOLLOW(F)中。因此E:$,) E:$,)T
26、,T:+, ), $F:+,*,),$45fhfhLL(1)文法(1)定義:對于文法的任意兩個不同的產(chǎn)生式A|不存在終結(jié)符號a使得和都可以推導出以a開頭的串和最多只有一個可以推導出空串如果可以推導出空串,那么不能推導出以FOLLOW中任何終結(jié)符號開頭的串;等價于:FIRST()FIRST()=;(條件一、二)如果FIRST(),那么FIRST() FOLLOW(A)=;反之亦然。(條件三)考慮:對于一個LL(1)文法,我們期望從A推導出以終結(jié)符號a開頭的符號串,我們?nèi)绾芜x擇產(chǎn)生式?有多個選擇嗎?46fhfhLL(1)文法(2)對于LL(1)文法,可以在自頂向下分析過程中,根據(jù)當前輸入符號來確定
27、使用的產(chǎn)生式。例如:產(chǎn)生式:stmt if (exp) stmt else stmt | while (exp) stmt | a輸入:if (exp) while (exp) a else a首先選擇產(chǎn)生式stmt if (exp) stmt else stmt 得到句型if (exp) stmt else stmt 然后發(fā)現(xiàn)要把句型中的第一個stmt展開,選擇產(chǎn)生式stmt while (exp) stmt,得到句型if (exp) while (exp) stmt else stmt 。然后再展開第一個stmt,得到if (exp) while (exp) a else stmt 47f
28、hfh預(yù)測分析表構(gòu)造算法輸入:文法G輸出:預(yù)測分析表M方法:對于文法G的每個產(chǎn)生式A對于FIRST()中的每個終結(jié)符號a,將A加入到MA,a中;如果在FIRST(),那么對于FOLLOW(A)中的每個符號b,將將A加入到MA,b中。最后在所有的空白條目中填入error。48fhfh預(yù)測分析表的例子文法:ETEE+TE | T FTT*FT | F(E) | idFIRST集:F:(, id;E,T:(,id;E: +, ;T:*, FOLLOW集:E:$,) E:$,)T,T:+, ), $F:+,*,),$這個例子恰巧使得每個產(chǎn)生式的右部的第一個符號的FIRST集合就等于產(chǎn)生式右部的FIRS
29、T集合。但是在一般情況下不總是這樣的。49fhfh預(yù)測分析表沖突的例子文法:SiEtSS | aSeS | EbFIRST(eS)=e,使得SeS在MS,e中;FOLLOW(S)=$,e使得S 也在MS,e中注意:LL(1)文法必然不是二義性的;而這個文法是二義性的50fhfhLL(1)文法的遞歸下降分析遞歸下降語法分析程序由一組過程組成每個非終結(jié)符號對應(yīng)于一個過程,該過程負責掃描非終結(jié)符號對應(yīng)的結(jié)構(gòu)可以使用當前的輸入符號來唯一地選擇產(chǎn)生式如果當前輸入符號為a,那么選擇MA,a中的產(chǎn)生式51fhfh非遞歸的預(yù)測分析(1)在自頂向下分析的過程中,我們總是匹配掉句型中左邊的所有終結(jié)符號;對于最左邊
30、的非終結(jié)符號,我們選擇適當?shù)漠a(chǎn)生式展開。匹配成功的終結(jié)符號不會再被考慮,因此我們只需要記住句型的余下部分,以及尚未匹配的輸入終結(jié)符號串。由于展開的動作總是發(fā)生在余下部分的左端,我們可以用棧來存放這些符號。52fhfh非遞歸的預(yù)測分析(2)分析時的處理過程:初始化時,棧中僅包含開始符號;如果棧頂元素是終結(jié)符號,那么進行匹配如果棧頂元素是非終結(jié)符號使用預(yù)測分析表來選擇適當?shù)漠a(chǎn)生式;在棧頂用產(chǎn)生式右部替換產(chǎn)生式左部;因此對所有文法的預(yù)測分析都可以共用同樣的驅(qū)動程序。53fhfh分析表驅(qū)動的預(yù)測分析器性質(zhì)1:如果棧中的符號序列為,而w是已經(jīng)被讀入的部分輸入,w是尚未處理的輸入;那么S推導出w我們試圖從
31、推導出余下的輸入終結(jié)符號串w預(yù)測分析程序使用MX,a來擴展X,將此產(chǎn)生式的右部按倒序壓入棧中請注意:這樣的操作使得分析過程中性質(zhì)1得到保持。54fhfh預(yù)測分析算法輸入:串w,預(yù)測分析表M輸出:如果w是句子,輸出w的最左推導;否則報錯方法:初始化:輸入緩沖區(qū)中為w $;棧中包含S$;ip指向w的第一個符號;令X=棧頂符號,ip指向符號aif(X=a) 出棧,ip向前移動;/*和終結(jié)符號的匹配*/else if (X是終結(jié)符號) error();/*失配*/else if (MX,a是報錯條目) error();/*無適當?shù)漠a(chǎn)生式*/else if (MX,a=XY1Y2Yk) 輸出產(chǎn)生式XY1
32、Y2Yk;彈出棧頂符號X;將Yk,Yk-1,Y1壓入棧中;不斷執(zhí)行第二步;直到要么報錯,要么棧中為空55fhfh分析表驅(qū)動預(yù)測分析的例子文法4.28,輸入:id+id*id;注意:已經(jīng)匹配部分加上棧中符號必然是一個最左句型56fhfh預(yù)測分析中的錯誤恢復(fù)錯誤恢復(fù)當預(yù)測分析器報錯時,表示輸入的串不是句子。對于使用者而言,希望預(yù)測分析器能夠進行恢復(fù),并繼續(xù)語法分析過程,以便在一次分析中找到更多的語法錯誤。有可能恢復(fù)得并不成功,之后找到的語法錯誤有可能是假的。進行錯誤恢復(fù)時可用的信息:棧里面的符號,待分析的符號兩類錯誤恢復(fù)方法:恐慌模式短語層次的恢復(fù)57fhfh恐慌模式基本思想語法分析器忽略輸入中的
33、一些符號,直到出現(xiàn)由設(shè)計者選定的某個同步詞法單元;解釋:語法分析過程總是試圖在輸入的前綴中找到和某個非終結(jié)符號對應(yīng)的串;出現(xiàn)錯誤表明現(xiàn)在已經(jīng)不可能找到這個非終結(jié)符號(程序結(jié)構(gòu))的串。如果編程錯誤僅僅局限于這個程序結(jié)構(gòu),那么我們可以考慮跳過這個程序結(jié)構(gòu),假裝已經(jīng)找到了這個結(jié)構(gòu);然后繼續(xù)進行語法分析處理。同步詞法單元就是這個程序結(jié)構(gòu)結(jié)束的標志。58fhfh同步詞法單元的確定非終結(jié)符號A的同步集合的啟發(fā)式規(guī)則FOLLOW(A)的所有非終結(jié)符號A的同步集合中這些符號的出現(xiàn)可能表示之前的那些符號是錯誤的A的串;將高層次的非終結(jié)符號對應(yīng)串的開始符號加入到較低層次的非終結(jié)符號的同步集合比如語句的開始符號,i
34、f,while等可以作為表達式的同步集合;FIRST(A)中的符號加入到非終結(jié)符號A的同步集合。碰到這些符號時,可能意味著前面的符號是多余的符號如果A可以推導出空串,那么把此產(chǎn)生式當作默認值。在匹配時出現(xiàn)錯誤,可以直接彈出相應(yīng)的符號;哪些符號需要確定同步集合需要根據(jù)特定的應(yīng)用而定。59fhfh恐慌模式的例子(1)對文法4.28的表達式進行語法分析時,可以直接使用FIRST、FOLLOW作為同步集合。我們?yōu)镋、T和F設(shè)定同步集合;空條目表示忽略輸入符號;synch條目表示忽略到同步集合,然后彈出非終結(jié)符號;終結(jié)符號不匹配時,彈出棧中終結(jié)符號;60fhfh恐慌模式的例子(2)錯誤輸入:id * +
35、 id61fhfh短語層次的恢復(fù)在預(yù)測語法分析表的空白條目中插入錯誤處理例程的函數(shù)指針;例程可以改變、插入或刪除輸入中的符號;發(fā)出適當?shù)腻e誤消息;62fhfh自底向上的語法分析為一個輸入串構(gòu)造語法分析樹的過程;從葉子(輸入串中的終結(jié)符號,將位于分析樹的底端)開始,向上到達根結(jié)點;在實際的語法分析過程中并不會真的構(gòu)造出相應(yīng)的分析樹,但是分析樹概念可以方便理解;重要的自底向上語法分析的通用框架移入-歸約;LR:最大的可以構(gòu)造出移入-歸約語法分析器的語法類63fhfh分析過程示例64fhfh歸約自底向上語法分析過程看成從串w“歸約”為文法開始符號的過程;歸約步驟:一個與某產(chǎn)生式體相匹配的特定子串被替
36、換為該產(chǎn)生式頭部的非終結(jié)符號;問題:何時歸約(歸約哪些符號串)?歸約到哪個非終結(jié)符號?65fhfh歸約的例子id * id的歸約過程id * id ,F(xiàn)*id,F(xiàn)*id,T*F,T,E對于句型T*id,有兩個子串和某產(chǎn)生式右部匹配T是ET的右部;id是Fid的右部;為什么選擇將id歸約為F,而不是將T歸約為E?原因:T歸約為E之后,E*id不再是句型;問題:如何確定這一點?66fhfh句柄剪枝對輸入從左到右掃描,并進行自底向上語法分析,實際上可以反向構(gòu)造出一個最右推導;句柄:最右句型中和某個產(chǎn)生式體匹配的子串,對它的歸約代表了該最右句型的最右推導的最后一步;正式定義:如果S Aw w;那么緊跟
37、之后的A的一個句柄;在一個最右句型中,句柄右邊只有終結(jié)符號如果文法是無二義性的,那么每個句型都有且只有一個句柄。67fhfh句柄的例子輸入:id *id68fhfh移入-歸約分析技術(shù)使用一個棧來保存歸約/掃描移入的文法符號;棧中符號(從底向上)和待掃描的符號組成了一個最右句型;開始時刻:棧中只包含$,而輸入為w$;成功結(jié)束時刻:棧中$S,而輸入$;在分析過程中,不斷地移入符號,并在識別到句型時進行歸約;句柄被識別時總是出現(xiàn)在棧的頂部;69fhfh主要分析動作移入:將下一個輸入符號移動到棧頂;歸約:將句柄歸約為相應(yīng)的非終結(jié)符號;句柄總是在棧頂。具體操作時彈出句柄,壓入被歸約到的非終結(jié)符號。接受:
38、宣布分析過程成功完成;報錯:發(fā)現(xiàn)語法錯誤,調(diào)用錯誤恢復(fù)子程序;70fhfh歸約分析過程的例子71fhfh為什么句柄總是在棧頂?(1)為什么每次歸約得到的新句型的句柄仍不在棧頂?考慮最右推導的兩個連續(xù)步驟的兩種情況A被替換為By,然后產(chǎn)生式體中的最右非終結(jié)符號B被替換為。(歸約之后句柄為By)A首先被展開,產(chǎn)生式體中只包含終結(jié)符號;下一個最右非終結(jié)符號B位于y左側(cè)。y是終結(jié)符號串72fhfh移入-歸約分析中的沖突對于有些不能使用移入-歸約分析的文法,不管用什么樣的移入-歸約分析器都會到達這樣的格局即使知道了棧中所有內(nèi)容、以及下面k個輸入符號,人們?nèi)匀粺o法知道是否該進行歸約,或者不知道按照什么產(chǎn)生
39、式進行歸約;形式化地表達:設(shè)棧中符號串是,接下來的k個符號是x,產(chǎn)生移動/歸約沖突的原因是存在y和y使得axy是最右句型且是句柄,而axy也是最右句型,但是句柄還在右邊。73fhfh歸約/歸約沖突的例子輸入為id ( id , id )沖突時的格局:棧:id ( id輸入:, id ) 某個語言中,多維數(shù)組的表示方法。74fhfhLR語法分析技術(shù)LR(k)的語法分析概念L表示最左掃描,R表示反向構(gòu)造出最右推導;k表示最多向前看k個符號;當k的數(shù)量增大時,相應(yīng)的語法分析器的規(guī)模急劇增大;K=2時,程序設(shè)計語言的語法分析器的規(guī)模通常非常龐大;當k=0、1時已經(jīng)可以解決很多語法分析問題,因此具有實踐
40、意義。因此,我們只考慮k12w,那么我們說項A1 . 2么對1有效。102fhfhSLR的原理:可行前綴(2)如果我們知道A1 . 2對1有效,當2不等于空,表示句柄尚未出現(xiàn)在棧中,應(yīng)該移入或者等待歸約;如果2等于空,表示句柄出現(xiàn)在棧中,應(yīng)該歸約。如果某個時刻存在兩個有效項要求執(zhí)行不同的動作,那么就應(yīng)該設(shè)法解決沖突。沖突實際上表示可行前綴可能是兩個最右句型的前綴,第一個包含了句柄,而另一個尚未包含句型E+T+id E+T*idSLR解決沖突的思想:假如要按照A進行歸約,那么得到的新句型中A后面跟隨下一個輸入符號。因此只有當下一個輸入在FOLLOW(A)中時才可以歸約。也可能都認為包含句柄,但是
41、規(guī)則不一樣103fhfhSLR的原理:可行前綴(3)如果在文法G的LR(0)自動機中,從初始狀態(tài)出發(fā),沿著標號為的路徑到達一個狀態(tài),那么這個狀態(tài)對應(yīng)的項集就是的有效項集?;仡櫞_定分析動作的方法,就可以知道我們實際上是按照有效項來確定的。為了避免沖突,歸約時要求下一個輸入符號在FOLLOW(A)中。104fhfh活前綴/有效項的例子可行前綴E+T*對應(yīng)的LR(0)項TT*.FF.(E)F.id對應(yīng)的最右推導EEE+TE+T*FEEE+TE+T*FE+T*(E)EEE+TE+T*FE+T*id105fhfhSLR語法分析器的弱點(1)SLR技術(shù)解決沖突的方法:項集中包含A.時,按照A進行歸約的條件
42、是下一個輸入符號a可以在某個句型中跟在A之后。如果對于a還有其它的移入/歸約操作,則出現(xiàn)沖突。假設(shè)此時棧中的符號串為,如果Aa不可能是某個最右句型的前綴,那么即使a在某個句型中跟在A之后,仍然不應(yīng)該按照A歸約。進行歸約的條件更加嚴格可以降低沖突的可能性106fhfhSLR語法分析器的弱點(2)A.出現(xiàn)在項集中的條件:首先A. 出現(xiàn)在某個項集中,然后逐步讀入/歸約到中的符號,點不斷后移,到達末端。而A. 出現(xiàn)的條件是B.A出現(xiàn)在項中期望首先按照A歸約,然后將B.A中的點后移到A之后。顯然,在按照A歸約時要求下一個輸入符號是的第一個符號。但是從LR(0)項集中不能確定這個信息。107fhfh更強大
43、的LR語法分析器規(guī)范LR方法(或直接稱LR方法)添加項A. 時,把期望的向前看符號也加入項中。這個做法可以充分利用向前看符號,但是狀態(tài)很多。向前看LR(LALR方法)基于LR(0)項集族。但是每個LR(0)項都帶有向前看符號。分析能力強于SLR方法,且分析表和SLR分析表一樣大。LALR已經(jīng)可以處理大部分的程序設(shè)計語言。108fhfhLR(1)項LR(1)項中包含更多信息來消除一些歸約動作。實際的做法相當于“分裂”一些LR(0)狀態(tài),精確地指明何時應(yīng)該歸約。LR(1)項的形式A.,aa稱為向前看符號,可以是終結(jié)符號或者$a表示如果將來要按照A進行歸約,歸約時的下一個輸入符號必須是a。當非空時,
44、移入動作不考慮a,a傳遞到下一狀態(tài)。109fhfhLR(1)項和可行前綴A.,a對于一個可行前綴有效的條件是存在一個推導S Aw w,其中=,且a是w的第一個符號,或者w為空且a=$。如果A.B,a對于可行前綴有效,那么B.,b對于有效的條件是什么?S Aw Bw Bxw xw顯然:b應(yīng)該是xw的第一個符號,或xw為空且b=$。如果x為空,則b=a。如果A.X,a對于可行前綴有效, AX.,a對X有效。110fhfh可行前綴和LR(1)有效項的例子文法:SBBBaB | b最右推導:S aaBab aaaBab。對應(yīng)于前面的定義:=aa,A=Bw=ab,=a=B= = aaa因此:Ba.B,a
45、對于aaa是有效的;111fhfh構(gòu)造LR(1)項集項集族的構(gòu)造和LR(0)項集族的構(gòu)造類似,但是CLOSURE和GOTO有所不同:在CLOSURE中,當由項A.B,a生成新項B.,b時,b必須在FIRST(a)中。注意:對應(yīng)LR(1)項集族中的任意項A.B,a,總是保證a在FOLLOW(A)中初始項集滿足這個條件每次求CLOSURE項集時,新產(chǎn)生的項也滿足這個條件。112fhfhLR(1)項集的CLOSURE算法注意添加B.,b時,b的取值范圍。即點后面跟著終結(jié)符號的項113fhfhLR(1)項集的GOTO算法和LR(0)項集的GOTO算法基本相同即點后面跟文法符號X的項114fhfhLR(
46、1)項集族的主構(gòu)造算法和LR(0)項集族的構(gòu)造算法相同115fhfhLR(1)項集族的例子增廣文法SSSCCCcC | dI0=CLOSURES.S,$S.S,$,S.CC,$,C.cC,c/d,C.d,c/dGOTO(I0,S)=SS.,$GOTO(I0,C)=CLOSURESC.C,$=SC.C,$,C.cC,$,C.d,$GOTO(I0,c) =Cc.C,c/d, C.cC,c/d,C.d,c/dGOTO(I0,d) =Cd.,c/d如果它是當前狀態(tài),下一個輸入符號必須是c或者d才可以歸約116fhfhLR(1)項集的GOTO圖不計向前看符號,I3,I6相同I8,I9相同I4,I7相同如
47、果構(gòu)造LR(0)項集族,只有6個項集。117fhfhLR語法分析表的構(gòu)造步驟:構(gòu)造得到LR(1)項集族C=I0,I1,In。狀態(tài)i對應(yīng)于項集Ii。其分析動作如下:A.a,b在項集中,且GOTO(Ii,a)= Ij,那么ACTIONi,a=“移入j”A.,a在項集中, ACTIONi,a=“按照A歸約”SS.,$在項集中, ACTIONi,$=“接受”。GOTO表:GOTOi,A=j,如果GOTO(Ii,A)= Ij。沒有填寫的條目為報錯。如果條目有沖突,則不是LR(1)的。初始狀態(tài)對應(yīng)于SS.,$所在的項集。移入時不考慮向前看符號118fhfhLR(1)語法分析表的例子(3,6),(4,7),
48、(8,9)分別可以看作是由原來的一個LR(0)狀態(tài)拆分而來的。文法:SSSCCCcC | d119fhfh構(gòu)造LALR語法分析表LR(1)語法分析表的狀態(tài)數(shù)量很大SLR(1)語法分析表的分析能力較弱LALR(1)是實踐中常用的方法狀態(tài)數(shù)量和SLR(1)的狀態(tài)數(shù)量相同能夠方便地處理大部分常見的程序設(shè)計語言的構(gòu)造120fhfhLR(1)語法分析表的合并狀態(tài)4和7僅在向前看符號上有所不同。Cd. c/d vs Cd., $狀態(tài)4:下一個符號如果為c或d則歸約;為$在報錯。狀態(tài)7:分析動作正好反過來。如果我們將4和7中的項合并得47,那么在所有情況都歸約新的語法分析過程會在原來報錯時進行歸約;但是最終
49、總會報錯。對與這個文法,合并4和7不會引起任何沖突,但是有些文法會有沖突。對任意文法,如果SLR(1)分析表無沖突,合并后的分析表也無沖突。文法:SSSCCCcC | d121fhfhLALR分析技術(shù)的基本思想尋找具有相同核心的LR(1)項集,并把它們合并成為一個項集項集的核心就是項的第一分量的集合;I4和I7的核心都是Cd.,I3和I6的核心Cc.C C.cC C.d一個LR(1)項集的核心是一個LR(0)項集;GOTO(I,X)的核心只由I的核心決定,因此被合并項集的GOTO目標也可以合并。這表示合并之后,我們?nèi)匀豢梢越OTO關(guān)系。122fhfh合并引起的沖突原來無沖突的LR(1)分析
50、表在合并之后得到LALR(1)分析表;新的表中可能存在沖突。合并不會導致移入/歸約沖突假設(shè)合并之后在a上存在移入/歸約沖突,即存在項B.a,?和A.,a。因為被合并的項集具有相同的核心,因此被合并的所有項集中都包括B.a,?。而A.,a必然在某個項集中。這個項集必然已經(jīng)存在沖突!合并會引起歸約/歸約沖突,即不能確定按照哪個產(chǎn)生式進行歸約。123fhfh合并引起歸約/歸約沖突的例子文法:SS SaAd | bBd | aBe | bAe Ac Bc語言acd,ace,bcd,bce可行前綴ac的有效項集Ac.,d,Bc.,e可行前綴bc的有效項集Ac.,e,Bc.,d合并之后的項集為Ac.,d/
51、e,Bc.,d/e。這個項集包含了歸約/歸約沖突。應(yīng)該把c歸約成為A還是B?124fhfh基本的LALR分析表構(gòu)造算法步驟:構(gòu)造得到LR(1)項集族C=I0,I1,In。對于LR(1)中的每個核心,找出所有具有這個核心的項集,并把這些項集替換為它們的并集令C=J0,J1,Jn為得到的LR(1)項集族按照LR分析表的構(gòu)造方法得到ACTION表。(如果存在沖突,則這個文法不是LALR的)GOTO表的構(gòu)造:設(shè)J是一個或者多個LR(1)項集(包括I1)的并集,令K是所有和GOTO(I1,X)具有相同核心的項集的并集,那么GOTO(J,X)=K。得到的分析表稱為LALR語法分析表。125fhfhLALR
52、分析表的例子(1)文法:SSSCCCcC | d文法的LR(1)項集族中有三對可以合并的項集:I3和I6 (I36):Cc.C, c/d/$C.cC,c/d/$ C.d,c/d/$I4和I7 (I47):Cd., c/d/$I8和I9 (I89):CcC., c/d/$GOTO(I36,C)就是原來的GOTO(I3,C)(即I8)所在的并集I89。126fhfhLALR分析表的例子(2)合并后得到的LALR分析表127fhfhLALR分析表的例子(3)處理語法正確的輸入時,LALR語法分析器和LR語法分析器的動作序列完全相同。棧中的狀態(tài)名字不同,但是狀態(tài)序列之間有對應(yīng)關(guān)系:如果LR分析器壓入狀
53、態(tài)I,那么LALR分析器壓入I對應(yīng)的合并項集。比如:當前面的LR分析器壓入狀態(tài)I3時,LALR分析器壓入狀態(tài)I36。當處理錯誤的輸入時,LALR可能多執(zhí)行一些歸約動作,但是不會多移入一個符號。128fhfhLALR分析表的高效構(gòu)造算法LALR的項集可以看作是在LR(0)項集上添加了適當?shù)南蚯翱捶?。基本方法只使用?nèi)核項來表示LR(0)或LR(1)項集。只使用S.S或S.S,$,以及點不在最左端的項。使用傳播和自發(fā)生成的過程來生成向前看符號,得到LALR(1)內(nèi)核項。使用CLOSURE函數(shù),求出內(nèi)核的閉包。然后得到LALR分析表。129fhfhLALR項中的向前看符號LALR項集中的項A.,a必
54、然是具有相同核心的LR項集中的一個項。LALR項集J中包含項B.,b的條件:存在相應(yīng)的LR項集J使得下列條件之一成立LR項集I中包含項A.,a且J=GOTO(I,X),且B.,b在GOTO(CLOSURE(A.,a),X)中。b是“自發(fā)生成的”,不管a是什么,B.,b一定在J中。LR項集I中包含項A.,b且J=GOTO(I,X),且B.,b在GOTO(CLOSURE(A.,b),X)中。b是從前一個狀態(tài)傳播過來的,即A.,b在I中則B.,b在J中;若A.,c在I中則B.,b在J中。130fhfh存在LR項集I包含某個項,也就是存在LALR項集I包含該項傳播關(guān)系只取決于項的核心部分,和具體的向前
55、看符號無關(guān)要么傳播所有的向前看符號,要么都不傳播。131fhfh確定自發(fā)生成/傳播關(guān)系基本思想:引入一個特殊向前看符號#作為“指示劑”,察看這個符號可以如何傳播。令A(yù).為項集I中的一個項,對每個文法符號X計算J=GOTO(CLOSURE(A.,#),X)。檢查J中的每個內(nèi)核項,檢查它的向前看符號集合。如果項B.,#在J中就表示#從I中的A.傳播到了B.,#。其它的向前看符號都是自發(fā)生成的。132fhfh確定向前看符號的算法輸入:LR(0)項集I的內(nèi)核K以及一個文法符號輸出:向前看符號的傳播/自發(fā)生成。133fhfhLALR項集族中向前看符號的計算基本思想:以LR(0)項集為基礎(chǔ);自發(fā)生成的符號
56、首先被加入到相應(yīng)的LALR項集中;然后不停地傳播向前看符號,直到收斂。134fhfh具體算法構(gòu)造G的LR(0)項集族的內(nèi)核將確定自發(fā)生成/傳播關(guān)系的算法應(yīng)用于每個LR(0)項集的內(nèi)核和每個文法符號X,確定自發(fā)生成和傳播的向前看符號。初始化:給出每個項集和每個內(nèi)核項的自發(fā)生成的向前看符號;迭代:不斷掃描所有項集的內(nèi)核項,將項I的向前看符號加入到傳播目標項的向前看符號集合中。直到各個向前看符號集合不變?yōu)橹埂?35fhfh構(gòu)造LALR項集的例子(1)文法:SSSL=RSRL*RLidRLLR(0)項集內(nèi)核:136fhfh構(gòu)造LALR項集的例子(2)對于I0的內(nèi)核,CLOSURE(SS,#):S.S,#S.L=R,#S.R,#L.*R,#/=Lid,#/=RL,#對各文法符號計算GOTO,可知I0中的S.S將向前看符號傳播到I1: SS.I2: SL.=RI3: SR.I4: L*.RI5: Lid.I2: RL.137fhfh構(gòu)造LALR項集的例子(3)得到的傳播關(guān)系:138fhfh構(gòu)造LALR項集的例子(4)計算向前看符號傳播的迭代過程:1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年計算機科學與技術(shù)專業(yè)求職簡歷
- DB33T 2175.3-2018 人民法院訴訟服務(wù)規(guī)范 第3部分:熱線服務(wù)
- 2025委托加工合同書
- 建設(shè)年產(chǎn)8000臺智能化高效節(jié)水噴灌設(shè)備項目建議書立項備案審批
- 2024年度天津市公共營養(yǎng)師之三級營養(yǎng)師真題練習試卷A卷附答案
- 2024年度天津市公共營養(yǎng)師之二級營養(yǎng)師每日一練試卷B卷含答案
- 2024年度四川省公共營養(yǎng)師之四級營養(yǎng)師綜合練習試卷B卷附答案
- 2024年度四川省公共營養(yǎng)師之三級營養(yǎng)師能力檢測試卷B卷附答案
- 2024年度四川省公共營養(yǎng)師之二級營養(yǎng)師高分通關(guān)題型題庫附解析答案
- 2019-2025年中國真絲化纖紡織品制造行業(yè)市場調(diào)查研究及投資前景預(yù)測報告
- 水利水電工程安全管理制度例文(三篇)
- 人教版2024-2025學年第一學期八年級物理期末綜合復(fù)習練習卷(含答案)
- 《上帝擲骰子嗎:量子物理史話》導讀學習通超星期末考試答案章節(jié)答案2024年
- 病例報告表(CRF)模板
- 塔塔里尼調(diào)壓器FLBM5介紹.ppt
- 國家開放大學畢業(yè)生登記表
- CCC例行檢驗和確認檢驗程序
- 初中物理競賽教程(基礎(chǔ)篇)第16講比熱容
- 親子鑒定書(共3頁)
- 容器支腿計算公式(支腿計算主要用于立式容器的支腿受力及地腳螺栓計算)
- 建設(shè)工程項目施工安全管理流程圖3頁
評論
0/150
提交評論