一、編譯原理的難度
編譯原理特別復雜,研究的是高級語言如何翻譯成匯編語言的過程。
二、編譯過程中一些思路
(一)語義識別的作用
語義識別指的是把一些無關字符忽略,把一些變量名保存在一起,把用空格隔開的關鍵字單獨放一起。
例如:
從源代碼第一個字符開始遍歷,如果:
1、遇到 //開頭的字符,那么后面直到換行符之間的字符都是注釋,就可以忽略。
2、如果遇到一個字符,它的左邊是一行的開頭,或者是空格,那么保存起來,繼續讀取直到下一個空格或者特殊符(特殊符是各種括號,各種運算符),就把這一段字符集中保存在一起。
3、判斷第2步獲取的字符是變量名,還是關鍵字。
4、遇到運算符或者括號就保存起來,作為一個單位。
5、遇到語句結束符也單獨作為一個單位。
(二)語法判斷的思路
1、把從語義識別過程中得到的每個單位構造成一棵樹。
2、樹的根是每個重新開始的語義單位,例如 var、 for、while、int等等。
3、根節點的子節點是遍歷過程中出現的下一個語義單位。
4、持續第3步,直到語句結束符;的添加。
5、根據編程語言的設計規則,來判斷以上構造的語法樹是否合法。
也就是判斷每個節點是否允許出現該子節點,例如 for節點是否允許出現 int節點?不能。for節點一般子節點是 左花括號{節點。
語法判斷完成后,就能得出程序編碼是否有錯誤。
(三)把每個語法樹轉成匯編語言
1、把聲明和創建變量的代碼替換為 分配內存空間,把變量名和內存地址號保存起來。
2、如果是循環,就建立一個子程序,名字是唯一生成的,把循環體作為子程序的內容,循環驗證條件就轉換成匯編的判斷條件。
如果滿足就調用子程序,不滿足就結束子程序。
3、如果使用網絡讀寫、磁盤讀寫,就調用對應的主板中斷程序。
4、如果是一些運算,就用對應的匯編運算符來替代,把結果存入寄存器或者內存塊中。