注释转换

本文介绍了如何使用状态机将C语言的注释转换为C++注释,详细阐述了转换过程中可能遇到的问题,如换行、匹配、多行注释等,并给出了主要的代码设计思路,包括处理NULL_STATE、C_STATE和CPP_STATE三种状态的函数实现。
摘要由CSDN通过智能技术生成

注释转换即用状态机将c语言的注释转换为c++的注释。

C转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/

状态机的概念:
有限状态机简称状态机,是表示有限个状态以及在这些状态之间转移的行为的模型。有限状态机是闭环系统,可以用有限的状态处理无穷的状态。
状态机就是一组状态,各个状态之间,依据一定的条件,(如输入一个 1 或者是 0)存在一定的转换,(从状态X转换到状态Y)它有
一个起始状态和若干终结状态,从起始状态开始,根据输入的串转换状态,直到所有的输入的被状态机处理,看看最后停留的状态是否为终结状态,是的话就说这个串符合这个状态机规则,或者说被这个状态机接受!

通常我们使用switch case语句来处理有限状态机

switch (state )
{
case 1:
// ...
break ;
case 2:
// ...
break ;
case 3:
// ...
break ;
.
.
case n :
break ;
default :
}

这里写图片描述
主要代码设计:
1.声明一个枚举(enum)类型来存放四种状态

typedef   enum CONVERT_STATE
{
     NULL_STATE,
     C_STATE,
     CPP_STATE,
     END_STATE,
}StateType;

定义全局变量state,初始状态为NULL_STATE.

2.声明一个打开input.c和output.c的函数

void CommentConvert()
{
                 FILE *pWrite=NULL ;         
                 FILE *pRead = fopen("input.c" , "r");
                 if (pRead == NULL )
                {
                                perror( "open file for read");
                                exit( EXIT_FAILURE);
                }
                pWrite = fopen( "output.c", "w" );
                 if (pWrite == NULL )
                {
                                fclose(pRead);
                                perror( "open file for write");
                                exit( EXIT_FAILURE);
                }
                ConvertWork(pRead, pWrite);
                fclose(pRead);
                fclose(pWrite);
}

3.声明一个切换状态的函数

void ConvertWork(FILE *pRead, FILE *pWrite )
{
                 state = NULL_STATE;

                 while (state != END_STATE)
                {
                                 switch (state)
                                {
                                 case NULL_STATE:
                                                DoNullState( pRead, pWrite );
                                                 break;
                                 case C_STATE:
                                                DoCState( pRead, pWrite );
                                                 break;
                                 case CPP_STATE:
                                                DoCppState( pRead, pWrite );
                                                 break;
                                }
                }
}

4.声明处理不同状态的函数

处理NULL_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( ‘/’, 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;
}
}

处理C_STATE的的函数:
void DoCState(FILE *read, FILE *write)
{
int first = fgetc(read );
int second = 0;
switch (first)
{
case ‘/’ :
second = fgetc( read);
if (second == ‘*’ )
{
}
else if (second == ‘/’)
{
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case ‘\n’ :
fputc( ‘\n’, write );
fputc( ‘/’,write );
fputc( ‘/’, write );
break;
case ‘*’ :
second = fgetc( read);
if (second == ‘*’ )
{
fputc(first, write);
first=fgetc( read);
if (first == ‘/’ )
{
fputc( ‘\n’, write );
state = NULL_STATE;
}
}
else if (second == ‘/’)
{
fputc( ‘\n’, write );
state = NULL_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case EOF :
fputc(first, write);
state = END_STATE;
break;
default:
fputc(first, write);
break;
}
}
处理CPP_STATE的函数:
void DoCppState(FILE *read, FILE *write)
{
int first = fgetc(read );
int second = 0;
switch (first)
{
case ‘/’ :
second = fgetc(read);
if (second == ‘*’ )
{
}
else if (second == ‘/’)
{
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case ‘\n’ :
fputc(first, write);
state = NULL_STATE;
break;
case ‘*’ :
second = fgetc(read);
if (second == ‘/’ )
{
}
else
if (second == ‘*’ )
{
fputc(first, write);
}
break;
case EOF :
fputc(first, write);
state = END_STATE;
break;
default:
fputc(first, write);
break;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值