Lua 腳本註釋 自動化去除

 最近領導讓我把lua腳本中全部註釋去掉, 我去掉以後發現項目的lua腳本大小從22.7M到了19.1M,少了3.6M(15%),項目已經跑了2周,沒有收到測試或者程序的錯誤反饋。(歡迎大家指出錯誤。)

思路: 先畫狀態機圖,轉爲代碼。

後續優化:

        加入對Lua幾個用法較少的註釋方法的支持;

        轉換前後行數不變,利於bugly排查問題;

        支持\r. \r\n2個換行方法;

        忽略lua腳本本身的編碼方式,直接string轉字符;

狀態機圖:

狀態機圖

上代碼:

        //去除註釋時, 會移除單行註釋 --
        //多行註釋支持 --[[ --]]&    --[[]]&  --[=[  --]=]&  --[=[ ]=]   四種
        //對於引號中的 -- 也做了處理
        //支持轉義字符 \
        //行中間 進行塊註釋
        //去註釋前後 有效代碼的行數不變

  public static int handleLuaNotes(string srcFileName, string desFileName)
        {

            if (!File.Exists(srcFileName))
            {
                return -1;
            }
            FileInfo desFile = new FileInfo(desFileName);
            if (File.Exists(desFileName))
            {
                File.Delete(desFileName);
            }
           
            string inputstr = File.ReadAllText(srcFileName);
           
            inputstr = inputstr.Replace( "[=[", "[[");
            inputstr = inputstr.Replace( "]=]", "]]");

            StringBuilder outputstr = new StringBuilder(); //存放一定不是字符串的
            StringBuilder temp = new StringBuilder();  //存放那些可能不是註釋的字符串
            State state = State.status0;
            int calNum = 0;
            string curHandle = "";  //調試用變量
            for (int i = 0; i < inputstr.Length; i++)
            {
                char c = inputstr[i];
                //curHandle = inputstr.Substring(0, i + 1);
                switch (state)
                {
                    case State.status0:
                        if (c == '"')
                        {
                            state = State.status10;
                            outputstr.Append(c);
                        }
                        else if (c == '-')
                        {
                            state = State.status1;
                            temp.Append(c);
                        }
                        else
                        {
                            state = State.status0;
                            outputstr.Append(c);
                        }
                        break;
                    case State.status1:
                        if (c == '-')
                        {
                            state = State.status2;
                        }
                        else
                        {
                            state = State.status0;
                            temp.Append(c);
                            outputstr.Append(temp);
                        }
                        temp.Clear();
                        break;
                    case State.status2:
                        if (c == '[')
                        {
                            state = State.status4;
                        }
                        else
                        {
                            state = State.status3;
                        }
                        break;
                    case State.status3:
                        if (c == '\r')
                        {
                            state = State.status0;
                            i++;
                            outputstr.Append(c);
                            outputstr.Append(inputstr[i]);
                        }
                        else if (c == '\n')
                        {
                            state = State.status0;
                            outputstr.Append(c);
                        }
                        else
                        {
                            state = State.status3;
                        }
                        break;
                    case State.status4:
                        if (c == '[')
                        {
                            calNum = 0;
                            state = State.status5;
                        }
                        else
                        {
                            state = State.status3;
                        }
                        break;
                    case State.status5:
                        if (c == '-')
                        {
                            state = State.status6;
                        }
                        else if (c == '\r')
                        {
                            i++;
                            outputstr.Append(c);
                            outputstr.Append(inputstr[i]);
                            state = State.status5;
                        }
                        else if (c == '\n')
                        {
                            state = State.status5;
                            outputstr.Append(c);
                        }
                        else if (c == '[')
                        {
                            calNum++;
                        }
                        else if (c == ']')
                        {
                            if (calNum == 0)
                                state = State.status8;

                            if (calNum > 0 )
                            {
                                calNum--;
                            }
                        }
                        else
                        {
                            state = State.status5;
                        }
                        break;
                    case State.status6:
                        if (c == '-')
                        {
                            state = State.status7;
                        }
                        else if (c == '[')
                        {
                            calNum++;
                            state = State.status5;
                        }
                        else if (c == ']')
                        {
                            if (calNum == 0)
                                state = State.status8;

                            if (calNum > 0)
                            {
                                calNum--;
                                state = State.status5;
                            }
                        }
                        else
                        {
                            state = State.status5;
                        }
                        break;
                    case State.status7:
                        if (c == '-')
                        {
                            state = State.status7;
                        }
                        else if (c == ']')
                        {
                            state = State.status8;
                        }
                        else
                        {
                            state = State.status5;
                        }
                        break;
                    case State.status8:
                        if (c == ']')
                        {
                            if (i+1 < inputstr.Length &&  inputstr[i+1] != ' ' && inputstr[i+1] != '\r' && inputstr[i + 1] != '\n')
                            {
                                outputstr.Append(' ');
                            }
                            state = State.status0;
                        }
                        else
                        {
                            state = State.status5;
                        }
                        break;
                    case State.status9:
                        //這是個邏輯節點 其實不會用到 該9的時候 會直接跳到0
                        break;
                    case State.status10:
                        outputstr.Append(c);
                        if (c == '"')
                        {
                            state = State.status0;
                        }
                        else if (c == '\\')
                        {
                            state = State.status11;
                        }
                        else
                        {
                            state = State.status10;
                        }
                        break;
                    case State.status11:
                        outputstr.Append(c);
                        state = State.status10;
                        break;
                    default:
                        break;
                }
            }
            File.WriteAllText(desFileName, outputstr.ToString());
            return 0;
        }
         enum State
        {
            status0 = 0,
            status1 = 1,
            status2 = 2,
            status3 = 3,
            status4 = 4,
            status5 = 5,
            status6,
            status7,
            status8,
            status9,
            status10,
            status11,
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章