|
状態遷移を使ってみました。有限オートマトンですね。
printf("abc /* def */ ghi"); も大丈夫。
#include <stdio.h>
enum State { INITIAL, SLASH, COMMENT, ASTERISK, STRING, ESCAPE };
enum State state = INITIAL;
int quote;
void delete_comment(const char *s1, char *s2)
{
int c;
while (c = *s1++) {
switch (state) {
case INITIAL:
if (c == '/') { state = SLASH; break; }
if (c == '"' || c == '\'') { quote = c; state = STRING; }
*s2++ = c; break;
case SLASH:
if (c == '*') { state = COMMENT; break; }
*s2++ = '/';
if (c == '/') break;
*s2++ = c; state = INITIAL; break;
case COMMENT:
if (c == '*') state = ASTERISK;
break;
case ASTERISK:
if (c == '/') { state = 0; break; }
if (c == '*') break;
state = COMMENT; break;
case STRING:
*s2++ = c;
if (c == quote) { state = INITIAL; break; }
if (c == '\\') { state = ESCAPE; break; }
break;
case ESCAPE:
*s2++ = c; state = STRING; break;
}
}
*s2 = '\0';
}
int main()
{
char buf[1024];
while (fgets(buf, sizeof buf, stdin)) {
delete_comment(buf, buf);
fputs(buf, stdout);
}
return 0;
}
実は、このプログラムは、現在の C の規格に合わないところがあります。
abc/*def*/ghi が abcghi になってしまいますが、abc ghi のようにくっつかないのが本当です。
なお、C では、コメントは「文」でありません。
|