Annotation conversion (C to C++)

7 conversion situations

1. General situation

/*int i = 0;*/

2. Line break problem

/*int i = 0;*/int j = 0;
/*int i = 0*/

3. Matching problems

/*int i = 0;/* int j = 0;*/

4. Multi-line comment problem

/*
int i = 0
int j = 0
*/int k = 0;

5. Continuous Annotation Problem

/*int i = 0;*//*int j = 0;*/

6. Consecutive**/questions

/*int i = 0;**/

7. C++ comments

// /* int i = 0;*/

analyze

We can see that there are many situations that need to be considered for annotation conversion, which is very unfavorable for us to write programs. In order to solve this problem, we introduce the concept of
finite state machine. A finite state machine is referred to as a state machine, which represents a finite number of states and A model of the behavior of transitions between these states. Finite states are closed-loop systems that can handle infinite states with finite states

This leads to the following picture
write picture description here

Code

Convert.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef enum CONVERT_STATE
{
    NORMAL_STATUS,
    C_STATUS,
    CPP_STATUS,
    END_STATUS,
}StateType;

void convertBegin();
void convertStatusMachine(FILE *in, FILE *out);
void doCPPStatus(FILE *in, FILE *out);
void doCStatus(FILE *in, FILE *out);
void doNormal(FILE *in, FILE *out);

Convert.c

#include"Convert.h"


//1,我们要声明一个枚举(enum)类型来存放四种状态
//定义全局变量state,初始状态为NULL_STATE.
StateType gStatus = NORMAL_STATUS;


//2,声明一个打开input.c和output.c的函数
void convertBegin()
{
    FILE *in = fopen("input.c", "r");
    if (NULL == in)
    {
        perror("fopen");
        exit(1);
    }
    FILE *out = fopen("output.c", "w");

    if (NULL == out)
    {
        perror("fopen");
        exit(2);
    }
    convertStatusMachine(in, out);
    fclose(in);
    fclose(out);
}
//3,声明一个切换状态的函数
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:
            doCStatus(in, out);
            break;
        case CPP_STATUS:
            doCPPStatus(in, out);
            break;
        case END_STATUS:
            break;
        default:
            break;
        }
    }
}


// 4,我们还要声明处理不同状态的函数 处理NULL_STATE的函数:
void doNormal(FILE *in, FILE *out)
{
    int first = fgetc(in);
    int second = 0;
    assert(in);
    assert(out);
    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:
            fputc(first, out);
            break;
    }
}
//处理C_STATE的的函数 /*...*/可以注释多行
void doCStatus(FILE *in, FILE *out)
{
    int first = fgetc(in);
    int second = 0;
    assert(in);
    assert(out);
    switch (first)
    {
    case '*'://表示C语言注释状态 可能会结束
    {
        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;
    }
}
//处理CPP_STATE的函数,只能注释一行
void doCPPStatus(FILE *in, FILE *out)
{
    int first = fgetc(in);
    assert(in);
    assert(out);
    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;
    }
}

int main()
{
    convertBegin();
    printf("转换完成。\n");
    system("pause");
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325950196&siteId=291194637