編譯原理讀書筆記

潘仁波 發表於 2020-11-21

position := initial + rate * 60

詞法分析

  1. 識別符號 position
  2. 賦值符號 :=
  3. 識別符號 initial
  4. 加號 +
  5. 識別符號 rate
  6. 乘號 *
  7. 數字 60

語法分析

規則

  1. 任何一個識別符號都是表示式
  2. 任何一個數都是表示式
  3. 如果 expression1expression2 是表示式,那麼
    • expression1 + expression2
    • expression1 * expression2

也是表示式

rate\*60 是一個表示式,initial+rate\*60 也是一個表示式

定義語句的規則

  1. 如果 identifier1 是一個識別符號,expression2 是一個表示式,則

identifier1 := expression2

是一個語句

  1. 如果 expression1 是一個表示式, statement2 是一個語句,則

while(expression1) do statement2

if(expression1) then statement2

也是一個語句

如果給出一段原始碼,掃描輸入流就可以完成識別符號的識別,直到掃描到符號(加號 減號 乘號等)為止,之前掃描的字母和數字都可以當成是一個識別符號,然後把這個識別符號儲存到符號表中,再再輸入流中把這個識別符號和那個符號刪掉之後,再繼續向後掃描

語義分析

編譯器的個階段

源程式 -> 詞法分析器 -> 語法分析器 -> 語義分析器 -> 中間程式碼生成器 -> 程式碼優化器 -> 程式碼生成器 -> 目標程式

還是這個例子:position := initial + rate * 60

詞法分析
id1 := id2 + id3 * 60

中間程式碼生成器

temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 * temp2
id1 := temp3

程式碼優化器

temp1 := id3 * 60.0
id1 := id2 * temp1

程式碼生成器

MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1