詞法分析前需解決字符流讀取與回退問題。.NET Stream/TextReader 不支援回退,需自行實現緩衝。
參考《編譯原理》雙緩衝區思想,改進為多緩衝區環形鏈表:
first(最早數據)、last(最新數據)、current(當前訪問)current 取字符,耗盡則移向 last;若 current==last 且無數據,從 TextReader 讀取新數據到新緩衝區,推進 current/lastcurrent 向 first 方向移動current 前數據無效,釋放對應緩衝區供復用優點:除填充數據外無額外拷貝,指針操作極快;及時 Drop 時僅用兩緩衝區。缺點:邏輯較複雜,需仔細處理邊界。
Token 需記錄行列號便於報錯。三維數據:索引(0 起)、行號/列號(1 起)。
統計 '\n' 數量(兼容 Windows \r\n)。
Encoding.Default.GetEncoder().GetByteCount() 計算(避免內存問題)TabSize)。下一字符列號 = TabSize * (1 + (currentCol-1)/TabSize) + 1放在 Drop/Accept/AcceptToken 中:
定位邏輯封裝於 SourceLocator 類。
下一篇介紹正則表達式解析與表示。