Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Exercise 1-23.
- * Write a program to remove all comments from a C program. Don't forget to
- * handle quoted strings and character constants properly.
- * C comments don't nest.
- */
- #include <stdio.h>
- #define ST_PRC_NOR_COD 1 /* processing C code */
- #define ST_ABT_ENT_CMT 2 /* about to enter a comment block */
- #define ST_INS_NOR_CMT 3 /* inside a C comment block */
- #define ST_ABT_EXT_CMT 4 /* about to exit C comment block */
- #define ST_INS_QUT_STR 5 /* inside a quoted string */
- #define ST_INS_QUT_ESC 6 /*
- * inside a quoted string, and secaping
- * the next character
- */
- #define ST_INS_SQT_STR 7 /* inside single quoted string */
- #define ST_INS_SQT_ESC 8 /*
- * inside a quoted string, and escaping
- * the next character
- */
- int
- main() {
- int state = ST_PRC_NOR_COD;
- int c;
- while ((c = getchar()) !=EOF) {
- switch (state) {
- case ST_PRC_NOR_COD:
- switch (c) {
- case '/':
- state = ST_ABT_ENT_CMT;
- break;
- case '"':
- state = ST_INS_QUT_STR;
- putchar(c);
- break;
- case '\'':
- state = ST_INS_SQT_STR;
- putchar(c);
- break;
- default:
- putchar(c);
- break;
- }
- break;
- case ST_ABT_ENT_CMT:
- switch (c) {
- case '/':
- state = ST_ABT_ENT_CMT;
- putchar(c);
- break;
- case '*':
- state = ST_INS_NOR_CMT;
- break;
- default:
- state = ST_PRC_NOR_COD;
- putchar('/');
- putchar(c);
- break;
- }
- break;
- case ST_INS_NOR_CMT:
- switch (c) {
- case '*':
- state = ST_ABT_EXT_CMT;
- break;
- }
- break;
- case ST_ABT_EXT_CMT:
- switch (c) {
- case '/':
- state = ST_PRC_NOR_COD;
- break;
- case '*':
- state = ST_ABT_EXT_CMT;
- break;
- default:
- state = ST_INS_NOR_CMT;
- break;
- }
- break;
- case ST_INS_QUT_STR:
- switch (c) {
- case '\\':
- state = ST_INS_QUT_ESC;
- putchar(c);
- break;
- case '"':
- state = ST_PRC_NOR_COD;
- putchar(c);
- break;
- default:
- putchar(c);
- break;
- }
- break;
- case ST_INS_QUT_ESC:
- switch (c) {
- case '\\':
- putchar (c);
- break;
- default:
- state = ST_INS_QUT_STR;
- putchar (c);
- break;
- }
- break;
- case ST_INS_SQT_STR:
- switch(c) {
- case '\\':
- state = ST_INS_SQT_ESC;
- putchar(c);
- break;
- case '\'':
- state = ST_PRC_NOR_COD;
- putchar(c);
- break;
- default:
- state = ST_INS_SQT_STR;
- putchar(c);
- break;
- }
- break;
- case ST_INS_SQT_ESC:
- switch (c) {
- case '\\':
- putchar(c);
- break;
- default:
- state = ST_INS_SQT_STR;
- putchar(c);
- break;
- }
- break;
- }
- }
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment