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; }