最近領導讓我把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,
}