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

DFA 驅動的詞法分析器 C 實現:關鍵字、標識符、數字、運算符完整識別

     編輯:關於C++

設計思路

採用**確定性有限自動機 (DFA)** 識別單詞。核心數據結構:
- move[state][char_class]:狀態轉移表。
- final[state]:接受狀態集合。
- 字符分類函數 judge(char) 將字符映射為列索引。

核心 DFA 引擎


int DFA(int start, const int* move, int width, const int* final, int flen, int (*classify)(char)) {
    char buf[256]; int len = 0, state = start, ch = getchar(), cls;
    while ((cls = classify(ch)) != -1) {
        int nxt = move[state * width + cls];
        if (nxt == -1) return -1; // 錯誤
        buf[len++] = ch;
        state = nxt;
        ch = getchar();
    }
    ungetc(ch, stdin);
    buf[len] = '\0';
    for (int i = 0; i < flen; ++i)
        if (state == final[i]) return i; // 返回接受狀態索引
    return -1;
}

各類單詞 DFA 設計

  • 標識符/關鍵字:字母/下劃線開頭,後接字母/數字/下劃線。接受狀態檢查是否為關鍵字表。
  • 數字:整數或小數,支持科學計數法(可擴展)。
  • 運算符/界符:單字符或雙字符(如 ==, <=, &&),用前瞻一字符決定。
  • 註释:/* ... */ 嵌套或不嵌套,直接跳過不產生 Token。

主掃描循環


while ((ch = getchar()) != EOF) {
    if (isspace(ch)) continue;
    if (isalpha(ch) || ch=='_') { ungetc(ch,stdin); scanIdent(); }
    else if (isdigit(ch)) { ungetc(ch,stdin); scanNumber(); }
    else scanOperator(ch);
}

錯誤處理與擴展

  • 非法字符:報錯並跳過。
  • 未閉合註释/字符串:EOF 時報錯。
  • 擴展:行號追蹤、符號表構建、輸出 Token 流供語法分析器使用。

完整代碼結構

代碼包含:字符分類函數、DFA 通用引擎、各類掃描函數、關鍵字表、主函數讀取 in.txt 輸出二元式。編譯運行即可得到詞法分析結果。

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