C++編寫的用于去除C、C++、Java等語言的注釋的代碼片段

mx3y 9年前發布 | 1K 次閱讀 C/C++

C++編寫的用于去除C、C++、Java等語言的注釋的代碼片段

// author :Rohith Gowda
// - remove C/C++ comments
// - assume no nested block comments

// Modifications

include<iostream>

include<fstream>

using namespace std;

void parse(ifstream &fin , ofstream &fout) { char curr, prev = '\0'; bool comment = false; bool charLiteral = false; bool stringLiteral = false;

while (fin.get(curr)) {
    if (charLiteral) {
        fout << curr;
        if (curr == '\'' && prev != '\\') { // 'a' ends
            charLiteral = false;
        }
        prev = (prev == '\\' && curr == '\\') ? '\0' : curr;
    } else if (stringLiteral) {
        fout << curr;
        if (curr == '\"' && prev != '\\') { // "string" ends
            stringLiteral = false;
        }
        prev = (prev == '\\' && curr == '\\') ? '\0' : curr;
    } else if (comment) {
        if (curr == '/' && prev == '*') { /* comment ends */
            prev = '\0';
            comment = false;
        } else { /* comment text */
            prev = curr;
        }
    } else if (prev == '/') {
        if (curr == '/') { // end of line comment
            fout << '\n';
            prev = '\0';
            while (fin.get() != '\n');
        } else if (curr == '*') { /* comment starts */
            prev = '\0';
            comment = true;
        } else { // normal code
            fout << prev << curr;
            prev = curr;
        }
    } else {
        if (curr != '/') {
            fout << curr;
        }
        charLiteral = (prev != '\\' && curr == '\'');
        stringLiteral = (prev != '\\' && curr == '\"');
        prev = (prev == '\\' && curr == '\\') ? '\0' : curr;
    }
}

}

int main(int argc, char *argv[]) { if (argc != 3) { cerr << "Usage:\t" << argv[0] << " <input_file> <output_file>\n"; return 1; }

ifstream fin(argv[1]);
ofstream fout(argv[2]);

if (!fin) {
    cerr << "Error:\t\"" << argv[1] << "\" - no such file\n";
    return 1;
}

parse(fin, fout);

fin.close();
fout.close();

return 0;

}</pre>

 本文由用戶 mx3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!