首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 詞法分析器(二):輸入緩衝與源碼定位

     編輯:關於C#

前言

詞法分析前需解決字符流讀取與回退問題。.NET Stream/TextReader 不支援回退,需自行實現緩衝。

一、輸入緩衝設計

參考《編譯原理》雙緩衝區思想,改進為多緩衝區環形鏈表:

  • 每個緩衝區固定大小,以雙向鏈表連成環
  • 三指針:first(最早數據)、last(最新數據)、current(當前訪問)
  • 讀取時從 current 取字符,耗盡則移向 last;若 current==last 且無數據,從 TextReader 讀取新數據到新緩衝區,推進 current/last
  • 回退:current 向 first 方向移動

釋放策略

  • Drop:標記 current 前數據無效,釋放對應緩衝區供復用
  • Accept:以字符串返回無效數據
  • AcceptToken:以 Token 返回無效數據(便於詞法分析)

優點:除填充數據外無額外拷貝,指針操作極快;及時 Drop 時僅用兩緩衝區。缺點:邏輯較複雜,需仔細處理邊界。

二、源碼定位

Token 需記錄行列號便於報錯。三維數據:索引(0 起)、行號/列號(1 起)。

行定位

統計 '\n' 數量(兼容 Windows \r\n)。

列定位

  • 全/半角:中文佔 2 列,英文 1 列。用 Encoding.Default.GetEncoder().GetByteCount() 計算(避免內存問題)
  • Tab:寬度可配置(TabSize)。下一字符列號 = TabSize * (1 + (currentCol-1)/TabSize) + 1

計算時機

放在 Drop/Accept/AcceptToken 中:

  • 批量計算效率高於逐字符
  • 識別出 Token 時恰好觸發這些操作,無需匹配過程中實時定位
  • 回退時無需反向推算位置

定位邏輯封裝於 SourceLocator 類。

下一步

下一篇介紹正則表達式解析與表示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved