- // 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;
- }
来源: http://www.phpxs.com/code/1004126/