首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

手寫簡易分詞器:針對 C/Java 原始碼的詞法分析實作

     編輯:Java 綜合教學

手寫簡易分詞器:針對 C/Java 原始碼的詞法分析實作

本文展示一個基於關鍵字、運算子、分隔符與數字識別的簡易分詞器,可擴充套件支援多種語言。

核心設計

  • 詞元類型:關鍵字(1)、識別字(2)、整數(3)、運算子(4)、分隔符(5)
  • 狀態機制:透過 match_1~match_4 旗標追蹤當前識別狀態
  • 可配置規則:支援自訂關鍵字、運算子、分隔符集合

主要類結構

public class CFenCiQi {
    // 關鍵字、運算子、分隔符、數字集合
    private List keywords, operators, separators, digits;
    // 結果儲存:Map<類型, 值>
    private List> resultList;
    
    public void init() { /* 初始化預設 C 語言規則 */ }
    public void setDefaultParam(List keys, List ops, List seps) { /* 自訂規則 */ }
    public List> getResult() throws Exception { /* 執行分詞 */ }
}

分詞流程

  1. 逐字元讀取來源檔案
  2. 根據字元類型(字母/數字/符號)切換狀態
  3. 遇到邊界(運算子/分隔符/類型變更)時輸出當前詞元
  4. 關鍵字與識別字透過列表比對區分

測試用例

// 預設 C 風格
CFenCiQi tokenizer = new CFenCiQi("test.c");
List> tokens = tokenizer.getResult();

// 自訂 Java 關鍵字
List javaKeys = Arrays.asList("public", "class", "void", "static", ...);
tokenizer.setDefaultParam(javaKeys, operators, separators);
tokenizer.setFilePath("Demo.java");
tokens = tokenizer.getResult();

輸出格式範例

{1->if}, {2->main}, {5->(}, {5->)}, {5->{}, {1->return}, {3->0}, {5->;}

已知限制與改進方向

  • 不支援浮點數、字串常數、註解過濾
  • 多字元運算子(如 >=, !=)需優先匹配
  • 可引入正則表達式或 ANTLR 等成熟框架替代

此實作適合教學示範或輕量級原始碼分析場景。

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