編譯原理分析模塊的組成
Ⅰ 想學《編譯原理》請各位推薦些書
我們學校用的是《編譯原理》與《編譯原理與實踐》這兩本書,這兩本書都是國外的教材。我覺得《編譯原理與實踐》這本書不錯,自學應該能看懂,而且代碼比較多,書最後還有整個小型編譯器的源代碼。
編譯不好學,你就慢慢學吧。
下面的資料請作參考:
當代編譯技術三大聖經級別的教材
1.龍書(Dragon book)
書名是Compilers: Principles,Techniques,and Tools
作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman
內容簡介
《編譯原理》作者Alfred V.Aho、Ravi Sethi和Jeffrey D.Ullman是世界著名的計算機 科學家,他們在計算機科學理論、資料庫等很多領域都做出了傑出貢獻。《編譯原理》 是編譯領域無可替代的經典著作,被廣大計算機專業人士譽為「龍書」。《編譯原理》一 直被世界各地的著名高等院校和科研機構(如貝爾實驗室、哥倫比亞大學、普 林斯頓大學和斯坦福大學等)廣泛用作本科生和研究生編譯原理與技術課程的 教材,《編譯原理》對我國計算機教育界也具有重大影響。 書中深入討論了編譯器設計的重要主題,包括詞法分析、語法分析、語法制 導分析、類型檢查、運行環境、中間代碼生成、代飢碼茄碼生成、代碼優化等,並在 最後兩章中討論了實現編譯器的一些編程問題和幾個編譯器實例,而且每章都 提供了大量的練習和參考文獻。
與上一版相比,《編譯原理》第二版進行了全面的修訂,涵蓋了編譯器開發方面的最新進展。每章中都提供了大量的系統及參考文獻。《編譯原理》是編譯原理課程方面的經典教材,內容豐富,適合作為高等院校計算機及相關專業本科生及研究生的編譯原理課程的教材,也是廣大技術人員的極佳參考讀物。
作者爛察簡介
Alfred V.Aho,美國歌倫比亞大學教授,美國國家工程院院士,ACM和IEEE會士,曾獲得IEEE的馮·諾伊曼獎。著有多部演算法、數據結構、編譯器、資料庫系統及計算機科學基礎方面的著作。
Monica S.Lam,斯坦福大學計算機科學系教授,曾任Tensilica的首席科學家,也是Moka5的首任CEO。曾經主持SUIF項目,該項目產生了最流行的研究用編譯器之一。
Ravi Sethi,Avaya實驗室總裁,曾任貝爾實驗室高級副總裁TLucent Technologies通信軟體的CTO。他曾在賓夕法尼亞州立大學、亞利桑那州立大學和普林斯頓大學任教,是ACM會士。
Jeffrey D.Ullman斯坦福大學計算機科學系教授和Gradiance CEO,他的研究興趣包括資料庫理論、資料庫集成、數據挖掘和利用信息基礎設施教學等。他是美國國家工程院院士、IEEE會士,獲得過ACM的KarIstrom傑出教育家獎和Knuth獎。
第一版中文版
第二版中文版
2.鯨書(Whale book)
書名是:Advanced Compiler Design and Implementation
作者是:Steven S.Muchnick
內容簡介
本書迎接現代語言和體系結構的挑戰,幫助讀者作好准備,去應對將來要遇到的編譯器設計的問題。
本書涵蓋現代微處理器編譯器的設計和實現方面的所有高級主題。本書從編譯設計基礎領域中的高級問題開始,廣泛而深入地闡述各種重要的代碼優化技術,分析各種優化之間的相對重模侍要關系,以及實現這些優化的最有效方法。
本書特點
●為理解高級編譯器設計的主要問題奠定了基礎
●深入闡述優化問題
●用Sun的SPARC、IBM的POWER和PowerPC、DEC的Alpha以及Intel的Pentium和相關商業編譯 器作為案例,說明編譯器結構、中間代碼設計和各種優化方法
●給出大量定義清晰的關於代碼生成、優化和其他問題的演算法
●介紹由作者設計的以清晰、簡潔的方式描述演算法的語言ICAN (非形式編譯演算法表示)。
本書是經典的編譯器著作,與「龍書」齊名,稱為鯨書。書中針對現代語言和體系結構全面介紹了編譯器設計與實現的高級論題,從編譯器的基礎領域中的高級問題開始,然後深入討論了各種重要的代碼優化。本書專為編譯器專業人士和計算機專業本科生,研究生編寫,在設計和實現高度優化的編譯器以及確定優化的重要性和實現優化的最有效的方法等方面,為讀者提供了非常有價值的指導。
作者簡介
Steven S.Muchnick,曾是計算機科學教授,後作為惠普的PA-RISC和SUN的SPARC兩種計算機體系結構的核心開發成員,將自己的知識和經驗應用於編譯器設計,並擔任這些系統的高級編譯器設計與實現小組的領導人。他在研究和開發方面的雙重經驗,對於指導讀者作出編譯器設計決策極具價值。
3.虎書(Tiger book)
書名是:Modern Compiler Implementation in C /java /ML,Second Edition
作者是:Andrew W.Appel,with Jens Palsberg
內容簡介
《現代編譯原理——c語言描述(英文版)/圖靈原版計算機科學系列》全面講述了現代編譯器的各個組成部分,包括:詞法分析、語法分析、抽象語法、語義檢查、中間代碼表示、指令選擇、數據流分析、寄存器分配以及運行時系統等。與大多數編譯原理的教材不同,《現代編譯原理——C語言描述(英文版)/圖靈原版計算機科學系列》採用了函數語言和面向對象語言來描述代碼生成和寄存器分配,對於編譯器中各個模塊之間的介面都給出了實際的 C 語言頭文件。 全書分成兩部分,第一部分是編譯的基礎知識,適用於第一門編譯原理課程(一個學期);第二部分是高級主題,包括面向對象語言和函數語言、垃圾收集、循環優化、 SSA(靜態單賦值)形式、循環調度、存儲結構優化等。
本書是一本著名的編譯原理課程的教材。國際上眾多名校均採用本書作為編譯原理課程的教材,包括美國麻省理工學院、加州大學伯克利分校、普林斯頓大學和英國劍橋大學等。本書在國外享有「虎書」的稱號,與有「龍書」之稱的《編譯原理》(Alfred Aho 等編著)齊名。與編譯原理方面的其他名著相比,本書出版時間晚,內容新。 書中專門為學生提供了一個用 C 語言編寫的實習項目,包括前端和後端設計,學生可以在一學期內創建一個功能完整的編譯器。
作者簡介
Andrew W.Appel,美國普林斯頓大學計算機科學系教授,第26屆ACM SIGPLAN-SIGACT程序設計原理年會大會執行主席,1998-1999年在貝爾實驗室做研究工作。主要研究方向是計算機安全、編譯器設計、程序設計語言等。
Ⅱ 請問PLC中的梯形圖邏輯的編譯原理
PLC系統組成及各部分的功能
一.系統組成。
二.各部分的作用。
1. CPU運算和控制中心
起「心臟」作用。
縱:當從編程器輸入的程序存入到用戶程序存儲器中,然後CPU根據系統所賦予的功能(系統程序存儲器的解釋編譯程序),把用戶程序翻譯成PLC內部所認可的用戶編譯程序。
橫:輸入狀態和輸入信息從輸入介面輸進,CPU將之存入工作數據存儲器中或輸入映象寄存器。然後由CPU把數據和程序有機地結合在一起。把結果存入輸出映象寄存器或工作數據存儲器中,然後輸出到輸出介面、控制外部驅動器。
組成:CPU由控制器、運算器和寄存器組成。這些電路集成在一個晶元上。CPU通過地址匯流排、數據匯流排與I/O介面電路相連接。
2. 存儲器
具有記憶功能的半導體電路。
分為系統程序存儲器和用戶存儲器。
系統程序存儲器用以存放系統程序,包括管理程序,監控程序以及對用戶程序做編譯處理的解釋編譯程序。由只讀存儲器、ROM組成。廠家使用的,內容不可更改,斷電不消失。
用戶存儲器:分為用戶程序存儲區和工作數據存儲區。由隨機存取存儲器(RAM)組成。用戶使用的。斷電內容消失。常用高效的鋰電池作為後備電源,壽命一般為3~5年。
3.輸入/輸出介面
(1)輸入介面:
光電耦合器由兩個發光二極度管和光電三極體組成。
發光二級管:在光電耦合器的輸入端加上變化的電信號,發光二極體就產生與輸入信號變化規律相同的光信號。
光電三級管:在光信號的照射下導通,導通程度與光信號的強弱有關。在光電耦合器的線性工作區內,輸出信號與輸入信號有線性關系。
輸入介面電路工作過程:當開關合上,二極體發光,然後三極體在光的照射下導通,向內部電路輸入信號。當開關斷開,二極體不發光,三極體不導通。向內部電路輸入信號。也就是通過輸入介面電路把外部的開關信號轉化成PLC內部所能接受的數字信號。
(2)輸出介面
PLC的繼電器輸出介面電路
工作過程:當內部電路輸出數字信號1,有電流流過,繼電器線圈有電流,然後常開觸點閉合,提供負載導通的電流和電壓。當內部電路輸出數字信號0,則沒有電流流過,繼電器線圈沒有電流,然後常開觸點斷開,斷開負載的電流或電壓。也就是通過輸出介面電路把內部的數字電路化成一種信號使負載動作或不動作。
三種類型:
繼電器輸出:有觸點、壽命短、頻率低、交直流負載
晶體管輸出:無觸點、壽命長、直流負載
晶閘管輸出:無觸點、壽命長、交流負載
4.編程器
編程器分為兩種,一種是手持編程器,方便。我們實驗室使用的就是手持編程器。二種是通過PLC的RS232口。與計算機相連。然後敲擊鍵盤。通過NSTP-GR軟體(或WINDOWS下軟體)向PLC內部輸入程序。
第二節 PLC的基本工作原理
一.PLC採用「順序掃描,不斷循環」的工作方式
1.每次掃描過程。集中對輸入信號進行采樣。集中對輸出信號進行刷新。
2.輸入刷新過程。當輸入埠關閉時,程序在進行執行階段時,輸入端有新狀態,新狀態不能被讀入。只有程序進行下一次掃描時,新狀態才被讀入。
3.一個掃描周期分為輸入采樣,程序執行,輸出刷新。
4.元件映象寄存器的內容是隨著程序的執行變化而變化的。
5.掃描周期的長短由三條決定。(1)CPU執行指令的速度(2)指令本身佔有的時間(3)指令條數
6.由於採用集中采樣。集中輸出的方式。存在輸入/輸出滯後的現象,即輸入/輸出響應延遲。
二.PLC與繼電器控制系統、微機區別
1.PLC與繼電器控制系統區別
前者工作方式是「串列」,後者工作方式是「並行」。
前者用「軟體」,後者用「硬體」。
2.PLC與微機區別
前者工作方式是「循環掃描」。後者工作方式是「待命或中斷」
PLC 編程方式
PLC最突出的優點採用「軟繼電器」代替「硬繼電器」。用「軟體編程邏輯」代替「硬體布線邏輯」。
PLC編程語言有梯形圖、布爾助記符語言,等等。尤其前兩者為常用。
梯形圖語言特點:
1.每個梯形圖由多個梯級組成。
2.梯形圖中左右兩邊的豎線表示假想的邏輯電源。當某一梯級的邏輯運算結果為「1」時,有假想的電流通過。
3.繼電器線圈只能出現一次,而它的常開、常閉觸點可以出現無數次。
4.每一梯級的運算結果,立即被後面的梯級所利用。
5.輸入繼電器受外部信號控制。只出現觸點,不出現線圈。
第四節 主要技術性能
用戶程序存儲容量:是衡量可存儲用戶應用程序多少的指標。通常以字或K字為單位。16位二進制數為一個字,每1024個字為1K字。PLC以字為單位存儲指令和數據。一般的邏輯操作指令每條佔1個字。定時/計數,移位指令佔2個字。數據操作指令佔2~4個字。
每五節 PLC的分類
按結構分類:
1. 整體式:是把PLC各組成部分安裝在一起或少數幾塊印刷電路板上,並連同電源一起裝在機殼內形成一個單一的整體,稱之為主機或基本單元、小型、超小型PLC採用這種結構。
模塊式:是把PLC各基本組成做成獨立的模塊。中型、大型PLC採用這種方式。便於維修。
Ⅲ 編譯和解釋的區別是什麼
1.定義區別
①編譯原理旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。
②匯編語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。
2.處理方式區別
①編譯過程與解釋挺像,區別就在於編譯是將所有的源代碼指令一次性成翻目標代碼並執行。
②匯編過程就是把匯編指令一對一地翻譯成01機器碼的過程。而採用這種處理方式的語言只有一類:匯編語言。
3.特點區別
①編譯語言的特點就是不需要解釋器的參與,所以運行比較快,但是編譯好的程序只能在當前平台運行,是個局限性。
②匯編語言是當今世界上歷史最早,應用最廣,功能最強大,運行速度最快的編程語言。但是匯編語言開發工期長,可讀性差,並且不能跨平台編程。
Ⅳ 編譯程序包括哪幾個主要組成部分
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
(4)編譯原理分析模塊的組成擴展閱讀:
對於c編譯程序來說,其語言的特點如下:
1、c語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護,而且表現能力和處理能力極強。
2、c語言具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。
3、由於c語言實現了對硬體的編程操作,因此集高級語言和低級語言的功能於一體。它既可用於系統軟體的開發,也適合於應用軟體的開發。
4、此外,c語言還具有效率高、可移植性強等特點。因此它廣泛地移植到了各類各型計算機上,從而形成了多種版本。
Ⅳ GCC 的整體架構
在探索GCC的架構時,我們可以從構建GCC和編譯原理兩大方面入手,以理解GCC作為一個強大且復雜的編譯器系統是如何工作的。
構建GCC時,構建系統起到了關鍵作用。以GNU Make為代表,它能基於構建腳本實現正確的增量編譯方案。然而,構建腳本的生成並非孤立的過程。現代實踐中,CMake因其廣泛的採用,如在C++項目中,通過分析輸入關系生成構建腳本,使得構建過程更為自動化和高效。GCC採用的是Autoconf輸出Makefile,這與更現代的項目如LLVM使用CMake輸出Ninja構建腳本形成了對比。
編譯原理方面,編譯過程通常分為五個階段:預處理、詞法分析、語法和語義分析、中間代碼生成和目標代碼生成。預處理和詞法分析階段主要將源代碼轉換為token,而語法和語義分析則解析出抽象語法樹(AST)。對於C++這樣復雜的語言,遞歸下降解析器因其靈活性和可定製性而被廣泛應用。GCC內部的tree結構則支持C++相關語法。中間代碼生成階段,GCC將AST轉換為GIMPLE,此階段進行優化以提高代碼性能。後端階段負責從GIMPLE生成最終的匯編代碼或機器代碼。GCC代碼結構緊密耦合,但每個開發者專注於特定模塊的實現,提高了開發效率。
GCC的目錄結構包括核心文件、運行時庫、語言標准庫等,具體語言的前端代碼位於gcc/目錄下,而編譯器中端和後端也在此目錄中實現。GCC代碼雖龐大,但使用C++進行重構,繼承了復雜垃圾回收系統,這在現代編譯器設計中並不常見,如LLVM更傾向於使用C++的模板和RAII管理內存。
GCC的編譯過程主要由gcc/gcc.cc中的driver::main函數驅動。根據文件後綴名,compiler driver選擇不同的編譯和鏈接過程。對於C++文件,若使用gcc編譯,可能會導致錯誤,而g++則能正確處理C++文件的編譯和鏈接。
在預處理和詞法分析階段,GCC支持C系列語言的共同特性,並通過CPP和特定源代碼文件實現。語法和語義分析階段使用遞歸下降解析器,GCC中端將AST轉換為GIMPLE進行優化。最後,編譯器後端將GIMPLE轉換為目標代碼。
隨著行業的成熟,編譯器前端技術已發展得相當成熟,但仍然需要維護和優化以適應新語言的特性。編譯器中端對於CPU架構的優化已相對成熟,但對於異構計算,如GPU優化和計算圖優化,仍有巨大的研究空間。編譯器後端則在新興晶元和架構設計中持續吸引著大量的研究和開發。
在探索GCC架構時,我們不僅了解到其構建過程的復雜性,也洞察到編譯器領域未來的挑戰與機遇。隨著技術的不斷進步,編譯器將向著更高效、更靈活和更適應異構計算環境的方向發展。
Ⅵ 編譯原理有有符號un-1.u=un嗎
編譯程序把源程序翻譯為目標程序。根據源程序的語言種類,翻譯程序可以分為匯編程序與編譯程序。與之相對,解釋程序是對源程序進行解釋執行的程序。相應的可以將高級語言分為
編譯型 C/C++, Swift, etc.
解釋型 Python, javascript, etc.
混合型 Java, etc.
本文重點放在編譯程序的設計上。典型的編譯程序具有 7 77 個邏輯部分
對源程序掃描一次被稱為一遍 (pass)。典型的一遍掃描編譯程序有如下形式
通常將中間代碼生成前的分析部分稱為編譯器的前端,其後的綜合部分則被稱為後端。這樣就把一個編譯程序分為了與源語言相關和與目標機有關的兩個獨立的部分,降低了程序的耦合。假設 llvm 編譯器 支持 M MM 種源語言到 N NN 種目標語言的編譯
傳統的編譯器如 gcc 可能需要開發 M × N M \times NM×N 個不同的子模塊。而 llvm 使用統一的中間語言 llvm Intermediate Representation 只需要 M MM 個前端與 N NN 個後端,大大降低了開發成本。
文法
設非空有窮集合 Σ \SigmaΣ 為一字母表,則其上的符號串為 ∀ s ∈ Σ ∗ \forall s \in \Sigma^*∀s∈Σ
∗
,其中 ∗ *∗ 表示集合的閉包。特別的記 Σ 0 = ε \Sigma^0 = {\varepsilon}Σ
0
=ε 為空串組成的集合。規則通常寫作
U : : = x or U → x , ∣ U ∣ = 1 , ∣ x ∣ ≥ 0 U ::= x\text{ or }U\rightarrow x,\quad |U| = 1, |x| \ge 0U::=x or U→x,∣U∣=1,∣x∣≥0
其中左部 U UU 是符號,右部 x xx 是有窮符號串。規則的集合 P PP 即可確定一個文法 G GG
<程序> ::= <常量說明><變數說明><函數說明>
<常量說明> ::= {const<常量定義>;}
<常量定義> ::= int<標識符>=<整數>{,<標識符>=<整數>}|char<標識符>=<字元>{,<標識符>=<字元>}
<變數說明> ::= {<類型標識符><變數定義>;}
<變數定義> ::= <標識符>[<下標>]{,<標識符>[<下標>]}
<下標> ::= '['<無符號整數>']' // <無符號整數>表示數組元素的個數,其值需大於0
<函數說明> ::= {(<類型標識符>|void)<函數定義>}void<主函數>
<函數定義> ::= <標識符>'('<參數表>')'<復合語句>
<參數表> ::= [<類型標識符><標識符>{,<類型標識符><標識符>}]
<主函數> ::= main'('')'<復合語句>
<復合語句> ::= '{'<常量說明><變數說明>{<語句>}'}'
<語句> ::= <條件語句>|'{'{<語句>}'}'|<函數調用語句>;|<賦值語句>;|<讀語句>;|<寫語句>;|<返回語句>;|;
<條件語句> ::= <if語句>|<while語句>|<do語句>|<for語句>
<if語句> ::= if'('<條件>')'<語句>[else<語句>]
<while語句> ::= while'('<條件>')'<語句>
<do語句> ::= do<語句>while'('<條件>')'
<for語句> ::= for'('<標識符>=<表達式>;<條件>;<標識符>=<標識符><加法運算符><無符號整數>')'<語句>
<條件> ::= <表達式>[<關系運算符><表達式>] // 表達式為0條件為假,否則為真
<函數調用語句> ::= <標識符>'('[<表達式>{,<表達式>}]')'
<賦值語句> ::= <標識符>['['<表達式>']']=<表達式>
<讀語句> ::= scanf'('<標識符>{,<標識符>}')'
<寫語句> ::= printf'('<字元串>[,<表達式>]')'|printf'('<表達式>')'
<返回語句> ::= return['('<表達式>')']
<表達式> ::= [<加法運算符>]<項>{<加法運算符><項>} // [+|-]只作用於第一個<項>
<項> ::= <因子>{<乘法運算符><因子>}
<因子> ::= <標識符>['['<表達式>']']|'('<表達式>')'|<整數>|<字元>|<函數調用語句>
<整數> ::= [<加法運算符>]<無符號整數>
<標識符> ::= <字母>{<字母>|<數字>}
<無符號整數> ::= <非零數字>{<數字>}|0
<數字> ::= 0|<非零數字>
<非零數字> ::= 1|...|9
<字元> ::= '<加法運算符>'|'<乘法運算符>'|'<字母>'|'<數字>'
<字元串> ::= "{十進制編碼為32,33,35-126的ASCII字元}"
<類型標識符> ::= int|char
<加法運算符> ::= +|-
<乘法運算符> ::= *|/
<關系運算符> ::= <|<=|>|>=|!=|==
<字母> ::= _|a|...|z|A|...|Z
復制
上述文法使用擴充的 BNF 表示法進行描述
符號 定義 說明
∣ \vert∣ 或 作用域由括弧限定
{ t } n m \{t\}^m_n{t}
n
m
將 t tt 重復連接 n ∼ m n \sim mn∼m 次 預設時 m = ∞ , n = 0 m = \infin,\ n = 0m=∞, n=0
[ t ] [t][t] 符號串 t tt 可有可無 等價於 { t } 1 \{t\}^1{t}
1
( t ) (t)(t) 局部作用域 主要用於限定 ∣ \vert∣ 范圍
相關概念有
概念 符號 定義 示例
識別符號 Z ZZ 文法中第一條規則的左部符號 <程序>
字匯表 V VV 文法中出現的全部符號 { <程序>, <常量說明>, …, 0, 1, … }
非終結符號集 V n V_nV
n
全部規則的左部組成的集合 { <程序>, <常量說明>, <變數說明>, … }
終結符號集 V t V_tV
t
V − V n V - V_nV−V
n
{ 0, 1, …, _, a, b, … }
設 U : : = u ∈ P U ::= u \in PU::=u∈P 則對於 ∀ x , y ∈ V ∗ \forall x, y \in V^*∀x,y∈V
∗
有直接推導 x U y ⇒ x u y xUy \Rightarrow xuyxUy⇒xuy 。如果 y ∈ V t ∗ y \in V_t^*y∈V
t
∗
則 x U y ⤃ x u y xUy\ ⤃\ xuyxUy ⤃ xuy 稱為規范推導。直接推導序列 u 0 ⇒ u 1 ⇒ ⋯ ⇒ u n u_0 \Rightarrow u_1 \Rightarrow \cdots \Rightarrow u_nu
0
⇒u
1
⇒⋯⇒u
n
可簡記為
{ u 0 ⇒ + u n n > 0 u 0 ⇒ ∗ u n n ≥ 0 \begin{cases} u_0 \mathop\Rightarrow\limits^+ u_n & n > 0\\ u_0 \mathop\Rightarrow\limits^* u_n & n \ge 0\\ \end{cases}{
u
0
⇒
+
u
n
u
0
⇒
∗
u
n
n
>
0
n
≥
0
進一步定義
句型 V ∗ ∋ x ⇐ ∗ Z V^* \ni x \mathop\Leftarrow\limits^* ZV
∗
∋x
⇐
∗
Z
句子 V t ∗ ∋ x ⇐ + Z V_t^* \ni x \mathop\Leftarrow\limits^+ ZV
t
∗
∋x
⇐
+
Z
語言 L ( G ) = { x ∣ x is sentence } L(G) = \{ x| x\text{ is sentence} \}L(G)={x∣x is sentence}
如果文法 G GG 和 G ′ G'G
′
有 L ( G ) = L ( G ′ ) L(G) = L(G')L(G)=L(G
′
) ,則稱這兩個文法等價。設 w = x u y w=xuyw=xuy 為一句型,稱 u uu 為一個相對於 U ∈ V n U \in V_nU∈V
n
的
w ww 的短語 如果 Z ⇒ ∗ x U y ∧ U ⇒ + u Z \mathop\Rightarrow\limits^* xUy \land U \mathop\Rightarrow\limits^+ uZ
⇒
∗
xUy∧U
⇒
+
u
w ww 的簡單短語 如果 u uu 是短語且 U ⇒ u U \mathop\Rightarrow\limits uU⇒u
句型的最左簡單短語稱為句柄。
二義性
文法 G GG 是二義性的,如果 ∃ x ∈ L ( G ) \exist x \in L(G)∃x∈L(G) 使下列條件之一成立
x xx 可以對應兩顆不同的語法樹
x xx 有兩個不同的規范推導