C++編寫的用于去除C、C++、Java等語言的注釋的代碼片段
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!