注释转换:C风格注释转换为C++风格注释

把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。

注释转换:C风格注释转换为C++风格注释_第1张图片

首先我们要打开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文件中写入主函数的操作。

注释转换:C风格注释转换为C++风格注释_第2张图片

从这个里面我们可以能够看得出,接下来就是进行编写CommentConvert函数,我们在这里要对创建的头文件进行编辑,首先不能忘了的是头文件引用stdio.h和stdlib.h,然后由于后续对四种类型的操作,所以申明一个联合体,在这里,我们对所要操作的两个文件进行宏定义,以便后续方便操作,

然后,我们就可以对我们的CommentConvert函数进行编辑,
我们先进行分析,首先我们要对文件input.c进行打开,在这里要有一个判断,如果文件为空,那么我们就输出报错就好了,然后是对于写入时的分析,原理也同上。接下来,我们要进行转化操作,最后操作完成以后,我们还要关闭相关的对于文件的流操作。
注释转换:C风格注释转换为C++风格注释_第3张图片

接下来,是对于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);


}



代码肯定有一些缺陷,希望大家能够多多指导!!

你可能感兴趣的:(C语言)