编译器练习:将C程序中的注释中的小写字母转换为大写字母

来源:互联网 发布:linux下的git管理工具 编辑:程序博客网 时间:2024/04/30 00:31

/*filename:notes.c
programed by:alex shoal
edit date:2009-2-9
revision:1
****************
reference:
"compiler construction principles and practice" 
 page 42~43 DFA design
****************
*/
#include <stdio.h>
#include <stdlib.h> // ANSI C exit() prototype
int is_lowercase(int);
int is_uppercase(int);
 
int main(int argc, char *argv[])

{

  int ch; // place to store each character as read
  int state=0;
  FILE *fp; // "file pointer"
  if (argc != 2){
  printf("Usage: %s filename/n", argv[0]);
  exit(1);
  }
  if ((fp = fopen(argv[1], "r")) == NULL){
  printf("Can't open %s/n", argv[1]);
  exit(1);
  }

  while (((ch = getc(fp)) != EOF)){ 
  switch(state){
  case 0:{ if(ch=='/') state=1; break; }
  case 1:{ switch(ch){
  case '*': state=2;break;
  case '/': state=4;break;
  default : state=0;break;
  } 
  break;
  }
  case 2:{ if(ch=='*') state=3;break; }
  case 3:{ if(ch=='/') state=0;else state=2;}
  case 4:{ if(ch==10 ) state=0;} //if ch == '/n', exit
  }  
  if(is_lowercase(ch)==1&&(state==2||state==4))
  putc(ch-32,stdout);
  else putc(ch,stdout);  
  }
  fclose(fp);
  return 0; 
}

int is_lowercase(int ch){
  if (ch>=97&&ch<=122)
  return 1;
  else return 0;
}

int is_uppercase(int ch){
  if (ch>=65&&ch<=90)
  return 1;
  else return 0;
}