將文本格式正則表達式轉換為鏈表式 NFA(非確定性有限自動機)。首階段任務:輸入文本預處理,核心難點在於宏定義遞歸展開。
D [0-9] // 宏定義
A [a-z] // 宏定義
AD {D}|{A} // 宏引用其他宏
{AD}\.{AD}+ // 正則表達式主體
預處理後應轉為:
([0-9]|[a-z])\.([0-9]|[a-z])+
Map macroMap 儲存「宏名 → 宏體」expandMacro(name) 介面,供正則處理器呼叫{ 且不在雙引號內 → 判定為宏引用macroHandler.expandMacro(name) → 替換{} → 遞歸展開,直到無宏引用// RegularExpressionHandler 核心邏輯
private String expandMacro(String macroName) {
String content = macroHandler.getMacro(macroName); // 從 Map 取得
if (content == null) throw new RuntimeException("Undefined macro: " + macroName);
// 檢查宏體內是否還有嵌套宏引用
while (content.indexOf('{') != -1) {
content = preProcessExpr(content); // 遞歸處理內層宏
}
return content;
}
掃描時維護 inQuote 狀態:
" 切換狀態{ } 視為普通字符,不觸發宏展開
src/
├── MacroHandler.java # 宏解析、儲存、展開介面
├── RegularExpressionHandler.java # 正則文本掃描、宏遞歸替換
├── InputSystem.java # 統一輸入介面(控制台/檔案)
└── Main.java # 入口測試

完成預處理後,下一步將實作: