用状态机将c语言的注释转换为c++的注释
先来了解一些状态机的概念。
状态机:
就是一组 状态,
各个状态之间,
依据一定的条件,(如输入一个 1 或者是 0)
存在一定的转换,(从状态X转换到状态Y)
它有 一个 起始状态和 若干 终结状态,
从起始状态开始,
根据输入的串转换状态,
直到所有的输入的被状态机处理,
看看追最后停留的状态是否为终结状态,
是的话就说这个 串 符合这个状态机规则,
或者说被这个状态机接受!
流程可能是瞬间的动作经历很多步骤,比如“登录”流程,点击“登录”按钮之后,会有验证帐号、密码、验证码的诸多流程,但是都是在点击登录按钮的瞬间,逐一完成。
而状态机表示的都是一个已经完成的状态,每一个环节都是可以独立存在的。
#pragma warning(disable :4996)//防止重编译
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c"
typedef enum STATUS
{
NORMAL_STATUS,
C_STATUS,
CPP_STATUS,
END_STATUS,
}status_t;
extern status_t gStatus;
void convertBegin();
#include"convert.h"
//处理正常情况的注释
static void doNormal(FILE *in,FILE *out)
{
assert(in);
assert(out);
int first = fgetc(in);
int second = 0;
switch(first)
{
case '/':
{
second = fgetc(in);
if (second == '*')
{
fputc('/',out);
fputc('/',out);
gStatus = C_STATUS;
}
else if (second == '/')
{
fputc(first,out);
fputc(second,out);
gStatus = CPP_STATUS;
}
else
{
fputc(first,out);
fputc(second,out);
}
}
break;
case EOF:
gStatus = END_STATUS;
break;
default :
break;
}
}
//处理c语言的注释/*...*/,可以注释多行
static void doC_Status(FILE *in,FILE *out)
{
assert(in);
assert(out);
int first = fgetc(in);
int second = 0;
switch(first)
{
case '*':
{
second = fgetc(in);
if (second == '/')
{
int third = fgetc(in);
if (third == '\n')
{
fputc(third,out);
}
else
{
fputc('\n',out);
ungetc(third,in);
gStatus = NORMAL_STATUS;
}
}
else
{
fputc(first,out);
ungetc(second,in);
}
}
break;
case '\n':
fputc(first,out);
fputc('/',out);
fputc('/',out);
break;
case EOF:
gStatus = END_STATUS;
break;
default :
fputc(first,out);
break;
}
}
//处理c++的注释(//),只能注释一行
static void doCPP_Status(FILE *in,FILE *out)
{
assert(in);
assert(out);
int first = fgetc(in);
int second = 0;
switch(first)
{
case '\n':
fputc(first,out);
gStatus = NORMAL_STATUS;
break;
case EOF:
gStatus = END_STATUS;
break;
default :
fputc(first,out);
break;
}
}
//转换状态机
static void convertStatusMachine(FILE *in,FILE *out)
{
assert(in);
assert(out);
while (gStatus != END_STATUS)
{
switch(gStatus)
{
case NORMAL_STATUS:
doNormal(in,out);
break;
case C_STATUS:
doC_Status(in,out);
break;
case CPP_STATUS:
doCPP_Status(in,out);
break;
default :
break;
}
}
}
//开始转换
void convertBegin()
{
FILE *in = fopen(INPUTFILE,"r");
if (NULL == in)
{
perror("fopen");
exit(1);
}
FILE *out = fopen(OUTPUTFILE,"w");
if (NULL == out)
{
perror("fopen");
exit(2);
}
convertStatusMachine(in,out);
fclose(in);
fclose(out);
}
#include"convert.h"
status_t gStatus;
int main()
{
convertBegin();
system("pause");
return 0;
}