文章編號(hào):1672-5913(2008)09-0059-02
摘要:本文針對(duì)“編譯原理”中語義分析和中間代碼產(chǎn)生部分的理論教學(xué),從教學(xué)手段、教學(xué)方法和教學(xué)過程等方面進(jìn)行了有益的探討和研究。
關(guān)鍵詞:編譯原理;語義分析和中間代碼產(chǎn)生;屬性文法
中圖分類號(hào):G642
文獻(xiàn)標(biāo)識(shí)碼:B
“編譯原理”是目前高等院校計(jì)算機(jī)各相關(guān)專業(yè)的一門必修課,課程本身理論性、抽象性較強(qiáng),而編譯過程的第三個(gè)階段——語義分析和中間代碼產(chǎn)生中涉及到的理論則更是抽象,以至于學(xué)生對(duì)各類語法結(jié)構(gòu)的屬性文法和翻譯過程無法正確理解和靈活掌握,更無法建立起編譯程序的整體概念。在這部分內(nèi)容的教學(xué)過程中,傳統(tǒng)的“滿堂灌”等教學(xué)方法會(huì)讓學(xué)生感覺一頭霧水,因此必須采用啟發(fā)式教學(xué),在教師的引導(dǎo)下,充分發(fā)揮學(xué)生的積極主動(dòng)性,讓他們積極參與到教學(xué)活動(dòng)中,使得教師對(duì)理論的教學(xué)更多地變成學(xué)生自身的感悟和體會(huì)。
1教學(xué)內(nèi)容總體設(shè)計(jì)
為了達(dá)到更好的教學(xué)效果,教師必須根據(jù)需要對(duì)教材中的信息加以整理和取舍,使教學(xué)內(nèi)容更集中,使學(xué)生關(guān)注于理論的核心,在課堂上掌握理論重點(diǎn),而不至于讓一些細(xì)枝末節(jié)的內(nèi)容分散注意力。我院采用的教材是陳火旺院士等編著的《程序設(shè)計(jì)語言編譯原理》,其中第六章是屬性文法和語法制導(dǎo)翻譯,第七章是語義分析和中間代碼產(chǎn)生。第六章作為第七章的理論基礎(chǔ),內(nèi)容較多,學(xué)生全部掌握有一定難度,因此作者在教學(xué)過程中只把和第七章密切相關(guān)的知識(shí)點(diǎn)作為課堂教學(xué)內(nèi)容,并講清講透。其中包括屬性文法的概念、如何區(qū)分綜合屬性和繼承屬性、什么是S-屬性文法以及如何進(jìn)行自下而上分析、什么是L-屬性文法以及如何進(jìn)行自上而下分析、翻譯模式的概念以及翻譯模式形式下的屬性文法如何進(jìn)行分析。第七章的課堂教學(xué)內(nèi)容包括中間代碼的形式、說明語句的翻譯、賦值語句和算術(shù)表達(dá)式的翻譯、布爾表達(dá)式的翻譯、控制流語句的翻譯,其他內(nèi)容留給有興趣的同學(xué)自學(xué)。
2屬性文法相關(guān)概念的教學(xué)過程
屬性文法對(duì)初學(xué)者來說不易理解,在講授時(shí),首先給學(xué)生看幾個(gè)屬性文法的例子,以便建立起直觀印象,然后再根據(jù)一個(gè)具體例子解釋語義規(guī)則和產(chǎn)生式的關(guān)聯(lián)性,進(jìn)而解釋屬性是什么,以及綜合屬性、繼承屬性是如何區(qū)分的,這樣學(xué)生更易理解和接受。在理解綜合屬性和繼承屬性區(qū)分的基礎(chǔ)上,掌握S-屬性文法和L-屬性文法的概念很容易,關(guān)鍵是自下而上分析和自上而下分析方法,教師在講授時(shí)可先通過一個(gè)例子進(jìn)行示范,然后再給學(xué)生時(shí)間完成相關(guān)的練習(xí),通過動(dòng)手動(dòng)腦,才能達(dá)到熟練掌握和靈活運(yùn)用的目的。
3語義分析和中間代碼產(chǎn)生的教學(xué)過程
語義分析和中間代碼產(chǎn)生主要是各類語法結(jié)構(gòu)(說明語句、賦值語句和算術(shù)表達(dá)式、布爾表達(dá)式、控制流語句) 的翻譯,這部分的內(nèi)容實(shí)際是第六章理論的應(yīng)用,然而大部分學(xué)生卻認(rèn)為難以理解和掌握,原因可能有兩個(gè):一是第六章的基礎(chǔ)理論掌握不牢,二是不知道如何運(yùn)用這些理論進(jìn)行語義分析。針對(duì)這個(gè)問題,講授過程中要注意了解學(xué)生對(duì)基礎(chǔ)理論的掌握情況并根據(jù)情況及時(shí)補(bǔ)充,給出語義分析的清晰可操作的步驟,根據(jù)學(xué)生情況講授一到兩種語法結(jié)構(gòu)的翻譯后,剩下的語法結(jié)構(gòu)翻譯過程可讓學(xué)生自己練習(xí),同時(shí)找出掌握程度好的學(xué)生走上講臺(tái)和同學(xué)交流,充分發(fā)揮學(xué)生的積極性,并可在激烈的討論中及時(shí)發(fā)現(xiàn)并解決問題。
講授時(shí),首先在黑板上或屏幕上給出理解一個(gè)屬性文法的方法,并要求學(xué)生做筆記:
(1) 確定翻譯方法;
(2) 畫出一棵語法分析樹;
(3) 了解必要函數(shù)的意義;
(4) 按照確定的翻譯方法進(jìn)行翻譯;
(5) 分析翻譯結(jié)果,理解屬性文法的整體作用;
(6) 在理解整體作用的基礎(chǔ)上,反復(fù)回顧整個(gè)翻譯過程,直至理解每個(gè)屬性的含義,理解每條產(chǎn)生式所配備語義規(guī)則的含義。
然后,通過具體例子介紹每一個(gè)步驟如何進(jìn)行操作。例如,利用布爾表達(dá)式的如下屬性文法進(jìn)行介紹。
產(chǎn)生式語義規(guī)則
E→E1 or E2E1.true:=E.true
E1.1:=newlable
E2.true:=E.true
E2.1:=E.1
E.code:=E1.code || gen(E1.1’:’) || E2.code
E→E1 and E2E1.true:=newlable
E1.1:=E.1
E2.true:=E.true
E2.1:=E.1
E.code:=E1.code || gen(E1.true’:’) || E2.code
E→not E1E1.true:=E.1
E1.1:=E.true
E.code:=E1.code
E→( E1) E1.true:=E true.
E1.1:=E. 1
E.code:=E1.code
E→id1 relop id2
E.code:=gen ( ‘if’ id1.place relop.op id2.place
‘goto’ E.true) || gen(‘goto’E.1)
按照給出的方法,一步步進(jìn)行解釋和說明:
(1) 引導(dǎo)學(xué)生觀察每條產(chǎn)生式對(duì)應(yīng)語義規(guī)則中計(jì)算的屬性是產(chǎn)生式左部文法符號(hào)還是右部文法符號(hào)的屬性,若計(jì)算的是產(chǎn)生式左部文法符號(hào)的屬性,則該屬性是綜合屬性,否則是繼承屬性;若屬性文法中所有屬性都是綜合的,則采用自下而上的翻譯方法,否則采用自上而下的翻譯方法。本例中,通過觀察發(fā)現(xiàn)true和1是繼承的,確定采用自上而下的翻譯方法。
(2) 畫出一棵語法分析樹,該步驟的目的有兩個(gè),一是明確該文法定義的語法結(jié)構(gòu),二是做好后續(xù)步驟翻譯的基礎(chǔ)。為了理解每條產(chǎn)生式對(duì)應(yīng)語義規(guī)則的含義,畫語法分析樹時(shí)應(yīng)盡可能用上所有的產(chǎn)生式。此時(shí)可以讓學(xué)生自己畫,同時(shí)教師在黑板上畫出一棵語法樹,便于后面的演示。例如本例中,語法分析樹可以如圖1所示。

