首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

相容 90% 標準 C 的詞法分析器實作:狀態機與 Token 設計

     編輯:C++ 入門

設計目標

  • 支援 C90 主要語法:關鍵字、識別字、常數(整數/浮點數)、運算子、標點符號、字串/字元常數、註解。
  • 採用**有限狀態機 (FSM)** 驅動,單遍掃描,O(n) 時間。
  • 輸出 Token 序列,含類型、值、行號,便於後續語法分析。

核心資料結構

enum TokenType { NONE, KEYWORD, INT, FLOAT, SYMBOL, VARIABLE, STRING, CHAR, COMMENT };

struct Token {
    TokenType type;
    std::string text;
    size_t line_no;
    // 建構子、setter...
};

狀態機主要狀態

  • IN_NONE:初始/分隔符狀態
  • IN_ID:識別字/關鍵字
  • IN_NUM:數字常數(含十六進位、浮點、科學記號)
  • IN_STR:雙引號字串
  • IN_CHAR:單引號字元
  • IN_CMT1:// 單行註解
  • IN_CMT2:/* */ 多行註解
  • IN_SYM:運算子/標點(需向前看一字元判斷雙字元運算子如 ==, &&)

關鍵處理邏輯

  1. 關鍵字識別:識別字完成後查 unordered_set 判斷是否為關鍵字。
  2. 數字後綴:U, L, UL, F 等後綴併入 Token 文本,語法分析階段再解析。
  3. 跳過註解:單行註解遇換行結束;多行註解遇 */ 結束,支援巢狀(可選)。
  4. 逸出序列:字串/字元常數內處理 \n, \t, \\, \", \' 等。

測試驗證

對 Nginx 原始碼(約 10 萬行)完整跑測,Token 化結果與人工檢查一致,唯已知限制:

  • 八進位常數與數字型別後綴組合的極端情形未完全支援。
  • 部分 C99/C11 新增語法(_Bool, _Complex, // 註解已支援)需擴充關鍵字表。

程式碼結構

// states.h: 狀態枚舉
// token.h: Token 定義
// scanner.h: Scanner 類別宣告
// scanner.cpp: 掃描主邏輯(巨大 switch-case 狀態機)
// main.cpp: 讀檔、呼叫 scanner、輸出 Token 串流

擴充建議

  • 加入 #line 指令支援,利於預處理器整合。
  • 輸出 JSON/二進位格式,便於語言伺服器協定 (LSP) 整合。
  • 引入 flex/re2c 產生器,從正規表示式自動生成掃描器,提升維護性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved