詞法分析器設計


編譯程序總框

詞法分析器的設計

詞法分析的任務:
從左至右逐個字符地對源程序進行掃描,產生一個個單詞符號,

詞法分析器(Lexical Analyzer):掃描器(Scanner),執行詞法分析的程序

功能:輸入源程序、輸出單詞符號

單詞符號的種類:

  • 基本字:如 begin,repeat,for,…

  • 標識符:用來表示各種名字,如變量名、數組名和過程名

  • 常數:各種類型的常數

  • 運算符:+,-,*,/,…

  • 界符:逗號、分號、括號和空白

  • 輸出的單詞符號的表示形式

    • (單詞種別,單詞自身的值)
  • 單詞種別通常用整數編碼表示

    • 若一個種別只有一個單詞符號,則種別編碼就代表該單詞符號。假定基本字、運算符和界符都是一符一種。
    • 若一個種別有多個單詞符號,則對於每個單詞符號,給出種別編碼和自身的值。
      • 標識符單列一種;標識符自身的值表示成按機器字節划分的內部碼
      • 常數按類型分種;常數的值則表示成標准的二進制形式

詞法分析作為一個獨立的階段: 結構簡潔、清晰和條理化,有利於集中考慮詞法分析一些枝節問題,但不一定不作為單獨的一遍,將其處理為一個子程序

詞法分析器的結構


單詞符號的識別:超前搜索

標識符識別:字母開頭的字母數字串,后跟界符或算符

常數識別:識別出算術常數並將其轉變為二進制內碼表示

算符和界符的識別:把多字符組成的算符和界符拼合成一個單詞符號

幾點限制——不必使用超前搜索

  • 所有基本字都是保留字;用戶不能用它們作自己的標識符
  • 基本字作為特殊的標識符來處理,使用保留字表
  • 如果基本字、標識符和常數(或標號)之間沒有確定的運算符或界符作間隔,則必須使用一個空白符作間隔

狀態轉換圖

狀態轉換圖是一張有限方向圖,結點代表狀態,用圓圈表示,狀態之間用箭弧連結,箭弧上的標記(字符)代表射出結狀態下可能出現的輸入字符或字符類,一張轉換圖只包含有限個狀態,其中有一個為初態,至少要有一個終態,狀態轉換圖可用於識別(或接受)一定的字符串若存在一條從初態到某一終態的道路,且這條路上所有弧上的標記符連接成的字等於α,則稱α被該狀態轉換圖所識別(接受)




狀態轉換圖的實現



全局變量與過程

  • ch 字符變量,存放最新讀入的源程序字符
  • strToken 字符數組,存放構成單詞符號的字符串
  • GetChar 子程序過程,把下一個字符讀入到 ch 中
  • GetBC 子程序過程,跳過空白符,直至 ch 中讀入一非空白符
  • Concat 子程序,把ch中的字符連接到 strToken
  • IsLetter和 IsDisgital 布爾函數,判斷ch中字符是否為字母和數字
  • Reserve 整型函數,對於 strToken 中的字符串查找保留字表,若它是保留字則給出它的編碼,否則回送0
  • Retract 子程序,把搜索指針回調一個字符位置
  • InsertId 整型函數,將strToken中的標識符插入符號表,返回符號表指針
  • InsertConst 整型函數過程,將strToken中的常數插入常數表,返回常數表指針

詞法分析器的實現


將狀態圖的代碼一般

變量curState用於保存現有的狀態,用二維數組表示狀態圖:stateTrans[state][ch]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM