當前位置:首頁 » 編程軟體 » 編譯原理為什麼id不能數字開頭

編譯原理為什麼id不能數字開頭

發布時間: 2024-10-28 09:39:00

編譯原理中 FIRSTVT 和LASTVT

  1. Firstvt:找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
    A->a.......,即以終結符開頭,該終結符入Firstvt;
    A->B.......,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt;
    A->Ba.....,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt。

  2. Lastvt:找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
    A->.......a,即以終結符結尾,該終結符入Lastvt;
    A->.......B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt;
    A->.....aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt。

② 計算機應用專業分哪些

一 關於計算機應用技術有哪些專業

關於電腦的專業有天貓運營與創業、軟體開發高級工程師、網路傳媒高級工程師、互聯網運營與創客、環境數字藝術創意設計、新媒體ui界面設計、游戲動漫設計、互聯網+跨境電商、建築表現大師數字藝術設計,等新興專業在這里輸入您的答案...

二 計算機都包括哪些專業啊

計算機包括的專業有:電子與通信工程、應用電子技術、電子科學與技術、計算機科學與技術、通信工程、電子信息工程、微電子技術、電子信息科學與技術、企業信息計算機管理、電子商務、經濟信息管理與計算機應用、信息管理與信息系統、計算機輔助設計與製造,等等。


(2)計算機應用專業分哪些擴展閱讀:

計算機專業的發展趨勢和就業方向:

一、發展趨勢:

計算機技術面臨著一系列新的重大變革。諾伊曼體制的簡單硬體與專門邏輯已不能適應軟體日趨復雜、課題日益繁雜龐大的趨勢,要求創造服從於軟體需要和課題自然邏輯的新體制。並行、聯想、專用功能化以及硬體、固件、軟體相復合,是新體制的重要實現方法。

計算機將由信息處理、數據處理過渡到知識處理,知識庫將取代資料庫。自然語言、模式、圖像、手寫體等進行人-機會話將是輸入輸出的主要形式,使人-機關系達到高級的程度。砷化鎵器件將取代硅器件。

二、就業方向

畢業生主要面向交通系統各單位、交通信息化與電子政務建設與應用部門、各類計算機專業化公司、廣告設計製作公司、汽車營銷技術服務等從事IT行業工作。

參考資料來源: 網路—計算機相關專業

三 計算機應用專業的課程有哪些

計算機應用專業的主要課程有:計算機應用基礎、計算機組裝與維護、Visual Basic語言、專業英語、計算機平面與動畫設計、計算機網路基礎與區域網絡的建設與管理、資料庫的開發與應用、廣告設計與製作、網站建設與網頁設計、多媒體設計與製作。
其實裡面沒有多少數學或者理科的知識要學,它不同於一般的計算機專業,計算機專業是要學習很多復雜的專業數學知識的,比如數學分析和線性代數等等。這個專業偏重於應用領域,與你的廣告專業倒是聯系很緊密,你讀這個二位是很不錯的選擇。

四 計算機應用專業學的都有哪些方面

本專業培養適應計算機技術在企事業單位中發展、應用的需要,具有扎實的計算機基礎知識、計算機專業知識和較強的計算機辦公自動化、資料庫等常用軟體應用能力、計算機網路基本應用能力,能夠在企事業單位相關部門從事計算機辦公自動化和計算機軟體應用等計算機相關應用工作,德、智、體、美全面發展的計算機專業高等應用型人才,實現「一張文憑,多種證書,一技之長,一專多能,品學兼優」的培養目標。

五 計算機專業的具體分類有哪些

1 軟體開發(主要專業:計算機科學與技術,軟體工程等),就是編寫代碼,開發程序。有多種開發語言C/C++,JAVA,C#等。

註:系統開發,網路編程和大型游戲還是需要學好C/C++(個人認為較難點),手機游戲需要學會JAVA。工程項目的系統軟體開發,常用的是JAVA/JavaEE和C#/.NET,還有些中小型開發常用的技術Delphi,PB,PHP,ASP等等。

很多人都是從C語言開始接觸編程的,它是經典,也很強大,具有承上啟下的地位,可以為今後打下良好的基礎。

2 計算機網路技術(主要專業:通信,網路安全與管理等),界定很寬泛,網路領域和計算機一樣,發展方向細化的很詳細了,完全可以獨立劃出計算機專業行列,主要涉及領域有通信協議,網路信息安全等等。

3 電子專業 傾向於硬體,單片機,嵌入式等

