アノテーション変換-C言語アノテーションスタイルをC++アノテーションスタイルに変換

10974 ワード

             

1.C言語スタイルの注釈/**/C++スタイルに変換//2.//スタイルのコメントはそのまま3.すべての変換は文法規則4に合致する必要がある.アノテーション変換にはアノテーションネストをサポートする必要があります
             (    )           ,        

input.c
// 1.    
int num = 0;
/* 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.      
/*a*//*b*/

// 6.   **/  
/***/

// 7.C++    
// /*xxxxxxxxxxxx*/

実装コードを見てみましょう
ヘッダファイルCommentConvert.h
#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#include 
#include 

enum STATE
{
    NUL_STATE,//   
    C_STATE,  //c  
    CPP_STATE,//c++  
    END_STATE //    
};
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoComment(FILE *pfIn, FILE *pfOut);
#endif //__COMMENT_CONVERT_H__

関数実装CommentConvert.c
#include "commentconvert.h"
//   
void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
    int first = 0;
    int second = 0;
    first = fgetc(pfIn);
    switch (first)
    {
    case'/':
        {
            second = fgetc(pfIn);
            switch (second)
            {
            case'*':      //  C  
                fputc(first, pfOut);
                fputc('/', pfOut);
                *s = C_STATE;
                break;
            case'/':      //  C++  
                fputc(first, pfOut);
                fputc(second, pfOut);    
                *s = CPP_STATE;
                break;
            default:
                fputc(first, pfOut);
                fputc(second, pfOut);
                break;
             }
            break;
    }
    case EOF:
        *s = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
//C  
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s)    
{
    int first = 0;
    int second = 0;
    int third = 0;
    first = fgetc(pfIn);
    switch (first)
    {
    case'
'
: // fputc(first, pfOut); fputc('/', pfOut); fputc('/', pfOut); break; case'*': //C { second = fgetc(pfIn); switch (second) { case'/': //C { *s = NUL_STATE; third = fgetc(pfIn); switch (third) { case'
'
: fputc(third, pfOut); break; case'/': ungetc(third, pfIn); fputc('
'
, pfOut); break; default: fputc('
'
, pfOut); fputc(third, pfOut); } } break; case'*': //C fputc(second, pfOut); ungetc(second,pfIn); break; default: fputc(first, pfOut); fputc(second, pfOut); break; } break; } case EOF: *s = END_STATE; break; default: fputc(first, pfOut); break; } } //C++ void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s) { int first = 0; first = fgetc(pfIn); switch (first) { case'
'
: // fputc(first, pfOut); *s = NUL_STATE; break; case EOF: *s = END_STATE; break; default: fputc(first, pfOut); break; } } void DoComment(FILE*pfIn, FILE*pfOut, enum STATE* s) { enum STATE state = NUL_STATE; while (state != END_STATE) { switch (state) { case NUL_STATE: DoNulState(pfIn, pfOut, &state); break; case C_STATE: DoCState(pfIn, pfOut, &state); break; case CPP_STATE: DoCppState(pfIn, pfOut, &state); break; default: break; } } }

テストc
#include "commentconvert.h"
void test()
{
    FILE *pfIn = NULL;
    FILE *pfOut = NULL;
    pfIn = fopen("input.c.txt", "r");
    if (pfIn == NULL)
    {
        perror("open file");
        exit(EXIT_FAILURE);
    }
    pfOut = fopen("output.c.txt", "w");
    if (pfOut == NULL)
    {
        perror("open file");
        fclose(pfIn);
        exit(EXIT_FAILURE);
    }
    DoComment(pfIn, pfOut);
    fclose(pfIn);
    fclose(pfOut);
}

int main()
{
    test();
    system("pause");
    return 0;
}

この実現は簡単なので、多くの解釈をしないで、読者は自分で勉強することができます.