圖1 語法分析樹
(3) 有些屬性文法里用了一些自定義的函數(shù),先要了解這些函數(shù)的意義,例如該屬性文法中有兩個(gè)函數(shù):
newlable:每調(diào)用一次產(chǎn)生一個(gè)標(biāo)號(hào),依次是L1,L2,…...;
gen(…):把括號(hào)里面的內(nèi)容輸出。
(4) 按照確定的方法進(jìn)行翻譯。采用自下而上翻譯時(shí),找到句柄歸約時(shí)求非終結(jié)符號(hào)對(duì)應(yīng)的綜合屬性值;若采用自上而下翻譯時(shí),表現(xiàn)在語法分析樹上是進(jìn)行一次深度優(yōu)先遍歷。本例的遍歷路線圖如圖2所示,第一次經(jīng)過某文法符號(hào)時(shí)計(jì)算繼承屬性,第二次經(jīng)過時(shí)計(jì)算綜合屬性,教師引導(dǎo)學(xué)生互動(dòng),共同完成教師畫出的語法分析樹上得翻譯,假設(shè)開始符號(hào)的兩個(gè)繼承屬性true和1的值分別為Ltrue和L1,得到生成的代碼如下:
if a>b goto L1
goto L1
L1: if c>d goto Ltrue
goto L2
L2: if e>f goto L1
goto Ltrue
之后,留給學(xué)生適量時(shí)間在自己畫出的語法樹上進(jìn)行翻譯并要求寫出翻譯結(jié)果。

圖2 自上而下分析線路圖
(5) 分析翻譯結(jié)果,理解屬性文法的整體作用。從輸入串a(chǎn)>b and c>d or e>f 和輸出結(jié)果分析,可以看出該屬性文法是布爾表達(dá)式作為條件控制時(shí)的情況,翻譯后是確定布爾式的真假出口,而不是得到布爾式的真假值。
(6) 知道了該屬性文法的整體作用后,將產(chǎn)生式和語義規(guī)則結(jié)合起來理解每條語義規(guī)則的含義。例如本例中,結(jié)合語法分析樹,一步步引導(dǎo)學(xué)生掌握將語法結(jié)構(gòu)和語義規(guī)則進(jìn)行結(jié)合的方法。
參考文獻(xiàn)
[1] 薛維明等. 中學(xué)計(jì)算機(jī)教學(xué)法[M].北京:清華大學(xué)出版社,1999.
[2] 陳火旺,劉春林,譚慶平等. 編譯原理(第3版)[M]. 北京:國防工業(yè)出版社,2000.
[3] 陳意云. 編譯原理和技術(shù)[M]. 合肥:中國科學(xué)技術(shù)大學(xué)出版社,1997.