科技編譯原理講解
『壹』 求編譯原理 華中科技大學出版 何炎祥 的課後詳細答案
這個答案樓主你是不可能拿得到的,華科的都應該知道,想要找這種答案只能去圖書館找吧,我在華科的圖書館幫你搜索了一下,圖書館有這本書的習題集,但是我看了下,不能外借,只能館內閱覽,我把搜索的信息給你復制下來了,你自己在學校主頁圖書館先看一下吧。
主要責任者 何炎祥 he yan xiang 編著
題名 編譯原理及其習題解答 bian yi yuan li ji qi xi ti jie da / 何炎祥 ... [等] 編著
出版發行 武漢 : 武漢大學大學出版社, 2004
ISBN 7-307-04198-7 CNY41.00
館藏地點 索書號 館藏狀態
湖北出版物樣本室(304) TP314 91 館內閱覽
湖北出版物樣本室(304) TP314 91 館內閱覽
『貳』 如何學好 程序設計語言 編譯原理 誠求
1.明確學習目的
學習編程對大多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。
2.打好基礎
學編程要具備一定的基礎,總結之有以下幾方面:
(1)數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。
(2)邏輯思維能力的培養學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。
(3)選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發開發工具如 Java 等。 3)網路開發對客戶端開發工具如:Java Script 等;對伺服器開發工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。
3. 注意理解一些重要概念
一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
4.掌握編程思想
學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道 VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。
5.多實踐、多交流
掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。
6.養成良好的編程習慣
編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。
7.上網學編程
在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載。例如網站「編程課堂」()主要以 VB 和 Delph;教學和交流為主,提供大量實用技巧;網站「現在時編程學園」()是專門介紹C、VC、VB、Delphi 等的綜合編程網站;網站「 VB 編程樂園 」()提供內容豐富而且實用的編程技術文章、精選控制項、源代碼下載、計算機考試、相關軟體以及編程書籍推薦等等。
8.加強計算機理論知識的再學習
學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。
『叄』 為什麼要學習編譯原理(轉)
大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。 推薦參考書 雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。 第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。 第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。 第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。 推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。 編譯原理的實質 幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。 詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。 語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。 等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。 關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。 本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。 關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢? 編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課
『肆』 計算機科學主要是講什麼內容
主要課程
電路原理、模擬電子技術、數字邏輯、數字分析、計算機原理、微型計算機技術、計算機系統結構、計算機網路、高級語言、匯編語言、數據結構、操作系統、編譯原理、系統分析與控制、信號處理原理、通信原理概論。
主要專業實驗
編程與上機調試、電子線路、數字邏輯、微型計算機介面技術、計算機組成等。
授予學位
工學或理學學士。
計算機科學與技術(師范類)
培養目標
培養掌握計算機科學與技術,包括計算機硬體、軟體與應用的基本理論、基本知識和基本技能與方法,熟練地進行程序設計和使用資料庫技術、網路技術以及多媒體技術等解決實際問題,具有教書育人的良好素養,能在高等和中等學校進行計算機教育的教師和其他教育工作者。
主幹學科
計算機科學與技術。
主要課程
離散數學、數據結構、高級語言程序設計、操作系統、資料庫原理、計算機通信與網路、計算機組成原理等。
主要專業實驗
程序設計和上機調試、電子線路基礎、微機介面技術、計算機組成、資料庫、網路和多媒體技術等。
來源:計算機科學與技術學院 作者:計算機科學與技術學院 [字體:大 中 小]
本專業培養適應21世紀計算機科學與技術學科發展,國家、社會發展與進步事業實際需要,德、智、體、美全面發展,具有創新精神和實踐能力的高級專門人才。畢業生適宜到科研部門和高、中等學校從事科學研究和教學工作;適宜到ICT產業、重要部門,以及相近學科的有關單位從事計算機科學與技術開發研究、應用與管理等工作;可以繼續攻讀計算機科學與技術及其相關學科的碩士學位。
一、專業特點及培養要求:
培養學生具有良好的科學素養和文化修養,較完整地掌握計算機科學技術一級學科的基礎知識,使學生即懂系統,又會應用;既有扎實的理論基礎,又有較強的應用能力;既可以承擔實際系統的開發,又可進行科學研究。
畢業生應獲得以下幾方面的知識與能力:
1、系統地、較好地掌握理工科公共基礎知識,較好地掌握本學科基本概念、基本原理、基本方法、基本技術等基礎理論知識,理論聯系實際,受到良好的科學思維和科學實驗的基本訓練;
2、畢業生應初步了解整個學科的知識組織結構、學科形態、典型方法、核心概念和學科基本工作流程方式,初步了解學科當前的發展現狀和未來的發展趨勢,掌握計算機科學與技術本科一級的核心基礎知識和某一專業化方向的專業基礎知識,為未來在計算機科學與技術領域從事一般教學、研究、應用與開發或深造提供一個開展工作的堅實的專業知識基礎;
3、畢業生應初步具有進一步深入掌握學科核心基礎知識和某一專業化方向專業基礎知識的能力,初步具有對一般計算機科學與技術的技術項目所提出的思想、方法、技術和工程技術路線的可行性作出基本估計的能力;
4、具有較強的工作適應性,能適應計算科學與技術的快速發展要求。
二、專業方向:
A:計算機信息處理 B:計算機控制技術 C:圖形學與可視化技術 D:信息安全技術
三、主幹學科:電子科學、構造性數學、計算機科學與技術
四、主幹課程:
電路、電子技術、離散數學、數字電路及邏輯、計算機組成原理、數據結構與演算法分析、編譯原理、操作系統、網路與通信、計算機系統結構、C++程序設計、信號處理原理、微型機系統與介面技術、軟體工程、資料庫系統基礎等。
五、教學進程:
1、必修課:公共基礎課和人文、社科、經管類素質課見表一,技術基礎課和專業平台課見表二
2、選修課:限定選修課(專業方向課)和任意選修課見表三
3、實踐教學環節:見表四
4、總周數分配:見表五
5、學歷:見表六
六、學制:四年
本專業具有計算機應用技術、計算機軟體與理論碩士學位授予權,並具有計算機技術工程碩士授予權
『伍』 計算機編譯原理 圖 裡面的 圓圈 表示什麼意思
先打個比方:
用程序接受從鍵盤輸入的單詞,並對照詞典判斷是不是拼寫正確,步驟是:
一個一個地接收字母,每接受一個字母,識別狀態往前推進一步。
假如只考慮識別3個單詞:it, if, is
狀態1:剛開始,一個字母還沒收到。
狀態2:接收到一個字母 i
狀態3:又接收到一個字母 s
1,2,3用圓圈圈起來,1和2之間畫個箭頭連起來,箭頭上標上字母 i。2和3也畫個箭頭,標上字母 s 。
這樣的一張圖,表示的是單詞 is 的識別過程。
這個過程,就是你照片中第一個圖,1,2,3串成一直線的圖。
圖中V1對應 i , 圖中 V2 對應 s
你書上的圖,描述的是「自動機」。自動機反映的是讀取到一連串字母後的狀態變化過程。
它包含若干個狀態,即畫有圓圈的數字。
當讀入一個字母時,自動機從一個狀態運行到另一個狀態,對應圖上的一個帶箭頭線條。線上標注的符號,代表讀到的字元。
『陸』 什麼是計算機科學技術,主要學什麼內容
領學網為你解答:
計算機科學與技術
培養目標:本專業培養具有良好的科學素養,能系統的、較好的掌握計算機科學、信息技術的基本理論,掌握計算機硬體、軟體、網路與應用的基本知識和基本技能與方法,能從事計算機教學、科學研究和開發應用的計算機科學、信息技術專業的計算機信息技術人才。
培養要求:掌握計算機科學、信息技術的基本理論、基本知識,特別是網路、資料庫和多媒體技術以及計算機硬體、軟體設計的基本技能,具有研究和開發計算機系統的基本技能和科技創新能力。
主要課程:信息技術導論、程序設計、電子技術基礎、數字電路、數據結構、匯編程序設計、計算機組成原理、操作系統、網路技術、資料庫原理、網路編程、編譯原理、軟體工程、網路安全、教學軟體製作、三維動畫創作等。
希望幫到你!
『柒』 學過編譯原理的人看c\c++跟沒學過的人比起來,有什麼長處
一般來講...沒學過C\C++就跟編程文盲差不多...C\C++是基礎,在這之上才能看很多.包括數據結構和演算法(用匯編實在難以描述),或者學習其他編程語言.
讓我難以理解的是,學習編譯原理應該需要學習數據結構,但是樓主又沒有學過C\C++,又是怎麼學會數據結構進而理解編譯原理??我很納悶....樓主有無寫過一個簡單的編譯器?純匯編是很難寫編譯器的,在編譯器的詞法分析,語法分析,語義分析,中間代碼等都基本用C\C++寫,只有當要生成特定的CPU匯編指令的時候需要用匯編語言.
學習操作系統基本不需要過多編譯原理的知識,只需要 匯編+C語言+數據結構和演算法基礎,基本就可以了.
附加一段:樓主好像對編譯原理的理解有所偏差.編譯原理主要是講解編譯器的構造,而匯編語言應該屬於一種編程語言,和C\C++一樣可以應用於很多場合.編譯器原理就是如何把高級語言轉換為低級語言的過程.
一般操作系統使用 匯編語言+C語言寫成.(以下是Intel IA-32平台機器的一般開機過程)在計算機啟動時,操作系統從匯編代碼開始運行,因為這時處於實模式狀態,也沒有操作系統,因此首先啟動BIOS程序,然後CPU通過編譯好的匯編代碼從實模式轉入保護模式.接著逐步把PC的控制權交給操作系統內核,當內核啟動後,由於有了操作系統的支持,此時的機器就可以通過高級語言編譯好的代碼(比如C語言)來管理PC的所有資源.因此,學習操作系統必須有匯編語言和C語言基礎.不然例如進程調度和控制等這種核心問題是不可能看的懂的.
『捌』 編譯原理怎麼樣
大學裡面的課本,大多數都是一個稍微濃縮了的編譯原理講解,老師基本上還是要看看這本紅龍書才敢講課的。 如果說這本書有什麼優點,那麼可以這么說,很多編譯原理......
『玖』 編譯原理中文法變換的特殊方法有哪些
雖然對編譯原理了解不多,但是看到樓上那位答案,順便留個腳印:
設G=(VN,VT,P,S),如果它的每個產生式α→β是這樣一種結構:α∈( VN∪VT )*且至少含有一個非終結符,而β∈( VN∪VT )*,則G是一個0型文法。
0型文法也稱短語文法。一個非常重要的理論結果是,0型文法的能力相當於圖靈機(Turing)。或者說,任何0型語言都是遞歸可枚舉的;反之,遞歸可枚舉集必定是一個0型語言。
對0型文法產生式的形式作某些限制,以給出1,2和3型文法的定義。
設G=(VN,VT,P,S)為一文法,若P中的每一個產生式α→β均滿足|β|≥|α| ,僅僅S→ε除外,則文法G是1型或上下文有關的。
在有些文獻給的定義中,將上下文有關文法的產生式的形式描述為α1Aα2→α1βα2,其中α1、α2和β都在( VN∪VT )*中(即在V*中),β≠ε,A在VN中。這種定義與前邊的定義等價。但它更能體現"上下文有關"這一術語,因為只有A出現在α1和α2的上下文中,才允許用β取代A。
設G=(VN,VT,P,S),若P中的每一個產生式α→β滿足:α是一非終結符,β∈( VN∪VT )*則此文法稱為2型的或上下文無關的。有時將2型文法的產生式表示為形如:A→β其中A∈VN,也就是說用β取代非終結符A時,與A所在的上下文無關,因此取名為上下文無關文法。
設G=(VN,VT,P,S),若P中的每一個產生式的形式都是A→aB或A→a,其中A和B都是非終結符,a是終結符,則G是3型文法或正規文法。
多數程序設計語言的單詞的語法都能用正規文法或3型文法來描述。
3型文法G=(VN,VT,P,S)的P中的規則有兩種形式:一種是前面定義的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一種形式是:A→Ba或A→a,前者稱為右線性文法,後者稱為左線性文法。正規文法所描述的是VT*上的正規集。
四個文法類的定義是逐漸增加限制的,因此每一種正規文法都是上下文無關的,每一種上下文無關文法都是上下文有關的,而每一種上下文有關文法都是0型文法。稱0型文法產生的語言為0型語言。上下文有關文法、上下文無關文法和正規文法產生的語言分別稱為上下文有關語言、上下文無關語言和正規語言。
令G是一文法,S是文法的開始符號,αβδ是文法G的一個句型。如果有:
S αAδ且Aβ則稱β是句型αβδ相對於非終結符A的短語。特別,如有Aβ則稱β是句型αβδ相對於規則A→β的直接短語(也稱簡單短語)。一個句型的最左直接短語稱為該句型的句柄。
文法中不得含有有害規則和多餘規則
有害規則:形如U→U的產生式。會引起文法的二義性
多餘規則:指文法中任何句子的推導都不會用到的規則
① 文法中某些非終結符不在任何規則的右部出現,該非終結符稱為不可到達。
② 文法中某些非終結符,由它不能推出終結符號串,該非終結符稱為不可終止。
『拾』 編譯原理中#的意義
#後面應該是一個立即數