硬體方面,感覺比軟體難學的多,難就難在學習實踐的環境比較難找,比如嵌入式,大型機,絕不像軟體學習,有個電腦連個網就齊活了,呵呵。也正因此它的含金量絕不低於軟體,更主要它還比軟體技術相對來說發展「穩定」,也就是俗話說的「越老越吃香」的現象更明顯,更多的是個積累。

4 計算機應用技術,傾向於「應用」,本科這個專業很少見,多見於專科。研究生好像也有這個專業吧,但「此應用非彼應用」了!計算機應用就是大雜燴,什麼都學,軟體、硬體、網路、資料庫,但都是皮毛,目標是結合其他行業領域的特點使用計算機。比如:工業設計/制圖,動漫/flash,多媒體處理等等。

六 計算機專業分類

目前我國計算機專業主要分為三大類:計算機基礎專業、與理工科交叉的計算機專業、與文科藝術類交叉的計算機專業。

1. 計算機基礎專業

專業要求與就業方向:這些專業不但要求學生掌握計算機基本理論和應用開發技術,具有一定的理論基礎,同時又要求學生具有較強的實際動手能力。學生畢業後能在企事業單位、 *** 部門從事計算機應用以及計算機網路系統的開發、維護等工作。

2. 與理工科交叉的計算機專業

與理工科交叉而衍生的計算機專業很多,如數學與應用數學專業、自動化專業、信息與計算科學專業、通信工程專業、電子信息工程專業、計算機應用與維護專業等。

1)數學與應用數學專業:

專業要求與就業方向:數學與應用數學是計算機專業的基礎和上升的平台,是與計算機科學與技術聯系最為緊密的專業之一。該專業就業面相對於計算機科學與技術專業來說寬得多,不但適用於IT 領域,也適用於數學領域。

2)自動化專業:

專業要求與就業方向:自動化專業是一個歸並了多個自動控制領域專業的寬口徑專業,要求學生掌握自動控制的基本理論,並立足信息系統和信息網路的控制這一新興應用領域制定專業課程體系,是工業製造業的核心專業。自動化專業的畢業生具有很強的就業基礎和優勢。

3)信息與計算科學專業:

專業要求與就業方向:這是一個由信息科學、計算數學、運籌與控制科學等交叉滲透而形成的專業,就業面涉及到教學、商業、網路開發、軟體設計等各個方面,就業率高達95%以上。

4)通信工程專業:

專業要求與就業方向:通信工程專業要求學生掌握通信基礎理論和基本基礎,掌握微波、無線電、多媒體等通信技術,以及電子和計算機技術,在信息時代有著極佳的就業優勢。

5)電子信息工程專業:

專業要求與就業方向:電子信息工程專業是寬口徑專業,主要培養信息技術、電子工程、網路系統集成等領域的高級IT 人才,畢業生可從事電子設備、信息系統和通信系統的研究、設計、製造、應用和開發工作。

(6)計算機應用專業分哪些擴展閱讀:

畢業生主要面向交通系統各單位、交通信息化與電子政務建設與應用部門、各類計算機專業化公司、廣告設計製作公司、汽車營銷技術服務等從事IT行業工作。

WEB應用程序設計專業

畢業後能夠從事網站應用程序開發、網站維護、網頁製作、軟體生產企業編碼、軟體測試、系統支持、軟體銷售、資料庫管理與應用、非IT企事業單位信息化。

可視化程序設計專業

畢業後能夠從事軟體企業桌面應用開發、軟體生產企業編碼、軟體測試、系統支持、軟體銷售、資料庫管理與應用開發等工作。

資料庫管理專業

畢業後能夠從事企、事業單位資料庫管理、軟體開發、專業資料庫應用設計與開發、資料庫的應用與開發、信息管理系統開發、企、事業單位網路管理、軟體銷售等工作。

多媒體應用專業

畢業後能夠從事計算機美工、動畫製作、影視編輯與製作、廣告設計與製作、多媒體綜合應用開發、多媒體課件製作等工作。

移動應用開發專業

畢業後能夠從事移動設備應用開發、嵌入式應用開發、移動網站開發、軟體生產企業編碼、軟體測試、系統支持、軟體銷售、企、事業單位信息管理、辦公自動化集成等工作。

電子政務軟體專業

能夠勝任基層 *** 部門、事業單位數字化政務管理系統的設計、維護與信息管理、辦公自動化集成、辦公室文員等工作。

軟體測試專業

畢業後能夠從事軟體測試、軟體編碼、IT企事業單位系統支持、非IT企事業單位信息化軟體銷售等工作。

物流信息技術專業

