c注釋轉換為c 注釋 初探 有限狀態機思想

2021-08-19 22:44:20 字數 3436 閱讀 6297

將所有c風格的注釋轉換為c++風格,其中具體情況如下所示

轉換前

// 1.一般情況

/* int i = 0; */

// 2.換行問題

/* int i = 0; */

int j = 0;

/* int i = 0; */

int j = 0;

// 3.匹配問題

/*int i = 0;/****xx*/

// 4.多行注釋問題

/*int i=0;

int j = 0;

int k = 0;

*/int k = 0;

// 5.連續注釋問題

/**/

/**/

// 6.連續的**/問題

/***/

// 7.c++注釋問題

// /**************/

/* int i = 0; */

// int i = 0;

設計乙個標記為來標記到達/的狀態設計乙個標記為來標記到達/*的狀態(c風格注釋)

同時將 /* 變成//

然後 * 以後的就是c風格的注釋

/* * */
應該列印此時的*

/* */
不應該列印此時的*

/* *5    */
此刻*5 又變成了c風格的注釋,也就是要列印*5

對於這三種情況,似乎遇到 * 又是一種狀態

那我們又要用乙個標誌位來記錄到達了 *的狀態

其實當第一次遇見 /時,就有

// 可能是c++注釋狀態

/ 5 可是是普通狀態 ( 10 / 5)

/* c注釋狀態

其中 進入c注釋狀態又有很多狀態

那麼 我們就要設定很多的標記位

這些標記位也不利於後續的管理

有限狀態機,(英語:finite-state machine, fsm),又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。

我對有限狀態機的理解是: 可以將乙個事件的所有狀態窮舉出來,

而且每種狀態的轉換也是可以窮舉出來的.

其實有個很直觀的例子是vim的多種模式和切換

一說到模式,用vi/vim的童鞋就會想到 insert normal v等模式

這些其實也是有限狀態的集合,而且每種模式的轉換方式都可以列出來

其中vi/vim基本的狀態有:命令模式,輸入模式,末行模式(當然不全,只是舉例)

vi/vim的相互轉換也在中體現出來了,

這就是乙個有限狀態機的例子

我們發現這些標記位(狀態)是有限的,

那麼我們可以用列舉來將其管理起來

typedef

enum statestate;

他們的相互轉換如圖所示:

有了狀態轉換圖我們就可以很容易的寫出

轉換**了,

我們首先應該把各種狀態的轉換**寫出來

然後在考慮 轉換之後出現的事件( c注釋變成c++注釋)

狀態轉換可以使用swtich開關語句

具體轉換如**所示

int main()

switch(s)

else

break;

}case found_slash:

else

if( ch == '*' )

break;

}case cpp_comment:

else

break;

}case c_comment:

//多行注釋

else

if(ch == '\n')

else

break;

}case found_start:

else

if(ch == '*')

else

break;}}

}}

當我們完成了狀態的轉換,就要考慮在轉換時處理注釋問題

這裡有一下注意幾點

1. 當 普通狀態進入/ 時 這個/肯定要列印 (c和c++注釋都以/ 開頭)

當 進入cpp模式,要再列印乙個/ 變成//形式 (c++注釋保持不變)

cpp模式結束標誌是 遇到換行 \n 此時列印換行並且進入normal模式

如果在 /模式遇到* 此時*不列印 並且列印 / ,(注釋轉換),並且進入c_coment模式

在c_coment模式如果遇到* 則進入*模式

進入*模式後如果再次碰到 / 表示結束注釋此時什麼都不列印,並且要考慮換行問題,在其後面加上 \n

/* int i = 0; */

int j = 0;

// int i = 0;

// int j = 0;

如果進入模式後如果再次碰到, 就要把上乙個*列印出來

/* * */
如果進入模式碰到了other(其他字元) 那麼此字元和就是注釋一部分,要將其列印出來

在c_comment模式裡面如果遇到換行,要在換行之後加上 //

/*

int i=0;

int j = 0;

int k = 0;

*/int k = 0;

// int i = 0;

// int j = 0;

// int k = 0;

int k = 0;

#include

#include

typedef

enum statestate;

int main()

switch(s)

else

break;

}case found_slash:

else

if( ch == '*' )

break;

}case cpp_comment:

else

break;

}case c_comment:

//多行注釋

else

if(ch == '\n')

else

break;

}case found_start:

/* * */

// *

else

if(ch == '*')

else

break;}}

}}

注釋轉換(C注釋轉換為c 注釋)

對於注釋轉換首先給出我的測試圖 由圖可以看出將左邊的c語言注釋轉換為右邊c 注釋就是注釋轉換 首先說明一下轉換思想方法 1.建立兩個檔案input.c和output.c,input.c裡面用來讀取c語言的注釋,output.c裡面儲存轉換成為c 的注釋,中間的轉換過程就是 完成,當然檔案名字和作用自...

C注釋轉換為C 注釋

我們將c注釋轉換為c 的注釋思路如下圖 此次我們通過將需要轉換的c注釋內容存於input.c檔案中,轉換後的內容存於output.c檔案中。input.c檔案 1.一般情況 int num 0 int i 0 2.換行問題 int i 0 int j 0 int i 0 int j 0 3.匹配問題...

注釋轉換 C注釋轉換為標準C 注釋

注釋轉換 c 注釋轉換為標準c語言注釋 直接上 include include include typedef enum state state typedef enum tag tag pragma warning disable 4996 state annotationconvert file...