前置概念
- BNF/BENF
- 文法即function
- 拆分Parsing與Scanning
- 堆疊操作
要求
- 每個展開式的the set of first token必須無交集,使文法可以不往前檢查即可判定錯誤
- 無left recursion
Scanner
採用正則表達式子區分whitespace與Symbol, 並且建立相關的token table對數值進行保存。
Methods
- peekToken(): 獲取下一個token值
- getToken(): 獲取當前的token值
延伸
- 如果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