畢業後能夠勝任現代物流業信息管理,能在企事業單位從事物流系統設計、供應鏈管理、倉儲管理以及運輸等管理工作。

物流管理專業

畢業後能夠勝任全省各級企事業單位物流系統設計、供應鏈管理、倉儲管理以及運輸等管理工作等工作。

網路系統管理專業

畢業後能夠從事 *** 管理部門、經貿、金融、郵電、電子、學校、交通、社區以及應用計算機網路的有關行業,從事計算機網路系統的設計、維護、管理、從事網站開發與應用、網路安全管理、計算機軟硬體調試、安裝、計算機及網路產品營銷等工作。

計算機游戲專業

畢業後能夠從事網路游戲美術,網路游戲動漫設計,游戲概念/故事情節設計,網路游戲3D設計,網路游戲人物設計,網路游戲環境設計,網路游戲皮膚/紋理設計,網路游戲圖形開發,網路游戲測試,網路游戲音頻開發,游戲客戶端開發,游戲伺服器開發,游戲引擎開發,手機游戲策劃,手機游戲開發,手機游戲程序開發,手機游戲美工,手機游戲測試等工作。

計算機圖形/圖像製作專業

畢業後能夠從事廣告企業平面的設計與製作、網路企業網頁製作、企事業單位職員等工作。

目前,計算機專業在國內的高等院校中,以理工科的實力較強;以文科、綜合性高等院校為補充,基本上每所高等院校都設有這樣的專業;或者有這樣的專業人才。

七 計算機應用專業包括哪些課程

計算機應用是研究計算機應用於各個領域的理論、方法、技術和系統等,是計算機學科與其他學科相結合的邊緣學科 ,是計算機學科的組成部分。計算機應用分為數值計算和非數值應用兩大領域。非數值應用又包括數據處理、知識處理 ,例如信息系統、工廠自動化、辦公室自動化、家庭自動化 、專家系統、模式識別、機器翻譯等領域。
專業主幹課程,核心課程:
(一)專業骨幹課程
1、計算機數學基礎
是計算機專業必修的數學基礎知識。針對計算機專業的特點,加強了Mathematica數學軟體的應用。包含4大模塊:微積分、線性代數、概率論。在微積分模塊中包含了一元微積分、常微分方程、多元微積分初步、無窮級數、數值計算初步等內容。在線性代數模塊中包含了行列式、矩陣、線性方程組的基本概念、基本理論及其應用;在概率論模塊中包含了隨機事件與概率、隨機變數及其概率分布、隨機變數的數字特徵等內容。
2、計算機應用基礎
是計算機基礎教育的入門課程。主要講授計算機的基礎知識及計算機的組成原理,計算機操作系統(Windows和Dos)的概念和操作,Office辦公軟體Word 、Excel、PowerPoint的使用,計算機網路的基礎知識以及Inter的常用操作。
3、C語言程序設計
計算機程序設計的基礎知識、C語言的基本概念、順序結構程序設計、分支結構程序設計、循環結構設計、函數、指針、數組、結構、聯合以及枚舉類型、編譯預處理、位運算、文件等內容,掌握利用C語言進行程序設計的基本方法,以及C語言編程技巧。
4、計算機網路基礎
計算機網路的基礎知識、相關技術和實際應用。主要內容包括:計算機網路概述、網路體系結構、計算機區域網技術、網路中的傳輸介質、網路互聯與Inter技術等。
5、計算機多媒體技術基礎
計算機多媒體技術基礎知識,主要內容包括:圖象處理、聲音處理、影視處理、使用Authorware編輯合成軟體將各種多媒體元素組合在一起。
6、操作系統原理
操作系統的基本知識,主要內容包括進程管理、存儲管理、文件管理、輸入/輸出系統、用戶與操作系統的介面及linux操作系統簡介。
7、圖形圖像處理
使用Photoshop軟體進行圖形圖像處理,達到獨立的進行圖像編輯、圖像合成、校正和調節圖像的顏色,並能製作簡單的特效的目的。
8、網路安全技術與防範
網路安全概述、信息安全機制、密鑰分配與管理、病毒及防治措施、系統攻擊入侵檢測、防火牆技術、WWW安全性、電子郵件安全、其他Inter應用的安全性分析、網路操作系統安全性等。
(二)專業核心課程
1、Vf資料庫應用
資料庫的基本原理,資料庫系統的組成;關系型資料庫的特點、基本運算、數據組成;以Visual Foxpro為實例,資料庫的設計和開發,掌握資料庫的應用。
2、VB點NET程序設計
VB點NET程序設計語言的集成開發環境、程序設計基礎、窗體和基本輸出輸入、常用控制項、工程和程序管理、應用程序的結構、菜單程序設計、窗體設計和文件處理等。
3、JAVA程序設計
Java的語言規范、Java的編程技術及應用,主要內容有:Java基礎、流程式控制制、方法、數組、面向對象程序設計基礎、線程、圖形用戶界面設計等,使學生掌握用Java進行面向對象程序設計的基本方法。
4、網頁製作
網站的設計、編輯、修改、上傳,主要應用DreamweaverMX2004及FireworksMX2004。其中DreamweaverMX2004是網頁編輯軟體,講授其表格、框架、層等布局工具及超鏈接、CSS樣式等相關知識, Fireworks是圖形/圖像處理軟體,靜態圖片的製作、處理及簡單動態圖片的製作。

