khalfella

ansi_c_pg34_ch01_ex23.c

Oct 3rd, 2014
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. /*
  2. * Exercise 1-23.
  3. * Write a program to remove all comments from a C program. Don't forget to
  4. * handle quoted strings and character constants properly.
  5. * C comments don't nest.
  6. */
  7.  
  8. #include <stdio.h>
  9.  
  10. #define ST_PRC_NOR_COD 1 /* processing C code */
  11. #define ST_ABT_ENT_CMT 2 /* about to enter a comment block */
  12. #define ST_INS_NOR_CMT 3 /* inside a C comment block */
  13. #define ST_ABT_EXT_CMT 4 /* about to exit C comment block */
  14. #define ST_INS_QUT_STR 5 /* inside a quoted string */
  15. #define ST_INS_QUT_ESC 6 /*
  16. * inside a quoted string, and secaping
  17. * the next character
  18. */
  19. #define ST_INS_SQT_STR 7 /* inside single quoted string */
  20. #define ST_INS_SQT_ESC 8 /*
  21. * inside a quoted string, and escaping
  22. * the next character
  23. */
  24.  
  25. int
  26. main() {
  27.  
  28. int state = ST_PRC_NOR_COD;
  29. int c;
  30.  
  31.  
  32. while ((c = getchar()) !=EOF) {
  33. switch (state) {
  34. case ST_PRC_NOR_COD:
  35. switch (c) {
  36. case '/':
  37. state = ST_ABT_ENT_CMT;
  38. break;
  39. case '"':
  40. state = ST_INS_QUT_STR;
  41. putchar(c);
  42. break;
  43. case '\'':
  44. state = ST_INS_SQT_STR;
  45. putchar(c);
  46. break;
  47. default:
  48. putchar(c);
  49. break;
  50. }
  51. break;
  52.  
  53. case ST_ABT_ENT_CMT:
  54. switch (c) {
  55. case '/':
  56. state = ST_ABT_ENT_CMT;
  57. putchar(c);
  58. break;
  59. case '*':
  60. state = ST_INS_NOR_CMT;
  61. break;
  62. default:
  63. state = ST_PRC_NOR_COD;
  64. putchar('/');
  65. putchar(c);
  66. break;
  67. }
  68. break;
  69.  
  70. case ST_INS_NOR_CMT:
  71. switch (c) {
  72. case '*':
  73. state = ST_ABT_EXT_CMT;
  74. break;
  75. }
  76. break;
  77. case ST_ABT_EXT_CMT:
  78. switch (c) {
  79. case '/':
  80. state = ST_PRC_NOR_COD;
  81. break;
  82. case '*':
  83. state = ST_ABT_EXT_CMT;
  84. break;
  85. default:
  86. state = ST_INS_NOR_CMT;
  87. break;
  88. }
  89. break;
  90. case ST_INS_QUT_STR:
  91. switch (c) {
  92. case '\\':
  93. state = ST_INS_QUT_ESC;
  94. putchar(c);
  95. break;
  96. case '"':
  97. state = ST_PRC_NOR_COD;
  98. putchar(c);
  99. break;
  100. default:
  101. putchar(c);
  102. break;
  103. }
  104. break;
  105.  
  106.  
  107. case ST_INS_QUT_ESC:
  108. switch (c) {
  109. case '\\':
  110. putchar (c);
  111. break;
  112. default:
  113. state = ST_INS_QUT_STR;
  114. putchar (c);
  115. break;
  116. }
  117. break;
  118.  
  119. case ST_INS_SQT_STR:
  120. switch(c) {
  121. case '\\':
  122. state = ST_INS_SQT_ESC;
  123. putchar(c);
  124. break;
  125. case '\'':
  126. state = ST_PRC_NOR_COD;
  127. putchar(c);
  128. break;
  129. default:
  130. state = ST_INS_SQT_STR;
  131. putchar(c);
  132. break;
  133. }
  134. break;
  135.  
  136. case ST_INS_SQT_ESC:
  137. switch (c) {
  138. case '\\':
  139. putchar(c);
  140. break;
  141. default:
  142. state = ST_INS_SQT_STR;
  143. putchar(c);
  144. break;
  145. }
  146. break;
  147. }
  148. }
  149.  
  150. return (0);
  151. }
Advertisement
Add Comment
Please, Sign In to add comment