编译原理_1
- 綜合 :根據中間表示和符號表中的信息來構造用戶期待的目標程序。
分析:把源程序,分解成多個要素,并在這些要素之上加上語法結構。然后,使用這個結構創建源程序的一個中間表示。如果分析部分檢查出源程序沒有按正確的語法構成,或者語義上不一致,就必須提供有用的信息。使用戶可以按此來更改。還有收集有關源程序的信息,并把信息放在一個稱為符號表的數據結構中。符號表和中間表示形式一起傳送給綜合部分。
- 詞法分析:編譯器的第一個步驟。詞法分析器讀入組成源程序的字符流,并將它們組織成有意義的詞素的序列。對于每個詞素,語法分析器產生如下形式的詞法單元作為輸出。
- <token-name,attribute-value>
- 這個詞法單元被傳送給下一個步驟,即語法分析。第一個分量token-name是一個由語法分析步驟使用的抽象符號,而第二個分量attribute-value指向符號表中關于這個詞法單元的條目。符號表中關于這個詞法單元的條目信息會被語義分析和代碼生成使用。
- position=initial+rate*60
- position是一個詞素,被映射成詞法單元<id,1>,其中id是表示標識符的抽象符號,1指向符號表中position對用的條目。一個標識符對應的符號表條目存放該標識符有關的信息,比如他的名字和類型。
- 賦值符號=是一個詞素,被映射成詞法單元。<=>.這個詞法單元不需要屬性值,所以省略第二個分量。也可以使用assign這樣的抽象符號作為詞法單元的名字。
- 分割詞素的空格會被語法分析器忽略掉
- 語法分析:編譯器的第二個步驟。語法分析器使用由詞法分析器生成的各個詞法單元第一個分量來創建樹形的中間表示。該中間表示給出了詞法分析產生的詞法單元流的語法結構。一個常用的表示方法是語法樹,樹中的每個內部節點表示一個運算,而該節點的子節點表示該運算的分量。
- 語義分析:使用語法樹和符號表中的信息來檢查源程序是否和語言定義的語義一致。同事也收集類型信息,并把這些信息存放到語法樹或符號表中。語義分析一個重要的部分是類型檢查。編譯器檢查每個運算符是否具有匹配的運算分量。
- 程序涉及語言,可能允許某些類型轉換,被稱為自動類型轉換。
- 中間代碼生成
- 把一個源程序,翻譯成目標代碼的過程中,一個編譯器可能構造出一個或者多個中間表示。這些中間表示可以有多種形式。語法樹是一種中間表示形式,他們通常在語法分析和語義分析中使用。
- 三地址指令
- 每個三地址賦值指令,右部最多只有一個運算符。這些指令確定了運算完成的順序。
- 乘法應該在加法之前完成
- 編譯器應該生成一個臨時名字以存放一個三地址指令計算得到的值。
- 有些三地址指令的運算分量少于三個
- 每個三地址賦值指令,右部最多只有一個運算符。這些指令確定了運算完成的順序。
- 代碼生成
- 代碼生成器,以源程序的中間表示形式作為輸入,并把它映射到目標語言。如果目標語言是機器代碼。必須為程序使用的每個變量選擇寄存器或內存位置,然后中間指令被翻譯成,能夠完成相同任務的及其指令序列。
- 符號表管理
- 編譯器的重要功能之一是記錄源程序中使用變量的名字。并收集每個名字的各種屬性有關的信息。這些屬性可以提供一個名字的存儲分配、他的類型、作用域(程序在哪些地方可以使用這個這個名字的值)。他的參數數量和類型、每個參數的傳遞方式(值傳遞或引用傳遞)以及返回類型。
- 符號表數據結構,為每個變量名字創建了一個記錄條目。記錄的字段就是名字的各個屬性。這個數據結構允許編譯器快速查找每個名字的記錄,并向紀錄中快速存放和獲取記錄中的數據。
轉載于:https://www.cnblogs.com/binarysystemloophole/p/10576468.html
總結
- 上一篇: 程序员必备的GitHub加速指南,真香!
- 下一篇: 关于解决并发问题,99%的程序员都会忽略