八 計算機學科分哪些專業

1 軟體開發(主要專業:計算機科學與技術,軟體工程等),就是編寫代碼,開發程序。有多種開發語言C/C++,JAVA,C#等。

註:系統開發,網路編程和大型游戲還是需要學好C/C++(個人認為較難點),手機游戲需要學會JAVA。工程項目的系統軟體開發,常用的是JAVA/JavaEE和C#/.NET,還有些中小型開發常用的技術Delphi,PB,PHP,ASP等等。
很多人都是從C語言開始接觸編程的,它是經典,也很強大,具有承上啟下的地位,可以為今後打下良好的基礎。

2 計算機網路技術(主要專業:通信,網路安全與管理等),界定很寬泛,網路領域和計算機一樣,發展方向細化的很詳細了,完全可以獨立劃出計算機專業行列,主要涉及領域有通信協議,網路信息安全等等。

3 電子專業 傾向於硬體,單片機,嵌入式等
硬體方面,感覺比軟體難學的多,難就難在學習實踐的環境比較難找,比如嵌入式,大型機,絕不像軟體學習,有個電腦連個網就齊活了,呵呵。也正因此它的含金量絕不低於軟體,更主要它還比軟體技術相對來說發展「穩定」,也就是俗話說的「越老越吃香」的現象更明顯,更多的是個積累。

4 計算機應用技術,傾向於「應用」,本科這個專業很少見,多見於專科。研究生好像也有這個專業吧,但「此應用非彼應用」了!計算機應用就是大雜燴,什麼都學,軟體、硬體、網路、資料庫,但都是皮毛,目標是結合其他行業領域的特點使用計算機。比如:工業設計/制圖,動漫/flash,多媒體處理等等。

5 信息管理專業,文科轉過來可能有幫助,因為也有管理方面課程,計算機方面學的多,但都不深入,理論多一些。

九 本科計算機類有哪些專業

1、計算機科學與技術專業

培養具備良好的科學素養,系統地掌握計算機科學與技術包括計算機硬體、軟體與應用的基本理論、基本知識和基本技能,能在科研院所、企業事業單位、技術和行政管理等部門從事教學、科研、開發、管理等工作的高級專門人才。

課程包括電路原理、模擬電子技術、數字邏輯、數字分析、計算機原理、微機原理、微型計算機技術、計算機系統結構、計算機網路、高級語言、匯編語言、數據結構、操作系統、編譯原理、系統分析與控制、信號處理原理、通信原理概論等。

2、軟體工程專業

軟體工程是一門研究用工程化方法構建和維護有效、實用和高質量的軟體的學科。軟體工程專業是2002年國家教育部新增專業,隨著計算機應用領域的不斷擴大及中國經濟建設的不斷發展,軟體工程專業將成為一個新的熱門專業。

該專業以計算機科學與技術學科為基礎,培養能夠從事軟體開發、測試、維護和軟體項目管理的高級專門人才,同時,各個行業幾乎都有計算機軟體的應用,如工業、農業、銀行、航空、 *** 部門等,這些應用促進了經濟和社會的發展,也提高了工作和生活效率。

3、信息安全專業

信息安全專業,具有全面的信息安全專業知識,是計算機、通信、數學、物理、法律、管理等學科的交叉學科,主要研究確保信息安全的科學與技術。培養能夠從事計算機、通信、電子商務、電子政務、電子金融等領域的信息安全高級專門人才。

使學生具有較強的應用能力,具有應用已掌握的基本知識解決實際應用問題的能力,不斷增強系統的應用、開發以及不斷獲取新知識的能力。努力使學生既有扎實的理論基礎,又有較強的應用能力;既可以承擔實際系統的開發,又可進行科學研究。

4、物聯網工程專業

