踱步狼注釋移除狀態機演算法2019 10

2021-09-27 22:26:19 字數 2752 閱讀 5045

踱步狼注釋移除,狀態機演算法:

入口條件:只要當前字元是,即必須進來處理。

緊跟在轉義字元後面的char, 一般我們是無條件寫回客戶端的,

但如果此時是在處理,諸如塊注釋,單行注釋,多行注釋時,我們不寫。

這邊為了後面處理回車換行方便,對於\後面如果是xd和xa,我們也順便處理,即寫回xd,xa到客戶端,

只要\後面還有乙個字元,我們都無條件寫回客戶端。

這是轉義符號的處理,最高優先順序!

那我們直接丟棄

或者在處理雙引號,但是當前字元又不是「,

或者在處理js正則,但是當前字元又不是/,

那我們全部寫回客戶端。

入口條件:當處在 js正規表示式, 單引號, #if 0注釋, 行注釋, 塊注釋, 狀態下,不得進入處理。

且當前狀態包含double_quotes_doing,或當前字元正好就是"則必須進來處理。

進入此入口的字元,一律寫回客戶端。

然後我們重新修改狀態機標誌:

如果之前沒有置double_quotes_doing狀態,則置該狀態。

如果已置,並且當前字元就是",那麼此時就是串的結束,我們清除double_quotes_doing狀態標誌。

處理同上。

, ", 』 這三者都是比狀態值優先順序還要高的字元,所以優先處理。

入口條件:state == if0_doing

當其後遇到#if時,我們要找到其對應的#endif,並累計出現的#if個數,設為katex parse error: expected 'eof', got '#' at position 10: sum 當其後遇到#̲else時,我不知道這個是和上…sum值,如果此時$sum==1,那麼是和#if是一夥的,

我們置標誌為if0_else_doing,否則還是在#if 0中,即#if 0中存在其它#ifxx

當其後遇到#endif時,我們執行sum

−−,如

果減一后

,發

現sum--,如果減一後,發現

sum−−,

如果減一

後,發現

sum==0,那麼此處的#endif是頂層#if 0的匹配。那麼我們置狀態為normal_state,即狀態機復位。

否則還是在#else中,即#else中存在其它#ifxx

if0_doing狀態下遇到的所有字元,乙個不少,全部丟棄。

入口條件:state == if0_else_doing,

當其後遇到#if時,katex parse error: expected 'eof', got '#' at position 21: … 此時我們不想再處理該狀態下的#̲else了,比如: #if 0…sum–,如果減一後,發現$sum==0,那麼此處的#endif是頂層#if 0的匹配。那麼我們置狀態為normal_state,即狀態機復位。

if0_else_doing狀態下遇到的所有字元,乙個不少,全部寫回客戶端。

入口條件:state == line_comment_start

這裡是個while迴圈。

在迴圈裡,我們找0xa或0xd,如果一直沒找到,文件處理結束。因為全是單行注釋啊。

如果找到,我們要判斷換行符前面是不是,是的話,說明還在單行注釋裡面,繼續while迴圈。

不是\的話,那麼此處的0xa或0xd就是行注釋結束。行注釋**全部忽略,置狀態為normal_state,即狀態機復位。

入口條件:state == block_comment_start

c++中的塊注釋不允許巢狀,所以很好處理。

我們找*/,找不到的話,說明全文中沒有匹配的,那麼我們將/*之後所有**全部寫回客戶端。(不匹配的塊注釋,我們不視為注釋。)

找到了,則塊注釋**全部忽略,置狀態為normal_state,即狀態機復位。

下面都是對一些優先順序較低的字元的處理。

入口條件:當前字元為/

如果這是檔案末尾最後乙個字元,則直接寫回客戶端。

如果下個字元也是/,則置標誌 line_comment_start

如果下個字元是*,則置標誌 block_comment_start

如果以上都不是,那麼我們看看它是不是js正則。

如果已經置了正則標誌,那麼此處的/則是正則的結束,那我們就清掉js_regular_start標誌。

否則我們要判斷,此處是否為乙個js正則的開始。

console.log("the value of lastindex is " + /d(b+)d/g.lastindex);

s = s.replace( /』/g, 「』』」);

k = /』/;

這些都是正則的合法表示,所以我的判斷是

當前行中,/前如果是 ;, ", ', =, (, +, -, *, (忽略空串),或者什麼都沒有, 則此處的/為正則開始.(注意轉義字元,/要跳過去,轉義加換行也要處理下)

如 /43545\32+4』"5435#/,這個也是合法js正則,如有問題,敬請指正。

3 /『/;

1 / 3

入口條件:當前字元為#, but 當處在 行注釋, 狀態下,不得進入處理。

當其後遇到if空格或if\t時,我們搜尋這之後的第乙個非空字元。如果該字元正好是0,那麼我們就是找到了#if 0,置state=if0_doing, $sum=1

顯然 #if0…

這種情況我們就沒檢查出來,不做任何處理,全部寫回客戶端。這樣的#if 0**,也基本上不會出現,出現了我們暫不做清理

踱步狼所有客戶端均無需公升級,即可使用最新注釋清理演算法。

感謝網友 洋芋炒土豆片片 提供的js正則bug, 讓我們可以不斷完善,做到更好。

111 狀態機刪除注釋

狀態模式 完整 1 define crt secure no warnings 2 include 3 include 4 5char path hello.c 6char pathnew hellonew.c 7 狀態模式 狀態模式允許乙個物件在其內部狀態改變的時候改變行為。8 這個物件看上去象是...

狀態機 狀態機2,關於戰鬥中兵種狀態的新增狀態

但是了,但是策劃是種天生具備加需求的生物,而做為將需求變成 邏輯的程式猿來 說,只能say ok,i look 好吧,我看看 好吧,那來看看有什麼新的需求 戰鬥模組在有各種複雜的技能,技能中包含著一種控制行為的buff,稱為控制行為buff,比較常見的控制項行為buff有冰凍,眩暈,擊飛等等,以下是...

OSPF的演算法及狀態機

open shortest path first spf演算法 圍繞該演算法計算路由資訊的協議open 指ietf發明的一種針對ip的路由協議 ospf的工作過程 建鄰居 傳資料 做計算 router id唯一標識乙個路由器,產生 ospf的建立鄰居方式 hello報文的作用 鏈路狀態資訊 不是資料...