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

C 語言實作 C 風格註解轉 C++ 風格:狀態機解析與邊界處理

     編輯:關於C語言

C 語言實作 C 風格註解轉 C++ 風格:狀態機解析與邊界處理

需求

將 /* ... */ 轉為 // ...,處理多行、巢狀、字串常數內的註解符號等邊界情況。

狀態機設計

核心邏輯 (簡化版)

int convert(FILE *in, FILE *out) {
    int state = NORMAL, ch, next;
    while ((ch = fgetc(in)) != EOF) {
        switch (state) {
            case NORMAL:
                if (ch == '/') {
                    next = fgetc(in);
                    if (next == '*') { state = IN_C_COMMENT; fputs("//", out); }
                    else if (next == '/') { state = IN_CPP_COMMENT; fputs("//", out); fputc('/', out); }
                    else { fputc('/', out); fputc(next, out); }
                } else if (ch == '"') { state = IN_STRING; fputc(ch, out); }
                else if (ch == '\'') { state = IN_CHAR; fputc(ch, out); }
                else fputc(ch, out);
                break;
            case IN_C_COMMENT:
                if (ch == '*') {
                    next = fgetc(in);
                    if (next == '/') { state = NORMAL; fputc('\n', out); }
                    else { fputc('*', out); ungetc(next, in); }
                } else if (ch == '\n') fputc('\n', out);
                break;
            // ... 其他狀態處理
        }
    }
    return state == IN_C_COMMENT ? -1 : 0; // 未閉合檢查
}

關鍵難點處理

  • 巢狀註解:C 標準不支援,但實際代碼可能出現,需決定是否支援或報錯。
  • 字串/字元常數內的 /*:狀態機進入 IN_STRING/IN_CHAR 時忽略註解開始符。
  • 多行註解換行:結束時補換行,保持行號對齊。
  • 行尾註解:code /* comment */ 轉為 code // comment\n。

完整程式碼結構

原始輸入包含完整的 AnnotationConvert、StartAnnotationConvert、main,可直接編譯執行測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
狀態說明
NORMAL一般程式碼
IN_C_COMMENT在 /* ... */ 內
IN_CPP_COMMENT在 // ... 內 (輸出時保持)
IN_STRING在 "..." 內
IN_CHAR在 '...' 內