物聯網(Inter of Things)這個詞,國內外普遍公認的是 MITAuto-ID 中心Ashton 教授1999年在研究RFID時最早提出來的。在2005年國際電信聯盟(ITU)發布的同名報告中,物聯網的定義和范圍已經發生了變化,覆蓋范圍有了較大的拓展,不再只是指基於RFID技術的物聯網。

物聯網是基於互聯網,傳統電信網等信息承載體,讓所有能夠被獨立定址的普通物理對象實現互聯互通的網路又稱為物聯網域名。

5、數字媒體技術專業

數字媒體技術專業(Digital Media Technology),屬於計算機類專業,同時也屬於屬於電氣信息類,旨在培養具有先進的游戲設計理念、設計思想,扎實專業基礎和創作實踐能力的高級復合型人才。該專業主要開設有游戲策劃、游戲用戶體驗分析、游戲開發程序設計基礎、面向對象程序設計、游戲創作等課程。

與數字媒體藝術專業相比,該專業略注重技術素質的培養,可適應新媒體藝術創作、網路多媒體製作、廣告、影視動畫、大眾傳媒、房地產業的演示動畫片製作工作。

6、智能科學與技術專業

智能科學與技術專業是智能科學系在2003年提出成立的,智能科學系的前身是北京大學信息科學中心,由北京大學數學系、計算機系、電子學系等10個系(所)於1985年成立,主要從事機器感知、智能機器人、智能信息處理和機器學習等交叉學科的研究和教學。智能科學與技術是面向前沿高新技術的基礎性本科專業,覆蓋面很廣。

專業涉及機器人技術,以新一代網路計算為基礎的智能系統,微機電系統(MEMS),與國民經濟、工業生產及日常生活密切相關的各類智能技術與系統,新一代的人機系統技術等。

7、空間信息與數字技術專業

空間信息與數字技術專業從2004年西安電子科技大學、武漢大學首先開設至今,經過了數年發展,已成為了一個比較成熟的專業。

現在國內的空間信息與數字技術專業主要有兩種內涵,一種是由武漢大學開創的(地理)空間信息與數字技術(即武大模式),另一種是西安電子科技大學開設的以外太空空間信息為研究對象的技術(即西電模式)。

(9)計算機應用專業分哪些擴展閱讀:

計算機學科的特色主要體現在:理論性強,實踐性強,發展迅速。

按一級學科培養基礎扎實的寬口徑人才,體現在重視數學、邏輯、數據結構、演算法、電子設計、計算機體系結構和系統軟體等方面的理論基礎和專業技術基礎,前兩年半注重自然科學基礎課程和專業基礎課程,拓寬面向。

後一年半主要是專業課程的設置,增加可選性、多樣性、靈活性和方向性,突出學科方向特色,體現最新技術發展動向。至今已覆蓋所有二級學科課程。加強數學基礎和分析能力,高等數學改上數學分析,增加計算機數學基礎課程,體現在假設組合數學,增加離散數學的課時,並在計算機後續課程(如演算法與數據結構、編譯等課程)中體現數學應用不斷線。

更重視實踐性教學環節,增加實驗課程、課程設計比重,注重自主性實踐環節,上機實踐貫穿於四年的學習中,加強知識綜合運用能力的培養。

③ 編譯原理詞法分析實驗中, 文件寫入順序的問題(fputs)

1)fopen在代碼中出現2次,沒有必要

2)你的程序不對 你搞混和S這個字元和TOKEN。

你的第一個WHILE讀入的是字元S,而TOKEN是由若干字元S構成的。而你的SWITCH(S)裡面按理應該是組成TOKEN的規則,而你直接就輸出了。這樣如果你要結果,我給你改了下,你看下:

int main()
{
char token[20] = {''};
char s;
char strings[10] = "(34,_)";
struct _iobuf* fp_cifa;
int i = 0, j;
strings[6] = ' '
strings[7] = ''
//fp_cifa = fopen(「D:\cifa.txt "a+");

while((size_t)i != strlen(file))
{
for(j = 0; j < 20; j++)
{
token[j] = ''
}
s = file[i++];
while(s == ' ' || s == ' ')
{
s = file[i++];
}
switch(s)
{
caseƇ':
token[0]=s;
token[1]=''
digitprint(token, value_num, num_list);
break;
case'=':
token[0]=s;
token[1]=''
digitprint(token, value_num, num_list);
//fputs(strings, fp_cifa);
break;
default:
cout<<"error"<<endl;
}
}
//fclose(fp_cifa);
return 0;
}

  • void digitprint(char* a, int& value_num_, char num_list[100][20])//a是需要評定的字元串//num在符號表中的位置,需要轉化為字元串然後輸入到文件中
    {
    FILE* fp_cifa;
    char c[20] = "(34,01)";
    fp_cifa = fopen("D:\cifa.txt ", "a+");
    //fputs(c, fp_cifa);
    fputs(a,fp_cifa);//這里要顯示 a 而不是c 你可以把a 拼到 c然後,再顯示c
    fclose(fp_cifa);
    }

