2014-10-09 12 views
0

我想創建一個自動化工具來在函數體上面插入註釋行。想法是,我會將.CPP文件作爲文本讀取並查找函數體。一旦在.CPP文件中找到函數體,那麼我會把函數頭放在函數體上面。程序中的函數體標識

讀取和寫入文件的工作方式與普通文本文件類似,但我想知道廣義的函數體定義。即我將如何以編程方式在.CPP文件中查找函數體。否則,有沒有其他的方法可以將函數頭放在函數體的上方。

謝謝。

+2

可能鉤在某些C++分析器(例如clang)? – Niall 2014-10-09 12:05:25

+0

@Niall:感謝您的回覆,但您能否提供一些關於您所談論的解析器的想法。我在自動化領域是非常新的東西。:) – 2014-10-09 12:07:51

+0

你可以確定'{'和'}'的位置,並且如果沒有使用它的其他東西,比如'if'或'for'或其他東西,那麼它是一個功能體? – Yann 2014-10-09 12:10:26

回答

0

這裏的想法:

找到第一個開放大括號{。 然後找到匹配的大括號。 重複它

public List<string> FindFunctions(string str) 
{ 
    var ret = new List<string>(); 
    var position = 0; 
    var goout = false; 

    while (!goout) 
    { 
     position = str.IndexOf("{", position); 
     if (position == -1) 
      break; 
     var str1 = GetBracedString(str.Substring(position), '{', '}','"'); 
     position += str1.Length; 
     ret.Add(str1); 
    } 
    return ret; 
} 




public String GetBracedString(string str, char openB, char closeB, char quoteChar) 
{ 
    int i = 0; 
    var goout = false; 
    int index = -1; 
    var isUnpairedQoute = new Func<string, char, bool>((s, q) => s.Count(x => x == q)%2 == 1); 
    var braceMatch = new Func<string, char, char, bool>((s,o,c) => s.Count(x => x == o) == s.Count(x => x == c)); 
    while (!goout) 
    { 
     index = str.IndexOf(closeB, index + 1); 
     var testS = str.Substring(0, index + 1); 
     index = isUnpairedQoute(testS,quoteChar) ? str.IndexOf(quoteChar, index) : index; 
     testS = str.Substring(0, index + 1); 
     testS = Regex.Replace(testS, String.Format("{0}.*?[{1}{2}]+?.*?{0}", quoteChar, openB, closeB),match => new string('#', match.Value.Length)); 
     goout = braceMatch(testS,openB,closeB); 
    } 
    return str.Substring(0, index + 1); 
} 
+1

'for'循環怎麼樣?或'while'循環。或'如果'。或者{大括號},因爲{我覺得它}和{幾乎完成同樣的事情}?我知道有人在每一行代碼上加上括號,因爲他不知道更好。一切都在本地範圍內,但是這個怪物被編譯。 – Yann 2014-10-09 13:44:07

+0

好吧,我想第一個大括號將屬於函數體的開頭。另外,它的大括號將是函數體的末尾... – manda 2014-10-09 14:02:01

+0

這是假設你只想匹配文件中的一個函數。 – Yann 2014-10-09 14:28:48