整套課件:編譯原理(北京工業(yè)大學)_第1頁
整套課件:編譯原理(北京工業(yè)大學)_第2頁
整套課件:編譯原理(北京工業(yè)大學)_第3頁
整套課件:編譯原理(北京工業(yè)大學)_第4頁
整套課件:編譯原理(北京工業(yè)大學)_第5頁
已閱讀5頁,還剩459頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《編譯原理》

(PrinciplesofCompiling)主要內容編譯系統(tǒng)及其設計概述(總體結構、設計方法——2)語言與文法(文法、推導、歸約、分類、分析樹——6)詞法分析(詞法分析、正規(guī)式與正規(guī)文法、DFA狀態(tài)轉移圖——6)語法分析(自頂向下:LL(1)、遞歸子程序;自底向上:算符優(yōu)先、LR——14)語義分析(屬性文法、各種語句的語法制導翻譯——10)運行環(huán)境(存儲分配、過程調用、符號表管理——4)總結——2教學目的計算學科的定義對信息描述和變換算法的系統(tǒng)研究,主要包括它們的理論、分析、效率、實現和應用。計算學科的根本問題是什么能被(有效地)且如何自動化。它討論問題求解的“能行性”。學科特征:理工兼有思維特征:抽象思維與邏輯思維教學目的計算學科本科生專業(yè)能力構成“計算思維能力”——模型化、抽象思維能力、邏輯思維能力算法設計與分析能力程序設計與實現能力計算機系統(tǒng)的認知、分析、設計和應用能力教學目的——《編譯原理》是一門非常好的課程涉及的是一個比較適當的抽象層面上的數據變換(既抽象,又實際)一些具體的表示和變換算法“自頂向下”和“自底向上”的系統(tǒng)設計方法(思想、方法、實現全方位討論)一個相當規(guī)模的系統(tǒng)的設計(含總體結構)AlfredV.Aho:編寫編譯器的原理和技術具有十分普遍的意義,以至于在每個計算機科學家的研究生涯中,本書中的原理和技術都會反復用到結論:計算機專業(yè)最恰當、有效的知識載體之一教學要求掌握編譯程序總體結構在系統(tǒng)級上認識算法、系統(tǒng)的設計具有把握系統(tǒng)的能力學習有關的原理、實現方法和技術,了解計算學科的基本方法、思想掌握典型方法。“在每一個計算機科技工作者的職業(yè)生涯中,這些原理和技術都被反復用到?!奔骖櫿Z言的描述方法、設計、應用——形式化進一步培養(yǎng)“計算機思維能力”程序的非物理性質學習方法勤于思考博覽、多思(學而不思則罔、思而不學則??;書由厚到薄、由薄到厚)、常實踐思考由懷疑和答案組成。懷疑是智慧的大門,知道得越多,就越會發(fā)問,而問題就越多。發(fā)問使人進步。強化基礎在獨立思考之前,必須先有基礎知識。所謂“獲得基礎知識”并不是形式上讀過某門課程,而是將學過的東西完全弄懂。理論與實踐的結合能力學習方法應對困難不畏懼困難從教訓到經驗——親身體驗要實踐(作業(yè)、實驗),加深理解學習是一個過程上課、讀書、復習、做作業(yè)、討論、做實驗、自己編程序、上機調試排錯………是絕對必要的輔導答疑教師是最寶貴的資源…自己要思考,以獲得最大收獲:習題、問題第1章引論1.1計算機語言的發(fā)展1.2翻譯系統(tǒng)1.3編譯系統(tǒng)的功能分析1.4編譯程序總體結構1.5編譯程序的生成1.6編譯技術的應用1.1計算機語言的發(fā)展機器語言(MachineLanguage)匯編語言(AssembleLanguage)0、1代碼與助記符:更接近于計算機硬件指令系統(tǒng)的工作高級語言(HighLevelLanguage)定義數據、描述算法(程序)如:C、FORTRAN、PASCAL、C++、JAVA、SQL(數據定義、數據操作)命令語言(Command)以功能封裝為特征高級語言的分類強制式語言(ImperativeLanguage)FORTRAN(段結構)、BASIC、Pascal(嵌套結構)、C……函數(應用)式語言(FunctionalLanguage)LISP、ML……邏輯式(基于規(guī)則)語言(LogicalLanguage)Prolog……面向對象語言(Object-OrientedLanguage)Smalltalk、C++、Java、Ada(程序包)……1.2翻譯系統(tǒng)翻譯程序(Translator)將某一種語言描述的程序(源程序——SourceProgram)翻譯成等價的另一種語言描述的程序(目標程序——ObjectProgram)的程序。翻譯程序源程序目標程序(*.C/*.PAS/*.AS)(*.OBJ/*.EXE/*.*)1.2翻譯系統(tǒng)解釋程序(Interpreter)口譯與筆譯(單句提交與整篇提交)源程序輸入數據計算結果解釋程序1.2翻譯系統(tǒng)編譯程序(Compiler)高級語言程序→匯編/機器語言程序源程序目標程序編譯程序1.2編譯系統(tǒng)SP Compiler

S-Source O-Object OP P-ProgramInput RS RS-RunSys. Output 編譯系統(tǒng)(CompilingSystem)編譯系統(tǒng)=編譯程序+運行系統(tǒng)支撐環(huán)境、運行庫等1.2翻譯系統(tǒng)其它:診斷編譯程序(DiagnosticCompiler)優(yōu)化編譯程序(OptimizingCompiler)交叉編譯程序(CrossCompiler)可變目標編譯程序(RetargetableCompiler)并行編譯程序(ParallelizingCompiler)匯編程序(Assembler)、交叉匯編程序(CrossAssembler)、反匯編程序(Disassembler)1.2翻譯系統(tǒng)—匯總ML MLP Assembler DisassemblerAL ALP Compiler DataHL HLP Interpreter ResultM-MachineL-LangugeP-ProgramA-AssembleH-HighLevelTranslator1.3編譯系統(tǒng)的功能分析程序分析詞法、語法、語義分析綜合語句的翻譯、代碼生成例如:標識符左值與右值的綁定(binding)變量:存儲單元函數:目標代碼序列1.4編譯程序總體結構請參閱P5圖1.1

目標代碼生成器代碼優(yōu)化器語義分析與中間代碼生成器語法分析器表格管理出錯處理中間代碼中間代碼目標代碼語法單位單詞符號詞法分析器源程序1.詞法分析例:res=fact*(term1+term2);結果IDN res‘=’IDNfact‘*’‘(’IDN term1‘+’IDNterm2‘)’‘;’1、詞法分析詞法分析器(LexicalAnalyzer)又叫做掃描器(Scanner),完成詞法分析功能:詞法分析器從左到右掃描源程序(字符串),并將其轉換成單詞(記號—Token)串;同時查詞法錯誤,進行標識符登記——符號表管理。輸入:字符串 輸出:(種別碼,屬性值)——序對屬性值——token的機內表示2、語法分析語法分析器(SyntaxAnalyzer,又叫Parser)完成語法分析功能:Parser實現“組詞成句”,構造分析樹,指出語法錯誤,指導翻譯輸入:Token序列輸出:語法成分2.語法分析res=fact*(term1+term2); 字符串*;賦值語句表達式=)(fact表達式res表達式表達式表達式表達式+term1term23.語義分析功能:分析由語法分析器給出的語法單位的語義獲取標識符的屬性:類型、作用域等語義檢查:運算的合法性、取值范圍等子程序的靜態(tài)綁定:代碼的相對地址變量的靜態(tài)綁定:數據的相對地址4.中間代碼生成中間代碼(intermediateCode)例:id1+id2*id3后綴表示(逆波蘭ReversePolishNotation)id1id2id3*

+前綴表示(波蘭PolishNotation)+id1*id2id3四元組表示(三地址碼)1(*,id1,id2,T1)2(+,id3,T1,T2)

三元組表示1(*,id2,id3)2(+,id1,(1))

EE+Eid1E*Eid2id3語法樹波蘭表示問題——Lukasiewicz1929/1951年發(fā)明

中綴表示(Infixnotation):(a+①b)*(-c+②d)+③e/f波蘭表示(Polish/Prefix/Parenthesis-free/Lukasiewicznotation)——也就是前綴表示+③*+①ab+②@cd/ef運算順序從右向左逆波蘭表示(ReversePolish/Suffix/Postfixnotation)——也就是后綴表示

ab+①c@d+②*ef/+③運算順序從左向右4.中間代碼生成中間代碼的特點簡單規(guī)范機器無關易于優(yōu)化與轉換三地址碼的另一種表示形式T1=id2*id3T2=id1*T1其它類型的語句舉例

printf(“hello”)x:=s (賦值)paramx (參數)callf (函數調用)s是hello的地址f是函數printf的地址對中間代碼的優(yōu)化處理:對代碼進行等價變換以求提高執(zhí)行效率——提高運行速度和節(jié)省存儲空間與機器無關的優(yōu)化與機器有關的優(yōu)化5.代碼優(yōu)化與機器無關的優(yōu)化局部優(yōu)化常量合并:常數運算在編譯期間完成,如8+9*4公共子表達式的提取:基本塊內循環(huán)優(yōu)化強度削減代碼外提與機器有關的優(yōu)化寄存器的利用將常用量放入寄存器,以減少訪問內存的次數體系結構MIMD、SIMD、SPMD、向量機、流水機存儲策略根據算法訪存的要求安排:Cache、并行存儲體系——減少訪問沖突任務劃分按運行的算法即體系結構,劃分子任務(MPMD)6.目標代碼生成將中間代碼轉換成目標機上的機器指令代碼或匯編代碼7、表格管理管理各種符號表(常數、標號、變量、過程、結構……),查、填(登記、查找)源程序中出現的符號和編譯程序生成的符號,為編譯的各個階段提供信息。輔助語法檢查、語義檢查完成靜態(tài)綁定、管理編譯過程Hash表、鏈表等各種查、填表技術8、錯誤處理進行各種錯誤的檢查、報告、糾正,以及相應的續(xù)編譯處理(如:錯誤的定位與局部化)詞法:拼寫……語法:語句結構、表達式結構……語義:類型不匹配……模塊分類分析:詞法分析、語法分析、語義分析綜合:中間代碼生成、代碼優(yōu)化、目標代碼生成輔助:符號表管理、出錯處理8項功能對應8個模塊編譯程序總體結構中間代碼目標代碼生成器代碼優(yōu)化器語義分析與中間代碼生成器語法分析器表格管理出錯處理中間代碼目標代碼語法單位單詞符號詞法分析器源程序例一個語句的翻譯9編譯的遍(Pass)根據系統(tǒng)資源的狀況、運行目標的要求……等,可以將一個編譯程序設計成多遍掃描的形式,在每一遍掃描中,完成不同的任務。遍可以和階段相對應,也可無關單遍代碼不太有效10、編譯的前端與后端前端與源語言有關、與目標機無關的部分詞法分析、語法分析、語義分析與中間代碼生成、與機器無關的代碼優(yōu)化后端與目標機有關的部分與機器有關的代碼優(yōu)化、目標代碼生成1.5編譯程序的生成設計目標目標程序小,執(zhí)行速度快。編譯程序小,執(zhí)行速度快。診斷能力強,可靠性高??梢浦残?,可擴充性。如何實現編譯器?直接用可運行的代碼編制——太費力?。孕螆D表示語言翻譯的T形圖源語言表示語言目標語言功能1)交叉編譯(CrossCompiling)/移植問題一:A機上有一個C語言編譯器,是否可利用此編譯器實現B機上的C語言編譯器?條件:A機有C語言的編譯程序目的:實現B機的C語言的編譯1.

(人)用C語言編制B機的C編譯程序P0(C→B)(A機的C編譯P1)編譯P0,得到在A機上可運行的P2(C→B)C語言C語言B機器C語言A機器A機器C語言A機器B機器P0P1P2上次課主要內容基本概念翻譯程序、編譯程序、解釋程序、編譯系統(tǒng)匯編程序、其他編譯的掃描遍數、前端、后端編譯程序總體結構中間代碼目標代碼生成器代碼優(yōu)化器語義分析與中間代碼生成器語法分析器表格管理出錯處理中間代碼目標代碼語法單位單詞符號詞法分析器源程序上次課主要內容T形圖移植源語言表示語言目標語言3.(A機的P2)編譯P0,得到在B機上可運行的P3(C→B)C語言B機器B機器P3C語言C語言B機器C語言A機器A機器C語言A機器B機器P0P1P2P2C語言A機器B機器C語言C語言B機器P0獲得一個工具2)本機編譯器利用問題二:A機上有一個C語言編譯器,現要實現一個新語言NEW的編譯器?能利用交叉編譯技術么?用C編寫NEW的編譯,并用C編譯器編譯它NEW語言C語言A機器C語言A機器A機器NEW語言A機器A機器P0(編寫)P1(原有)P2(生成)問題三:直接在一個機上實現C語言編譯器,還有別的技術么?解決:用匯編語言實現一個C子集的編譯程序(P0—人)用匯編程序處理該程序,得到P2(P2:可直接運行)用C子集編制C語言的編譯程序(P3—人)用P2編譯P3,得到P43)編譯程序的自展技術4.用P2編譯P3,得到P4C語言機器語言機器語言P4C子集匯編語言機器語言P01.

用匯編語言實現一個C子集的編譯程序(P0—人)匯編語言機器語言機器語言C子集機器語言機器語言P1P22.用匯編程序(P1)處理該程序,得到P2(P2:可直接運行)P2C子集機器語言機器語言獲得一個工具C語言C子集機器語言P33.用C子集編制C語言的編譯程序(P3—人)4)利用編譯程序自動生成器詞法分析器的自動生成程序詞法規(guī)則說明詞法分析程序(C程序)輸入: 詞法(正規(guī)表達式) 識別動作(C程序段)輸出:

yylex()函數LEX語法分析器的自動生成程序語法規(guī)則說明語法分析程序(C程序)輸入: 語法規(guī)則(產生式) 語義動作(C程序段)輸出:

yyparse()函數YACC1.6編譯技術的應用把復雜數據看作一條語句數據格式的分析利用詞法分析、語法分析方法數據處理的框架基于語法制導的語義處理框架編譯技術可以用于各種復雜數據的分析處理例1-1DOS命令date的輸出格式例:9-2-1993、09-03-1993、9-03-93語法date→month-day-year詞法month→DIGITDIGIT|DIGITday→DIGITDIGIT|DIGITyear→DIGITDIGIT|DIGIIDIGITDIGITDIGIT例1-1(續(xù))語義year(年)、month(月)、day(日)語義約束條件0<month.value<130<day.value<32,31,300<year.value<10000習題1.試分析一個簡短的C程序,找出幾個屬于語法、詞法、語義的語言現象。2.試分析例1-1的date輸出數據的處理中,應該做哪些詞法分析、語法分析、語義處理。3.理解交叉編譯/移植和自展技術第2章高級語言

及其文法2.1語言概述2.2基本定義2.3文法(Grammar)的定義2.4CFG的語法(分析)樹(ParseTree)2.5文法的分類2.6文法的構造本章主要內容2.1語言概述什么是語言自然語言(NaturalLanguage)是人與人的通訊工具語義(Semantics):環(huán)境、背景知識、語氣、二義性——難以形式化計算機語言(ComputerLanguage)計算機系統(tǒng)間、人機間通訊工具嚴格的語法(Grammar)、語義(Semantics)——易于形式化:嚴格語言是用來交換信息的工具——功能性描述2.1語言概述語言的描述方法——現狀自然語言:自然、方便-非形式化數學語言(符號):嚴格、準確-形式化形式化描述高度的抽象,嚴格的理論基礎和方便的計算機表示。2.1語言概述語言——形式化的內容提取單詞(Token):滿足一定規(guī)則字符(Character)串句子(Sentence):滿足一定規(guī)則單詞序列語言(Language):滿足一定條件的句子集合語言是字和組合字的規(guī)則——結構性描述例:一譯開天第課今始編節(jié)上今天開始上第一節(jié)編譯課2.1語言概述程序設計語言——形式化的內容提取程序設計語言(ProgrammingLanguage):組成程序的所有語句的集合程序(Program):滿足語法規(guī)則的語句序列語句(Sentence):滿足語法規(guī)則的單詞序列單詞(Token):滿足詞法規(guī)則的字符串例變量=表達式if條件then語句while條件do語句call過程名(參數表)2.1語言概述描述形式——文法語法——語句語句的組成規(guī)則描述方法:BNF范式、語法(描述)圖詞法——單詞單詞的組成規(guī)則描述方法:BNF范式、正規(guī)式2.2基本定義字母表(Alphabet)是一個非空有窮集合,字母表中的元素稱為該字母表的一個字母(Letter),也叫字符(Character)。例以下是不同的字母表: ⑴{a,b,c,d} ⑵{a,b,c,……,z} ⑶{0,1}2.2基本定義字母表上符號串(String)的定義

(1)ε是∑上的一個符號串,叫做空串。(2)若x是∑上的符號串,而a是∑的元素,

則xa是∑上的符號串。(3)y是∑上的符號串,當且僅當它由(1)和(2)導出。由字母表中的符號所組成的的任何有窮序列被稱之為該字母表上的符號串,也稱作“字”(Word)。2.2基本定義定義1設∑1、∑2是兩個字母表,∑1與∑2

的乘積(Product)∑1∑2={ab|a∈∑1,b∈∑2}例:∑1={0,1},∑2={a,b},∑1∑2={0a,0b,1a,1b}定義2設∑是一個字母表,∑的n次冪(Power)遞歸地定義為:⑴∑0={ε}⑵∑n=∑n-1∑ n≥1例:∑13={000,001,010,011,100,101,110,111}2.2基本定義定義3設∑是一個字母表,∑的正閉包(PositiveClosure):∑+=∑∪∑2∪∑3∪∑4∪……∑的克林閉包(KleeneClosure):∑*=∑0∪∑+=∑0∪∑∪∑2∪∑3∪……2.2基本定義例{0,1}+={0,1,00,01,11,000,001,010,011,100,……}{a,b,c,d}+={a,b,c,d,aa,ab,ac,ad,ba,bb,bc,bd,……,aaa,aab,aac,aad,aba,abb,abc……}2.2基本定義例{0,1}*={ε,0,1,00,01,11,000,001,010,011,100,…}{a,b,c,d}*={ε,a,b,c,d,aa,ab,ac,ad,ba,bb,bc,bd,…,aaa,aab,aac,aad,aba,abb,abc,…}2.2基本定義定義5設∑是一個字母表,

L

∑*,L稱為字母表∑上的一個語言(Language),

x∈L,x叫做L的一個句子。例:字母表{0,1}上的語言{0,1}{00,11}{0,1,00,11}{0,1,00,11,01,10}{00,11}*{01,10}*2.2基本定義設s是符號串:01290273前綴:移走s的尾部的零個或多于零個符號后綴:刪去s的頭部的零個或多于零個符號子串:從s中刪去一個前綴和一個后綴子序列:從s中刪去零個或多于零個符號(這些符號不要求是連續(xù)的)長度:是該符號串中的符號的數目。例如|aab|=3,|ε|=0。2.2基本定義符號串的連接和冪1.連接:設x和y是符號串,它們的連接xy是把y的符號寫在x的符號之后得到的符號串。例如,x=ba,y=nana,xy=banana.2.冪:x0=

;x1=x;x2=xx;……;xn=xn-1x;

例如,x=ba,x1=ba,x2=baba,x3=bababa,…...2.3文法的定義如何實現語言結構的形式化描述?考慮一個句子——文法要素的提取分析:Thegraywolfwilleatthegoat〈謂語〉〈主語〉〈形容詞〉〈名詞〉〈動詞〉〈直接賓語〉助動詞〈句子〉動原冠詞名詞Thegraywolfwilleatthegoat〈冠詞〉

句子

主語

謂語

主語

冠詞

形容詞

名詞

謂語

動詞

直接賓語

動詞

助動詞

動詞原形

直接賓語

冠詞

名詞

產生句子的規(guī)則——從產生語言的角度

冠詞

the

形容詞

gray

助動詞

will

動詞原形

eat

名詞

wolf

名詞

goat終結符號集VT={the,gray,wolf,will,eat,goat}非終結符號集VN={

句子

,

主語

,

謂語

冠詞

,

形容詞

名詞

,

動詞

,

直接賓語

,

助動詞

動詞原形

}語法規(guī)則集P={

句子

主語

謂語

,……}開始符號S=

句子

句子的語法組成

——終結符號集,非終結符號集,語法規(guī)則,開始符號文法G的形式定義文法G為一個四元組:

G=(VT,VN,P,S)VT:終結符(Terminal)集VN:非終結符(Variable)集,VT∩VN=Φ語法范疇——某個語言結構S:開始符號(StartSymbol),S∈VN至少在產生式左側出現一次文法G的形式定義P:產生式(Product)集合α→β,被稱為產生式(定義式),讀作:α定義為β。其中α∈(VT∪VN)+,且α中至少有VN中元素的一個出現。β∈(VT∪VN)*。α稱為產生式α→β的左部(LeftPart),β稱為產生式α→β的右部(RightPart)。

句子

主語

謂語

冠詞

形容詞

名詞

謂語

the

形容詞

名詞

謂語

thegray

名詞

謂語

thegraywolf

謂語

thegraywolf

動詞

直接賓語

thegraywolf

助動詞

動詞原形

直接賓語

thegraywolfwill

動詞原形

直接賓語

thegraywolfwilleat

直接賓語

thegraywolfwilleat

冠詞

名詞

thegraywolfwilleatthe

名詞

thegraywolfwilleatthegoat句子的派生(推導)___根據規(guī)則

句子

thegraywolfwilleatthegoatthegraywolfwilleatthewolfthegraygoatwilleatthewolfthegraygoatwilleatthegray符合語法且符合語義的句子僅是:

thegraywolfwilleatthegoat還可以“得出”其他的句子例2-1算術表達式的文法考慮簡單算術表達式組成的語言遞歸定義——中綴表示標識符(id)(常數、變量)是表達式;表達式加一個表達式是表達式;表達式減一個表達式是表達式;表達式乘一個表達式是表達式;表達式除一個表達式是表達式;表達式加上括號后是表達式。上次課主要內容編譯程序實現技術自展自動生成:lex、Yacc語言信息交流的工具字和組合字的規(guī)則的統(tǒng)一體字母表上的語言字母表∑+

、∑*、a∈∑,x∈∑*、L

∑*、x∈L前綴、后綴、子串、串長、串的連接、串的冪上次課主要內容文法通過刻畫語言的結構描述語言用有窮描述無窮G=(VT,VN,P,S)表達式的遞歸定義例2-1算術表達式的文法考慮用式子表示這個定義標識符(id)是表達式表達式加一個表達式是表達式E→idE→E+E表達式減一個表達式是表達式E→E-E表達式乘一個表達式是表達式E→E*E表達式除一個表達式是表達式E→E/E表達式加上括號后是表達式E→(E)例2-1算術表達式的文法P:E→E+EE→E-EE→E*EE→E/EE→(E)E→idG=({id,+,-,*,/,(,)},{E},P,E)約定:只寫產生式簡寫E→E+E|E*E|(E)|id產生式的簡寫對一組有相同左部的產生式α→β1,α→β2…,α→βn可以簡單地記為:α→β1|β2|…|βn讀作:α定義為或者β1,或者β2,…,或者βn。并且稱它們?yōu)棣廉a生式。β1,β2,…,βn稱為候選式(Candidate)。產生式規(guī)定的一些變換E由第一個候選式可以變成E+EE+E中的第一個E由第二個候選式可以變成E*E,從而E+E變成E*E+E根據第4個候選式,E*E+E中的E都可以變成id:E*E+E變成id*E+Eid*E+E變成id*E+idid*E+id變成id*id+id也就是說,根據第4個候選式,E*E+E經3步變換變成id*id+id1E→E+E2E→E*E3E→(E)4E→id5E→E-E6E→E/E文法使用舉例E

E+E (1)

id+E (4)

id+E*E (2)

id+id*E (4)

id+id*id (4)E

5id+id*id1E→E+E2E→E*E3E→(E)4E→id5E→E-E6E→E/E直接推導與歸約根據產生式對符號串進行變換的過程A→γ是文法G的一個產生式,且α、β∈(VT∪VN)*,稱αAβ的直接推導/派生(Derive)出αγβ,也稱αγβ直接歸約(Reduce)為αAβ。記為αAβ

αγβ例:id+E

id+E*E(多步)推導α0

α1

α2

αn記為α0

nαn

(恰用n步)α0

+αn

(至少一步)

α0

*αn

(若干步:零步或多步)推導/歸約舉例E

E+E (1)串中含有變量

id+E (4)串中含有變量

id+E*E (2)串中含有變量

id+id*E (4)串中含有變量

id+id*id (4)串中沒有變量到此串中已經沒有(語法)變量了,不能再推了——得到句子1E→E+E2E→E*E3E→(E)4E→id句型與句子E

5id+id*id定義:如果S

*x,且x∈VT*,則稱x是G產生的一個句子(Sentence)E

E+E

E+E*EE

4id+id*E定義:如果S

*α,α∈(VT∪VN)*則稱α是G產生的一個句型(SententialForm)文法G產生的語言定義: L(G)={x|S

*xandx∈VT*}文法E→E+E|E*E|(E)|id可以派生出多少個句子?文法G的作用——語言的有窮描述以有限的規(guī)則描述無限的語言現象有限:產生式集合、終結符集合、非終結符集合無限:可以導出無窮多個句子(注:L也可是有窮)id+id*id的不同推導E→E+E|E*E|(E)|idE

E+E

id+E

id+E*E

id+id*E

id+id*idE

E+E

E+E*E

E+E*id

E+id*id

id+id*idE

E*E

E+E*E

E+id*E

id+id*E

id+id*id不做限制句型

(sententialForm)(歸約)E

*

id+id*id施于最右變量右句型/規(guī)范句型 (canonical~)(最左/規(guī)范歸約)E

+

id+id*id施于最左變量左句型(left-~)(最右歸約)

E

5

id+id*id最左推導與最右推導最左推導(Left-mostDerivation)每次推導都施加在句型的最左邊的語法變量上?!c最右歸約對應最右推導(Right-mostDerivation)每次推導都施加在句型的最右邊的語法變量上?!c最左歸約(規(guī)范規(guī)約)對應的規(guī)范(Canonical)句型短語(Phrase)自然語言中什么叫短語?如果S

*

αAβ&A

+γ,則稱γ是句型αγβ的相對于變量A的短語如果S

*

αAβ&A

γ,則稱γ是句型αγβ的相對于變量A的直接短語最左直接短語叫做句柄(Handle)例:(直接)短語E

E+T

T+T

F+T

(E)+T

(E+T)+T

(E+T)+T

(T+T)+T

(F+T)+T

(a+T)+T

(a+T*F)+T

(a+F*F)+T

(a+b*F)+T

(a+b*c)+T

(a+b*c)+F

(a+b*c)+dE→E+T|TT→T*F|FF→(E)|id句柄(Handle):最左直接短語E→E+T|TT→T*F|FF→(E)|idE

E+T

T+T

F+T

(E)+T

(E+T)+T

(E+T)+T

(T+T)+T

(F+T)+T

(a+T)+T

(a+T*F)+T

(a+F*F)+T

(a+b*F)+T

(a+b*c)+T

(a+b*c)+F

(a+b*c)+d例2-2標識符的文法1S→L|LT T→L|N|TL|TN L→a|b|c|d letter N→0|1|2|3|4|5 digit?正整數的文法;正實數的文法2.4文法的分類(Chomsky體系)語言結構的復雜程度(形式語言)涉及文法的復雜程度、分析方法的選擇如果G滿足文法定義的要求,則G是0型文法(短語結構文法PSG:PhraseStructureGrammar)。L(G)為PSL。上下文有關文法(CSG)若產生式集合中所有|α|≤|β|,除S→ε外,則G是1型文法即:上下文有關文法(CSG——ContextSensitiveGrammar)L(G)為1型/上下文有關/敏感語言(CSL)上下文無關文法(CFG)若α∈VN,β∈(VN∪VT)*,則G是2型文法即:上下文無關文法(CFG:ContextFreeGrammar)L(G)為2型/上下文無關語言(CFL)例:程序設計語言的多數語法特征例2-3標識符的文法2S→L|LT T→L|N|TL|TN L→a|b|c|d N→0|1|2|3|4|5S→a|b|c|d S→aT|bT|cT|dT T→a|b|c|d|0|1|2|3|4|5 T→aT|bT|cT|dT|0T T→1T|2T|3T|4T|5T正規(guī)文法(RG)設A、B∈VN,a∈VT或為

右線性(RightLinear)文法:A→aB或A→a左線性(LeftLinear)文法:A→Ba或A→a都是3型文法(正規(guī)文法RegularGrammar-RG)L(G)為3型/正規(guī)集/正則集/正則語言(RL)例:程序設計語言的多數詞法特性左、右線性文法不可混用例非CFL的文法L={anbncn|n>0}的文法S

aBC|aSBCCB

BCaB

abbB

bbbC

bc“可以證明”不存在CFGG,使L(G)=L

在我們使用的程序語言中,有些語言結構并不是總能用上下文無關文法描述的。例L1={wcw|w∈{a,b}+}。例,aabcaab就是L1的一個句子。這個語言是檢查程序中標識符的聲明應先于引用的抽象。

例L2={anbmcndm|n,m≥0},它是檢查過程聲明的形參個數和過程引用的參數個數是否一致問題的抽象。非CFL結構Chomsky體系——總結G=(VT,VN,P,S)是一個文法,α→β∈P* G是0型文法,L(G)是0型語言;

---其能力相當于圖靈機(TM)* |α|≤|β|:G是1型文法,L(G)是1型語言(除S→ε);

---其識別系統(tǒng)是線性界限自動機(LBA)* α∈VN:G是2型文法,L(G)是2型語言;

---其識別系統(tǒng)是不確定的下推自動機(PDA)* A→aB或A→a:G是右線性文法,L(G)是3型語言

A→Ba或A→a:G是左線性文法,L(G)是3型語言

---其識別系統(tǒng)是有窮自動機(FA)四種文法之間的關系是將產生式作進一步限制而定義的。四種文法之間的逐級“包含”關系如下:2型文法1型文法0型文法3型文法Chomsky體系——總結BNF范式——Backus-NaurForm

Backus-NormalFormα→β表示為α∷=β非終結符用“<”和“>”括起來終結符:基本符號集其他β(α1|α2…|αn)≡βα1|βα2…|βαn{α1|α2…|αn}nm

[α]≡α|ε……BNF范式——BackusNormalForm例簡單算術表達式(只寫產生式)<簡單表達式>∷=<簡單表達式>+<簡單表達式><簡單表達式>∷=<簡單表達式>*<簡單表達式><簡單表達式>∷=(<簡單表達式>)<簡單表達式>∷=id即:<簡單表達式>∷=<簡單表達式>+<簡單表達式>| <簡單表達式>*<簡單表達式>|(<簡單表達式>)|id哪些是終結符?哪些是變量?例2-5句子結構的表示

(文法E→E+E|E*E|(E)|id

)EE+EE→E+EidE→idEE*E→E*EidE→ididE→idE

E+E

id+E

id+E*E

id+id*E

id+id*id一棵樹!上次課主要內容產生式的簡寫:

α→β1|β2|…|βn(候選式)文法的簡寫:只寫產生式集、開始符約定直接派生/歸約:αAβ

αγβA→γN步派生/歸約:αAβ

NαγβA

Nγ句子與句型:S

*x S

*α語言:L(G)={x|S

*xandx∈VT*}上次課主要內容短語:短語、直接短語、句柄Chomsky體系BNF范式最左推導(最右歸約)最右推導(最左歸約)規(guī)范推導/歸約,規(guī)范句型例:(a1+a2)*a3E→E+T|E-T|TT→T*F|T/F|FF→(E)|id2.5CFG的語法樹ParseTree用樹的形式表示句型的結構樹根:開始符號中間結點:非終結符葉結點:終結符或者非終結符每個推導對應一個中間結點及其兒子——一個二級子樹-直接短語又稱為語法分析樹例短語與語法(分析)樹

(文法E→E+E|E*E|(E)|id

)EE+Eid(a1)EE*id(a2)id(a3)短語——一棵子樹的葉子!短語:一棵子樹的所有葉子自左至右排列起來形成一個相對于子樹根的短語。直接短語:僅有父子兩代的一棵子樹,它的所有葉子自左至右排列起來所形成的符號串。句柄:一個句型的分析樹中最左那棵只有父子兩代的子樹的所有葉子的自左至右排列。例如,對表達式文法G[E]和句子a1+a2*a3,挑選出推導過程中產生的句型中的短語,直接短語,句柄。用子樹解釋短語,直接短語,句柄E

E+T

T+T

F+T

a1+T

a1+T*F

a1+F*F

a1+a2*FE+T

T,T+TF,F+Ta1,a1+Ta1,T*F,a1+T*Fa1,F,F*F,a1+F*F

a1,a2,a1+a2*F,a2*F

a1,a2,a3,a2*

a3

a1+a2*a3EE+TTFa1T*FFa2a3

a1+a2*a3短語二義性文法與先天二義性語言對同一句子存在兩棵語法分析樹在理論上不可判定EE*EidEE+ididEE+EEEid*idid

1.描述一個句子的文法不是唯一的;

2.對于一個句子的分析應是唯一的??紤]表達式下面的文法G[E],其產生式如下:

E

E+E

E*E

(E)

id

對于句子a1+a2*a3,有如下兩個最左推導:

E

E+E

a1+E

a1+E*E

a1+a2*E

a1+a2*a3E

E*E

E+E*E

a1+E*E

a1+a2*E

a1+a2*a3文法的二義性

E

E+E

a1+E

a1+E*E

a1+a2*E

a1+a2*a3

E

E*E

E+E*E

a1+E*E

a1+a2*E

a1+a2*a3EE+Ea1E*Ea2a3EE*E+EEa1a2a3最左推導

E

E*E

E*a3

E+E*a3

E+a2*a3

a1+a2*a3EE+Ea1E*Ea2a3EE*E+EEa1a2a3最右推導

E

E+E

a1+E

a1+E*E

a1+a2*E

a1+a2*a3如果一個文法的句子存在兩棵分析樹,那么,該句子是二義性的。如果一個文法包含二義性的句子,則稱這個文法是二義性的;否則,該文法是無二義性的。幾點說明:1.一般來說,程序語言存在無二義性文法,對于表達式來說,文法(2.1)是無二義性的。對于條件語句,經常使用二義性文法描述它:S

ifexprthenS

ifexprthenSelseS

other二義性的句子:ife1thenife2thens1elses2

二義性(歧義性,ambiquity)2.對于任意一個上下文無關文法,不存在一個算法,判定它是無二義性的;但能給出一組充分條件,滿足這組充分條件的文法是無二義性的。3.存在先天二義性語言。例如,

aibicj

i,j

1

aibjcj

i,j

1

存在一個二義性的句子akbkck4.在能駕馭的情況下,使用二義性文法——簡單二義性(歧義性,ambiquity)E→E+T|E-T|TT→T*F|T/F|FF→(E)|id參考書:(抽象)語法樹不同(語法)分析樹EE+idE+EEidid(抽象)語法樹+id+idid2.6文法的構造——為了更好地理解文法目的:給出語言的有窮描述途徑:刻畫語言的結構做法:給出定義的形式化描述根據經驗給出描述文法舉例{x|x是長度為偶數的0、1串}S→00S|01S|10S|11S|ε{0m1n|m,n≥1} ——RLS→0S|0A A→1A|1{0n1n|n≥1} ——CFLS→0S1|01{ww|w∈{a,b}+} ——PSLS→aCAE|bCBE Aa→aAAb→bAAE→aRE RE→DaR→RabR→RbCR→aCA|bCBBa→aBBb→bBBE→bREaR→RabR→RbCR→aCA|bCBaD→DabD→DbED→ε例2-7:{w|w為十進制數}R→N|N.DN→1|2|3|4|5|6|7|8|9N→N0|N1|N2|N3|N4|N5|N6|N7|N8|N9D→1|2|3|4|5|6|7|8|9D→0D|1D|2D|3D|4D|5D|6D|7D|8D|9DD→0|0.D|N.0|0.0無用產生式與無用符號E→T|E+T|E-TT→F|T*F|T/FF→(E)|idE→E|H+TT→FH|TQ+PF|EQFM

→(E)|id單一產生式、派生不出終極符號行(H、Q、P)、從開始符號無法派生出來(M)文法構造小結明確描述對象──語言合法的語言結構確定基本符號集VT引入非終結符各種句子結構定義句子的組成規(guī)則BNF范式或產生式值得注意的問題文法描述描述句子的組成規(guī)則,不涉及語義文法正確不能保證語義正確(例)明確目標要描述語言的結構確認基本符號集合理引入非終結符(語義明確)本章小結:幾個基本概念文法是語言的一種有窮描述,它嚴格、準確、簡潔。文法的形式定義句型、句子、語言文法的分類CFG的語法樹習題1)給定文法如下:E→T|E+T|E-TT→F|T*F|T/FF→(E)|id畫出表達式id*(id+id)+id的分析樹2)判斷上題的文法屬于哪個類型的文法?為什么?上次課主要內容正規(guī)式轉換成正規(guī)文法對“|”、“*”、“+”、連接的替換正規(guī)文法到正規(guī)定義式的轉換代入(減少語法變量)、遞歸狀態(tài)轉換圖——FAA→aBA→aA→rB,B→

sBABaAaAsrB上次課主要內容整數識別的狀態(tài)轉移圖據狀態(tài)轉移圖設計與實現詞法分析程序詞法分析器的自動生成器簡介第4章

自頂向下的語法分析語法分析文法的改造問題自頂向下(TopDown)的分析推導(Derivation)語法分析方法語法分析方法 遞歸子程序法自頂向下 預測分析法(LL(1))

算符優(yōu)先分析法自底向上

LR(0)、SLR(1)[LR(1)、LALR]

TopDownBottomUp文法產生語言自動機識別語言4.1語法分析的功能檢查由掃描器輸出的單詞符號序列是否符合該語言的文法——句子,并分析出組成此句子的語法成分掃描器分析器語義處理單詞符號語法樹源程序分析器的輸入:Token序列分析器的輸出語法樹出錯處理:定位、續(xù)編譯4.2自頂向下分析面臨的問題與CFG的改造一、自頂向下的分析從文法的開始符號出發(fā),尋求所給的輸入符號串的最左推導從樹根S開始,構造所給輸入符號串的語法樹例:G為:S→xAyA→**|*,輸入串:x**yS

xAy

x**ySxAy**二、重要概念回顧推導:αAβ

αγβ(依據:A→γ)最左(Left-most)推導——最左分析左句型最左推導對應最右歸約最右(Right-most)推導——最右分析規(guī)范推導、規(guī)范句型(右句型)最右推導對應最左歸約(規(guī)范歸約)二義性(先天二義性語言、二義性文法)三、重要問題——虛假匹配

x*y發(fā)現不匹配,需要回退SxAy*SxAy**S輸入串x**yS→xAyA→**|*S

xAy

x**y匹配成功

xAy三、重要問題——回溯SSxAy*SxAy**x**yS

xAy

x**y匹配成功x**y發(fā)現不匹配,需要回退

xAy

x*y三、重要問題——二義性對同一句子存在兩棵語法分析樹,哪個是對的?影響句子分析!EE*EidEE+ididEE+EEEid*idid三、重要問題——左遞歸問題例:文法S→Say|*與它的句子*ayay*ayayS

*不對!S

Say

Sayay

Sayayay……

Sayay……ayay一個無限循環(huán)!三、重要問題——左遞歸問題例簡單算術表達式的文法——左遞歸E→E+T|E-T|T|-ET→T*F|T/F|FF→E↑P|PP→(E)|id|const|FUN(L)FUN→abs|sin|cos|ln|log|exp|sqrtL→E|E,LVN={E,T,F,P,FUN,L}VT={id,const,+,-,*,/,(,),\,,abs,sin,cos,log,ln,exp,sqrt}S=E四、消除二義性例:簡單算術表達式的文法二義性文法E→E+E|E-E|E*E|E/E|(E)|id非二義性文法E→E+T|E-T|TT→T*F|T/F|FF→(E)|id改造方法:使文法含有更多的信息,引入語法變量四、消除二義性再例:If語句S→ifEthenSS→ifEthenSelseSS→other設執(zhí)行下列語句前b=0,Ifa≠0thenifa>0thenb=1elseb=-1當a=1時,b=1;當a=-1時,b=-1Ifa≠0thenifa>0thenb=1elseb=-1當a=1時,b=1;當a=-1時,b=0一個句子有兩棵不同的語法樹

S S E E S S Ifa≠0thenifa>0thenb=1elseb=-1 S S E E S S Ifa≠0thenifa>0thenb=1elseb=-1四、消除二義性1.重寫文法S→U|MU→ifEthenSU→ifEthenMelseUM→ifEthenMelseM|other2.設置一個規(guī)則——實現“就近”、“最長”匹配原則改造1改造2S→TS|CSC→ifEthenT→CSelseC—ConditionT—Else每個else與前面最近的沒有配對的then配對,即出現在then和else之間的語句必須是配對的按照“改造1”構造的語法樹

S U S M E E M MIfa≠0thenifa>0thenb=1elseb=-1M→ifEthenMelseM|other按照“改造2”構造的語法樹

S S

T(最長) C C E E S SIfa≠0thenifa>0thenb=1elseb=-1S→TS|CSC→ifEthenT→CSelse按照“改造2”構造的語法樹

S T

S(非最長) C C E E S SIfa≠0thenifa>0thenb=1elseb=-1S→TS|CSC→ifEthenT→CSelse四、消除二義性

S S S

T(最長) T(最長) S C C C CifEthenifEthenSelseifEthenSelseifEthenSS→TS|CSC→ifEthenT→CSelse五、消除左遞歸無法根據左遞歸文法進行自頂向下的分析

Aa1a2……ai……an直接左遞歸A

Aα 當前變量 輸入指針

(棧頂、最左變量)間接左遞歸 A

+Aα左遞歸的消除方法將A→Aα|β替換為A→βA′和A′→αA′|ε例:表達式文法直接左遞歸的消除E→E+T|TT→T*F|FF→(E)|idE→TE’E’→+TE’|εT→FT’T’→*FT’|εF→(E)|id例:間接左遞歸的消除S→Ac|c A→Bb|b B→Sa|a將B的定義代入A產生式得:A→Sab|ab|b將A的定義代入S產生式得:S→Sabc|abc|bc|c消除直接左遞歸: S→abcS’|bcS’|cS’

S’→abcS’|ε刪除“多余的”產生式:A→Sab|ab|b和B→Sa|a結果: S→abcS’|bcS’|cS’

S’→abcS’|ε 消除左遞歸的一般方法用產生式組A

β1B|β2B

|…|βnBB

α1B|α2B

|…|αnB|ε替換產生式組A→Aα1|Aα2|…|Aαn|β1|β2|…|βm

其中:B為新變量,相當于A’消除左遞歸的算法見P70的算法為非終結符編號,再采用代入法將間接左遞歸變?yōu)橹苯幼筮f歸,消除直接左遞歸上次課主要內容自頂向下的分析推導(派生):自頂向下構造語法分析樹待處理的問題虛假匹配——回溯二義性文法S→TS|CSC→ifEthenT→CSelseS→U|MU→ifEthenSU→ifEthenMelseUM→ifEthenMelseM|other上次課主要內容消除左遞歸A→Aα1|Aα2|…|Aαn|β1|β2|…|βm

的等價產生式組A

β1B|β2B

|…|βnBB

α1B|α2B

|…|αnB|ε其中:B為新變量,相當于A’提取左因子六、提取左因子例:if語句的原始文法S→ifEthenS

|ifEthenSelseS|other遇到if時難以判斷用哪一個產生式進行匹配(推導)存在左因子ifEthenS提取作因子:S→ifEthenSS’|otherS'→ε|elseS左因子提取方法將形如A→αβ1|αβ2|…|αβn|γ1|γ2|…|γm的規(guī)則改寫為A→αA'|γ1|γ2|…|γm和A'→β1|β2|…|βn結果:S→ifEthenSS’|otherS'→ε|elseSS→TS|CS|otherC→ifEthenT→CSelse七、CFG的使用限制沒有一種方法能夠有效地分析所有上下文無關文法存在無法處理的2型文法(CFG)每種方法能夠處理一部分上下文無關文法每種方法都有適用范圍八、常用文法與分析方法LL文法和LR文法都是CFG的子集(無二義性)可用不同的文法來描述同一語言對于不同的文法,可用不同的分析方法LL文法──遞歸下降分析法、預測分析法多用于編譯的手工實現LR文法──LR分析法多用于編譯的自動生成4.3自頂向下的分析方法基本思想尋找輸入符號串的最左推導試圖根據當前輸入單詞確定使用哪個產生式基本過程從根開始,按與最左推導相對應的順序,構造輸入符號串(Token)的語法分析樹例符號串id+id*id的分析E→TE’E’→+TE’|εT→FT’T’→*FT’|εF→(E)|idE→E+T|TT→T*F|FF→(E)|id按照最左推導過程,構造語法樹id+id*id

的最左推導與語法樹的生成對應ETE’FT’T+E’idεFT’idεF*T’idε1、E→TE’2、T→FT'3、F→id4、T'→ε5、E'→+TE’6、T→FT’7、F→id8、T'→*FT’9、F→id10、T'→ε11、E'→εid+id*id的最左推導再現E

TE’ E→TE’

FT’E’ T→FT’

idT’E’ F→id

idE’ T’→ε

id+TE’ E’→+TE’

id+FT’E’ T→FT’

id+idT’E’ F→id

id+id*FT’E’ T’→*FT’

id+id*idT’E’ F→id

id+id*idE’ T’→ε

id+id*id E’→ε候選式的確定與回溯(Backtracking)給定文法S→cAd A→ab|e?句子ced是該文法定義語言的句子ec A dS候選式的確定與回溯(Backtracking)給定文法S→cAd A→ab|e?句子cad是該文法定義語言的句子

c A dSba候選式的確定與回溯(Backtracking)給定文法S→cAd A→ab|a?句子cad是該文法定義語言的句子c A dSbaac A dS候選式的確定與回溯(Backtracking)當要進行某個語法變量的推導時,希望能夠根據當前符號確定候選式。如果有幾個候選式(右部)左端第一個符號相同,則分析程序無法根據當前輸入符號選擇產生式,只能試探希望:尋找一類文法,我們可以方便地根據當前輸入符合確定正確的候選式4.3.1FIRST和FOLLOW集對于

α∈(VT∪VN)*定義:α的首符號集FIRST(α)={a|α

*a…,a∈VT*}對于

A∈VN定義A的后續(xù)符號集:

FOLLOW(A)={a|S

*…Aa…,a∈VT}求FIRST(X)的算法1)對

x∈VT,FIRST(x)={x};2)對

X∈VN,取FIRST(X)的初值:

{a|X→a…∈P}; X→ε

PFIRST(X)= {a|X→a…∈P}∪{ε}; X→ε∈P3)對

X∈VN,重復如下過程,直到所有FIRST集不變若X→Y…∈P

,且Y∈VN,則FIRST(X)=FIRST(X)∪(FIRST(Y)-{ε});若X→Y1…Yn∈P,且Y1...Yi-1

*ε,則對k=1到i-1:FIRST(X)=FIRST(X)∪(FIRST(Yk)-{ε});若Y1...Yn

*ε,則FIRST(X)=FIRST(X)∪{ε}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論