④ 編譯原理試題·

Lex和Yacc應用方法(一).初識Lex
草木瓜 20070301
Lex(Lexical Analyzar 詞法分析生成器),Yacc(Yet Another Compiler Compiler
編譯器代碼生成器)是Unix下十分重要的詞法分析,語法分析的工具。經常用於語言分
析,公式編譯等廣泛領域。遺憾的是網上中文資料介紹不是過於簡單,就是跳躍太大,
入門參考意義並不大。本文通過循序漸進的例子,從0開始了解掌握Lex和Yacc的用法。

一.Lex(Lexical Analyzar) 初步示例
先看簡單的例子(註:本文所有實例皆在RetHat Linux下完成):
一個簡單的Lex文件 exfirst.l 內容:
%{
#include "stdio.h"
%}
%%
[\n] ;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在命令行下執行命令flex解析,會自動生成lex.yy.c文件:
[root@localhost liweitest]flex exfirst.l
進行編譯生成parser可執行程序:
[root@localhost liweitest]cc -o parser lex.yy.c -ll
[注意:如果不加-ll鏈結選項,cc編譯時會出現以下錯誤,後面會進一步說明。]
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'
/tmp/cciACkbX.o(.text+0x37b): In function `yylex':
: undefined reference to `yywrap'
/tmp/cciACkbX.o(.text+0xabd): In function `input':
: undefined reference to `yywrap'
collect2: ld returned 1 exit status

創建待解析的文件 file.txt:
title
i=1+3.9;
a3=909/6
bcd=4%9-333
通過已生成的可執行程序,進行文件解析。
[root@localhost liweitest]# ./parser < file.txt
Var : title
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
到此Lex用法會有個直觀的了解:
1.定義Lex描述文件
2.通過lex,flex工具解析成lex.yy.c文件
3.使用cc編譯lex.yy.c生成可執行程序

再來看一個比較完整的Lex描述文件 exsec.l :

%{
#include "stdio.h"
int linenum;
%}
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 進行分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
進行解析編譯:
[root@localhost liweitest]flex exsec.l
[root@localhost liweitest]cc -o parser lex.yy.c
[root@localhost liweitest]./parser < file.txt
----- Lex Example -----
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
Line Count: 4
這里就沒有加-ll選項,但是可以編譯通過。下面開始著重整理下Lex描述文件.l。

二.Lex(Lexical Analyzar) 描述文件的結構介紹
Lex工具是一種詞法分析程序生成器,它可以根據詞法規則說明書的要求來生成單詞識
別程序,由該程序識別出輸入文本中的各個單詞。一般可以分為<定義部分><規則部
分><用戶子程序部分>。其中規則部分是必須的,定義和用戶子程序部分是任選的。

(1)定義部分
定義部分起始於 %{ 符號,終止於 %} 符號,其間可以是包括include語句、聲明語句
在內的C語句。這部分跟普通C程序開頭沒什麼區別。
%{
#include "stdio.h"
int linenum;
%}
(2) 規則部分
規則部分起始於"%%"符號,終止於"%%"符號,其間則是詞法規則。詞法規則由模式和
動作兩部分組成。模式部分可以由任意的正則表達式組成,動作部分是由C語言語句組
成,這些語句用來對所匹配的模式進行相應處理。需要注意的是,lex將識別出來的單
詞存放在yytext[]字元數據中,因此該數組的內容就代表了所識別出來的單詞的內容。
類似yytext這些預定義的變數函數會隨著後面內容展開一一介紹。動作部分如果有多
行執行語句,也可以用{}括起來。
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
A.規則部分的正則表達式
規則部分是Lex描述文件中最為復雜的一部分,下面列出一些模式部分的正則表達式字
符含義:
A-Z, 0-9, a-z 構成模式部分的字元和數字。
- 指定范圍。例如:a-z 指從 a 到 z 之間的所有字元。
\ 轉義元字元。用來覆蓋字元在此表達式中定義的特殊意義,
只取字元的本身。

[] 表示一個字元集合。匹配括弧內的任意字元。如果第一個字
符是^那麼它表示否定模式。例如: [abC] 匹配 a, b, 和C
的任何一個。

