import java.util.*; /* Programme : supprimer les commentaires d'un programme Java */ class NoComment { // Supprime tous les caractères jusqu'à la fin de ligne. Retourne // normalement '\n'. Retourne -1 si la fin de l'entrée est atteinte // avant la fin de ligne. // // Cette fonction est utilisée pour supprimer les commentaires sur // une ligne (//). // static int killToEOL() throws java.io.IOException { int c; while ((c = System.in.read()) != -1 && c != '\n') /* nop */; return c; } // Supprime tous les caractères jusqu'à rencontrer la séquence "*/" // qui est également supprimée. Après avoir trouvé la séquence "*/", // retourne le prochain caractère de l'entrée, ou -1 si la fin de // l'entrée est atteinte. // // Cette fonction est utilisée pour supprimer les commentaires // multi-lignes (/* ... */). // static int killCComment() throws java.io.IOException { int c; int c2 = 0; while ((c = System.in.read()) != -1 && (c2 != '*' || c != '/')) c2 = c; return System.in.read(); } // Copie l'entrée sur la sortie, jusqu'à rencontrer un caractère delim // (en paramètre) non précédé d'un '\' (sauf si ce '\' était lui-même // précédé d'un '\'...). Retourne normalement la valeur de delim, // sauf si la fin de l'entrée est atteinte avant, auquel cas la valeur // -1 est retournée. // // Cette fonction est utilisée pour copier les constantes de type // caractère (delim == '\'') ou bien chaîne de caractères // (delim == '"'). // static int copyStringConstant(int delim) throws java.io.IOException { int c; boolean backslashed = false; while ((c = System.in.read()) != -1 && (c != delim || backslashed)) { System.out.write(c); backslashed = !backslashed && c == '\\'; } return c; } public static void main(String[] args) throws java.io.IOException { int c; boolean slashRetained = false; // Idée de l'algorithme // ==================== // Les caractères sont recopiés un par uns. Si c'est un slash, alors // il est retenu car il peut marquer le début d'un commentaire. // // Si on rencontre le début d'un commentaire, alors ce commentaire // est supprimé en utilisant la fonction appropriée. // // Si on rencontre le début d'une constante de type caractère ou // chaîne, alors la suite est recopiée jusqu'à en rencontrer la // fin. while ((c = System.in.read()) != -1) { if (slashRetained) { if (c == '/') c = killToEOL(); // commentaire C++ else if (c == '*') c = killCComment(); // commentaire C else System.out.write('/'); // le '/' ne marquait pas le début // d'un commentaire slashRetained = false; } if (c == '"' || c == '\'') { System.out.write(c); c = copyStringConstant(c); } if (c == '/') slashRetained = true; else if (c != -1) System.out.write(c); } if (slashRetained) System.out.write('/'); System.out.flush(); } }