把C统一成C++风格。
有限状态机:
有限状态机FSM是软件上常⽤的⼀种处理⽅法,它把复杂的控制逻 辑分解成有限个稳定状态,在每个状态上进⾏处理。 有限状态机是闭环系统,可以成有限的状态,处理无穷的事务。
通常对于有限状态机,我们所做的就是使用switch语句进行操作。
switch (state)
{
case1:
// …
break;
case2:
// …
break;
case3:
// …
break;
.
.
.
case n :
break;
default :
}
在通过这个语句我们来进行转换状态,从而达到各种状态的变动,使得C风格的注释可以转换为C++风格的注释。
首先我们要知道两种分格的注释的不同,C语言风格的注释是//*的格式。
而对于C++的风格就是我们平时所知道的//**的格式。
首先我们在这里对一些状态进行了标注,我们这里已知的有4种状态,
第一种是END_STATE
第二种是C_STATE
第三种是CPP_STATE
第四种是我们平时的NULL_state。
首先我们要打开input.c文件,对这个文件内部的文件进行读取,然后处理,否则直接提示用户有错误。
接下来,我们还要打开output.c文件,对处理以后的代码进行写入。
在这里会有许多种情况让我们来分析:
// 1.一般情况
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3.匹配问题
/int i = 0;/*xxxxx/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
////
// 6.连续的**/问题
/*/
// 7.C++注释问题
// /xxxxxxxxxxxx/
我们接下来要逐个分析这些问题。
首先是对第一种情况的分析,我们首先对于这四种情况,我们使用枚举,到时候调用即可。接下来,进入写转化函数,
首先,我们先写出两个文件操作的指针,由他们对文件进行读取以及写入。
首先我们创建3个文件,一个头文件,另外两个.c文件,我们需要在一个.c文件中写入主函数的操作。
从这个里面我们可以能够看得出,接下来就是进行编写CommentConvert函数,我们在这里要对创建的头文件进行编辑,首先不能忘了的是头文件引用stdio.h和stdlib.h,然后由于后续对四种类型的操作,所以申明一个联合体,在这里,我们对所要操作的两个文件进行宏定义,以便后续方便操作,
然后,我们就可以对我们的CommentConvert函数进行编辑,
我们先进行分析,首先我们要对文件input.c进行打开,在这里要有一个判断,如果文件为空,那么我们就输出报错就好了,然后是对于写入时的分析,原理也同上。接下来,我们要进行转化操作,最后操作完成以后,我们还要关闭相关的对于文件的流操作。
接下来,是对于CoverWork,这个函数的操作。
当然,记得对我们前面的枚举进行使用,我们先定义一个全局变量state,然后这个state一开始是默认为null_state状态的,接下来我们通过一个循环还考虑,当state是哪一种状态,我们就让它去进行所对应的功能函数,所以我们在这里定义了3个函数,他们分别是在无状态和c状态还有c++状态下的处理函数。
CoverWork函数的实现:
然后你要清楚,现在我们所要处理的默认状态是从NULL_STATE,所以接下来我们实现NULL_STATE函数,然后我们借助上面我所绘制的各种状态之间的转换关系,我们可以知道,在这里我们最需要判断的是所检察的第一个字符是什么,在这里有三种情况:‘/’,普通字符,EOF,所以我们先要接收第一个字符,然后利用我们的有限状态机,当为’/’时,我们进行下一个字符的判断,判断是否为‘*’,如果是,那么我们接下来让state为C_STATE,如果是‘/’那么进入CPP_state,接下来,其他字符,按照限定自行做出编辑即可。
接下来,附上CommentConvert代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include"Coverment.h"
S_Type state;
void DoNullState(FILE *read, FILE* write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '/':
second = fgetc(read);
if (second == '*')
{
fputc(first, write);
fputc('/', write);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, write);
fputc(second, write);
state = CPP_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case EOF:
fputc(first, write);
state = END_STATE;
break;
default:
fputc(first, write);
break;
}
}
void DoCState(FILE *read, FILE* write)
{
int first = fgetc(read);
int second = 0;
int third;
switch (first)
{
case '*':
second = fgetc(read);
if (second == '/')
{
third = fgetc(read);
if (third == ' ')
{
fputc(third, write);
}
else if (third == '\n')
{
fputc(third, write);
state = NULL_STATE;
}
else if (third == '/')
{
fputc(first, write);
fputc(second, write);
fputc(third, write);
state = C_STATE;
}
else
{
fputc('\n', write);
fputc(third, write);
state = NULL_STATE;
}
}
else if (second == '*')
{
third = fgetc(read);
fputc(second, write);
if (third == '/')
state = NULL_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case '/':
fputc(first, write);
second = fgetc(read);
if (second = '*')
{
fputc(second, write);
state = C_STATE;
}
else
{
fputc(second, write);
state = C_STATE;
}
break;
case '\n':
{
fputc('\n', write);
fputc('/', write);
fputc('/', write);
state = C_STATE;
}
break;
case EOF:
fputc(first, write);
state = END_STATE;
break;
default:
fputc(first, write);
state = C_STATE;
break;
}
}
void DoCppState(FILE *read, FILE* write)
{
int first = fgetc(read);
int second;
switch (first)
{
case'/':
second = fgetc(read);
if (second == '*')
{
state = CPP_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
state = CPP_STATE;
}
break;
case '*':
second = fgetc(read);
if (second == '/')
{
}
else
{
fputc(first, write);
fputc(second, write);
state = CPP_STATE;
}
break;
case EOF:
fputc(first, write);
state = END_STATE;
break;
default:
fputc(first, write);
state = CPP_STATE;
break;
case'\n':
fputc(first, write);
state = NULL_STATE;
}
}
void ConvertWork(FILE *read, FILE* write)
{
state = NULL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NULL_STATE:
DoNullState(read, write);
break;
case C_STATE:
DoCState(read, write);
break;
case CPP_STATE:
DoCppState(read, write);
break;
}
}
}
void CommentConvert()
{
FILE* pWrite = NULL;
FILE* pRead = fopen(INPUTFILENAME, "r");
if (pRead == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pWrite = fopen(OUTPUTFILENAME, "w");
if (pWrite == NULL)
{
fclose(pRead);
perror("open file for write");
exit(EXIT_FAILURE);
}
ConvertWork(pRead, pWrite);
fclose(pRead);
fclose(pWrite);
}
代码肯定有一些缺陷,希望大家能够多多指导!!