^ 表示否定。
* 匹配0個或者多個上述模式。
+ 匹配1個或者多個上述模式。
? 匹配0個或1個上述模式。
$ 作為模式的最後一個字元時匹配一行的結尾。
{ } 表示一個模式可能出現的次數。 例如: A{1,3} 表示 A 可
能出現1次或3次。[a-z]{5} 表示長度為5的,由a-z組成的
字元。此外,還可以表示預定義的變數。

. 匹配任意字元,除了 \n。
( ) 將一系列常規表達式分組。如:{Letter}({Letter}|{Digit})*
| 表達式間的邏輯或。
"一些符號" 字元的字面含義。元字元具有。如:"*" 相當於 [\*]。
/ 向前匹配。如果在匹配的模式中的"/"後跟有後續表達式,
只匹配模版中"/"前面的部分。如:模式為 ABC/D 輸入 ABCD,
時ABC會匹配ABC/D,而D會匹配相應的模式。輸入ABCE的話,
ABCE就不會去匹配ABC/D。

B.規則部分的優先順序

規則部分具有優先順序的概念,先舉個簡單的例子:

%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
%%
此時,如果輸入內容:
[root@localhost liweitest]# cat file1.txt
AAAAAAA
[root@localhost liweitest]# ./parser < file1.txt
THREE
TWO
ONE
Lex分析詞法時,是逐個字元進行讀取,自上而下進行規則匹配的,讀取到第一個A字元
時,遍歷後發現三個規則皆匹配成功,Lex會繼續分析下去,讀至第五個字元時,發現
"AAAA"只有一個規則可用,即按行為進行處理,以此類推。可見Lex會選擇最長的字元
匹配規則。
如果將規則
AAAA {printf("THREE\n");};
改為
AAAAA {printf("THREE\n");};
./parser < file1.txt 輸出結果為:
THREE
TWO

再來一個特殊的例子:
%%
title showtitle();
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
%%
並輸入title,Lex解析完後發現,仍然存在兩個規則,這時Lex只會選擇第一個規則,下面
的則被忽略的。這里就體現了Lex的順序優先順序。把這個例子稍微改一下:
%%
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
title showtitle();
%%
Lex編譯時會提示:warning, rule cannot be matched.這時處理title字元時,匹配
到第一個規則後,第二個規則就無效了。
再把剛才第一個例子修改下,加深下印象!
%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
AAAA {printf("Cannot be executed!");};
./parser < file1.txt 顯示效果是一樣的,最後一項規則肯定是會忽略掉的。

C.規則部分的使用變數
且看下面示例:
%{
#include "stdio.h"
int linenum;
%}
int [0-9]+
float [0-9]*\.[0-9]+
%%
{int} printf("Int : %s\n",yytext);
{float} printf("Float : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在%}和%%之間,加入了一些類似變數的東西,注意是沒有;的,這表示int,float分
別代指特定的含義,在兩個%%之間,可以通過{int}{float}進行直接引用,簡化模
式定義。

(3) 用戶子程序部分
最後一個%%後面的內容是用戶子程序部分,可以包含用C語言編寫的子程序,而這些子
程序可以用在前面的動作中,這樣就可以達到簡化編程的目的。這里需要注意的是,
當編譯時不帶-ll選項時,是必須加入main函數和yywrap(yywrap將下後面說明)。如:
...
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 進行Lex分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}

三.Lex(Lexical Analyzar) 一些的內部變數和函數
內部預定義變數:
yytext char * 當前匹配的字元串
yyleng int 當前匹配的字元串長度
yyin FILE * lex當前的解析文件,默認為標准輸出
yyout FILE * lex解析後的輸出文件,默認為標准輸入
yylineno int 當前的行數信息
內部預定義宏:
ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字元的
默認動作

內部預定義的函數:
int yylex(void) 調用Lex進行詞法分析
int yywrap(void) 在文件(或輸入)的末尾調用。如果函數的返回值是1,就停止解
析。 因此它可以用來解析多個文件。代碼可以寫在第三段,這
樣可以解析多個文件。 方法是使用 yyin 文件指針指向不同的
文件,直到所有的文件都被解析。最後,yywrap() 可以返回1
來表示解析的結束。

lex和flex都是解析Lex文件的工具,用法相近,flex意為fast lexical analyzer generator。
可以看成lex的升級版本。

相關更多內容就需要參考flex的man手冊了,十分詳盡。

