2011-07-05 45 views
2

嗨,我正在使用自定義腳本語言,我正在C#中爲這種語言製作一種IDE。在這種語言的功能是這樣定義的:使用正則表達式查找函數的最佳方法?

yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

我一直在試圖找出獲得的正則表達式通過所有功能的列表的最佳方式,但沒有找到工作的方式來獲取列表所有定義的功能。有人可以告訴我一個更好的方法或使用正則表達式的方法嗎?非常感謝!編輯: 會這樣的工作在C#? %[a-z_0-9^[^]*]++ [a-z_0-9*^[^]]+[ ^t]++[a-z_0-9*^[^]]+[ ^t]++^([*a-z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-z_0-9./(!]++)[~;]

+0

[可以使用正則表達式來匹配嵌套模式嗎?](http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) – jtbandes

+1

如果你認真對待你的語言,你應該使用一個詞法分析器/解析器對,而不是正則表達式。 –

+0

我可以這樣做,謝謝你的建議。 – user556396

回答

4

如果你只是想函數名稱列表這樣的事情可能工作:

Regex.Matches(source,@"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{").Cast<Match>() 
    .Select (m => m.Groups[1].Captures[0].Value).ToArray() 

基本上,正則表達式正在尋找任何一組字母數字字符,後跟可選的空白,後跟一個開放的括號,接着是零個或多個非括號,接着是一個關閉的括號,然後是可選的空格,然後是一個開放的大括號。

然後從那裏提取剛開始的部分,並創建一個列表。假設該語言不允許緊接的括號後面跟着一個開放的大括號,那麼上面的內容應該可以工作。否則需要更多細節。

+0

我應該注意到,上面可能會捕獲註釋掉的函數,並會捕獲任何看起來像字符串中的函數定義的東西。最好的方法是有一個解析器。如果存在正在討論的語言的正式文檔,特別是他們並不那麼難。如果規範在BNF或類似語言中包含語法,這項工作就變成了一個非常簡單的翻譯。 –

0

,如果你加入像「高清」是一個保留關鍵字改變你的語法這將會容易得多,所以你的聲明變成:

def yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

然後你可以使用一個簡單的正則表達式像def [a-zA-Z0-9]+

+0

我也在想這個。這就是我度過這麼困難的原因。不幸的是,我沒有能力改變腳本語言。 – user556396

+0

此外,這個簡單的正則表達式不會工作(想想在字符串文字中的「def ...」)。龍書(http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools)真的是這個主題的權威。 – Hut8