編寫Recursive Descent Parser的方法

前置概念

要求

  1. 每個展開式的the set of first token必須無交集,使文法可以不往前檢查即可判定錯誤
  2. 無left recursion

Scanner

採用正則表達式子區分whitespace與Symbol, 並且建立相關的token table對數值進行保存。

Methods

延伸

  1. 如果Parser總是在成功的時候使用getToken(), 是否會導致上層遞迴出錯時產生問題呢?

確保token能使用之後,在取得token,並且根據無交集的文法, 在進入時判斷正確後在獲取可以避免回溯的問題。

Parser

能臨時保存中間碼確保生成中間碼沒有問題, 如果在遞迴出錯時也可以還原中間碼,還原 堆疊以重新建立中間碼。

若Parser總是不進行回溯的話,則沒有必要進行回溯的行為。

在完全批配文法之後,透過中間碼進行計算。

Function 呼叫即為parser tree因此不必另外建立剖析樹。

EBNF

重複表達式

意指{}內重複Symbols可以採用while()進行編寫, 優先peekToken()以確定後面是否為要求的token而進入迴圈。

可選

方法類似一般 Symbols 的寫法,如果都沒有 Match 依然回傳 true

Terminal Symbol

呼叫 Terminal Symbol 之後,如果預計要有對映的 Token , 並且尚未獲取該 Token ,透過 Throw Error 的方式處理

中間碼

在確認文法正確之後生成中間碼(於 return 之前或 call funcion 之後), 如果上層文法出錯,透過上層進行還原中間碼流程

參見


Programming Language System Program Compiler