四.關於Lex的一些綜述
Lex其實就是詞法分析器,通過配置文件*.l,依據正則表達式逐字元去順序解析文件,
並動態更新內存的數據解析狀態。不過Lex只有狀態和狀態轉換能力。因為它沒有堆棧,
它不適合用於剖析外殼結構。而yacc增加了一個堆棧,並且能夠輕易處理像括弧這樣的
結構。Lex善長於模式匹配,如果有更多的運算要求就需要yacc了。

⑤ 什麼叫活前綴,用通俗的話解答下,或者簡單的例子。 這個題是編譯原理的。

活前綴:右句型的前綴,而且其右端不會超過該句型的最右邊句柄的末端。
右句型:最右推導可得到的句型。
最右推導:每步推導都替代最右非終結符的推導。
推導:我們說αBγ推導出αβγ,是說存在產生式B->β。
產生式:左邊為非終結符,右邊為終結符與非終結符組合成的串。
非終結符:是字元串的集合。
終結符:組成語言的詞。如c語言中的2,a,int,if等。
句型:開始符經過若干步推導後得到的串。
前綴:如abc的前綴為a、ab、abc。
開始符:開始符是整個語言的集合。
句柄:非形式的,句柄是和某個產生式右部匹配的字元串,把句柄歸約成產生式左部的非終結符,可以得到最右推導的逆過程的一步。形式的定義為:開始符s經過若干步最右推導得到αBγ,αBγ經過一步最右推導得到αβγ,若γ為終結符的集合,則β為句柄。舉例:
E->E+E|E*E|-E|(E)|id,對於id+id*id,其中一個最右推導為E->E+E->E+E*E->E+E*id->E+id*id->id+id*id。在id+id*id歸約成E+id*id的過程中,最左邊的id是句柄。E+id*id歸約成E+E*id時,最左邊的id是句柄,把E+E*id歸約成E+E*E時,id是句柄。把E+E*E歸約成E+E時E*E是句柄。E+E歸約成E時,E+E是句柄。
歸約:可理解為把產生式右邊的串用產生式左邊的非終結符代替。
注1:再說一下活前綴,舉個例子,比如E+E*E歸約成E+E,句柄是E*E,那麼它的活前綴就是E、E+、E+E、E+E*、E+E*E。又比如id+id*id歸約成E+id*id,句柄是最左邊的id,那麼它的活前綴是id,因為不能超過句柄。
注2:至於為什麼要給出活前綴的定義和如何用歸約的方法實現語法分析,還要進一步學習。

⑥ 編譯原理 FOLLOW集

因為有:
T→ F T』
T』→ *F T』
所以FIRST(T')是FOLLOW(F)的子集。所以 * 是FOLLOW(F)中的元素。
因為有:
T→ F T』
T』→ε
所以FOLLOW(T)是FOLLOW(F)的子集。
因為有:
E』→ +TE』
所以FIRST(E『)是FOLLOW(T)中的子集。所以FIRST(E『)是FOLLOW(F) 中的子集。
因為有:
E』→ +TE』
所以+是FIRST(E』)中的元素,所以+是FOLLOW(F)中的元素。
因為有:
E』→ ε
E → TE』
所以有:
FOLLOW(E)是FOLLOW(T)子集。前面有所以FOLLOW(T)是FOLLOW(F)的子集。所以有
FOLLOW(E)是FOLLOW(F)的子集,
由F → (E)|id
知 ) 是FOLLOW(E)的元素。所以 ) 是FOLLOW (F)的元素。
因為E是開始符號,所以有 $ 是FOLLOW(E)中的元素,所以 $ 是FOLLOW(F)中的元素。
綜上所述:
FOLLOW(F)= {*,+,),$}

熱點內容
微軟安卓編譯軟體 發布:2024-10-28 12:16:05 瀏覽:564
蘋果軟體如何關閉存儲 發布:2024-10-28 12:08:57 瀏覽:625
ie設置代理伺服器地址 發布:2024-10-28 11:52:37 瀏覽:657
如何製作一個好的伺服器 發布:2024-10-28 11:45:07 瀏覽:401
python核心編程第2版 發布:2024-10-28 11:40:34 瀏覽:504
雲伺服器如何搭建手游服務端 發布:2024-10-28 11:39:36 瀏覽:834
python讀取漢字 發布:2024-10-28 11:32:32 瀏覽:558
文件夾運行cmd 發布:2024-10-28 11:22:34 瀏覽:206
我的世界空島伺服器地址 發布:2024-10-28 11:22:17 瀏覽:550
備課系統源碼 發布:2024-10-28 11:15:23 瀏覽:191