理解**:編譯器的前端技術編譯器的「前端」技術分為詞法分析、語法分析和語義分析三個部分
主要涉及自動機和形式語言方面的基礎的計算理論
編譯器的第一項工作叫做詞法分析
文章是由乙個個的中文單詞組成的, 程式處理也一樣,只不過這裡不叫單詞,而是叫做「詞法記號」,英文叫 token
如何寫乙個程式來識別 token 呢?
可以通過制定一些規則來區分每個不同的 token
這些規則可以通過手寫程式來實現
如果嫌手寫麻煩, 用詞法分析器的生成工具來生成,比如 lex(或其 gnu 版本,flex)
「正則文法(regular grammar)
「有限自動機(finite-state automaton,fsa,or finite automaton)」
詞法分析器生成工具是基於一些規則來工作的,
這些規則用「正則文法」表達,符合正則文法的表示式稱為「正規表示式」
生成工具可以讀入正規表示式,生成一種叫「有限自動機」的演算法,來完成具體的詞法分析工作。
詞法分析器也是一樣,它分析整個程式的字串,當遇到不同的字元時,會驅使它遷移到不同的狀態。
詞法分析程式在掃瞄 age 的時候,處於「識別符號」狀態,等它遇到乙個 > 符號,就切換到「比較操作符」的狀態。詞法分析過程,就是這樣乙個個狀態遷移的過程。
你也許熟悉正規表示式,因為我們在程式設計過程中經常用正規表示式來做使用者輸入的校驗,例如是否輸入了乙個正確的電子郵件位址,這其實就是在做詞法分析
詞法分析是把程式分割成乙個個 token 的過程,可以通過構造有限自動機來實現
抽象語法樹(abstract syntax tree,ast)
詞法分析是識別乙個個的單詞,而語法分析就是在詞法分析的基礎上識別出程式的語法結構
這個結構是乙個樹狀結構,是計算機容易理解和執行的。
程式也有定義良好的語法結構,它的語法分析過程,就是構造這麼一棵樹。乙個程式就是一棵樹,這棵樹叫做抽象語法樹(abstract syntax tree,ast)
樹的每個節點(子樹)是乙個語法單元,這個單元的構成規則就叫「語法」。每個節點還可以有下級節點
層層巢狀的樹狀結構,是我們對電腦程式的直觀理解。計算機語言總是乙個結構套著另乙個結構,大的程式套著子程式,子程式又可以包含子程式
(1) 遞迴下降演算法(recursive descent parsing)
一種非常直觀的構造思路是自上而下進行分析
首先構造根節點,代表整個程式,之後向下掃瞄 token 串,構建它的子節點
一棵子樹就掃瞄完畢了。程式退回到根節點,開始構建根節點的第二個子節點。這樣遞迴地掃瞄,直到構建起一棵完整的樹
這個演算法就是非常常用的遞迴下降演算法(recursive descent parsing)
(2) 自底向上的演算法。這個演算法會先將最下面的葉子節點識別出來,然後再組裝上一級節點。有點兒像搭積木,我們總是先構造出小的單元,然後再組裝成更大的單元
除了手寫,有沒有偷懶的、更省事的方法呢?
語法分析是把程式的結構識別出來,並形成一棵便於由計算機處理的抽象語法樹。可以用遞迴下降的演算法來實現
語義分析就是要讓計算機理解我們的真實意圖,把一些模稜兩可的地方消除掉
你可能會覺得理解自然語言的含義已經很難了,所以計算機語言的語義分析也一定很難。其實語義分析沒那麼複雜,
因為計算機語言的語義一般可以表達為一些規則,你只要檢查是否符合這些規則就行了
語義分析工作的某些成果,會作為屬性標註在抽象語法樹上,比如在 age 這個識別符號節點和 45 這個字面量節點上,都會標識它的資料型別是 int 型的
在這個樹上還可以標記很多屬性,有些屬性是在之前的兩個階段就被標註上了,比如所處的源**行號,這一行的第幾個字元。
做了這些屬性標註以後,編譯器在後面就可以依據這些資訊生成目標**了
語義分析是消除語義模糊,生成一些屬性資訊,讓計算機能夠依據這些資訊生成目標**
前端編譯原理 筆記 BISON
bsion文件,下面是中文的位址 上面的是左遞迴,下面的是右遞迴,推薦的是盡量左遞迴的寫法 使用 left,right或者 nonassoc 可以一次宣告乙個記號並指明它的優先順序和結合性.這些被稱做優先順序宣告 precedence declarations 解決中衝突的方法是比較正在考慮的規則和...
編譯原理總結(《編譯與反編譯技術》)
詞法分析 語法將語義分析放到語法分析中 中間語言的表示與語法制導翻譯例項 符號表優化 目標 生成 目標 執行 什麼是編譯程式?把某一種高階語言程式等價的轉換成另一種低階語言程式的程式 編譯過程都包括哪些階段?詞法分析 語法分析 語義分析與中間 生成 中間 優化 目標 生成 畫出編譯程式的結構框圖.符...
編譯前端工程
不全棧 以後就會爛大街,失業 所以 忙了乙個下午前端 1.本機已經安裝nodejs 2.npm install g yo bower gulp registry 3.cd 專案根目錄 目錄下有 bower.json,gruntfile.js,package.json 4.npm install re...