2012-07-26 66 views
1

我想用正則表達式解析Obj-c源代碼。我想找到兩個聲明和實現。用正則表達式解析Obj-c方法

首先我尋找類是這樣的:

@implementation(.|\n)[email protected] 

@interface(.|\n)[email protected] 

然後,我有這些模式尋找實例方法類的範圍內:從

For interface:  -.*; 
For implementation: -.*{ 

然而事情:評論,字符串和數學運算也包括在內。

例子,其中這些模式失敗:

//I'm pretending to-be an instance method; 

/* 
Disabled methods: 
- (void)myProgrammerDidntLikeMe; 
*/ 

if (a + b == 2) { ... } 
str = @"-----"; 

我怎樣才能讓圖案排除這些假裝對是方法,而且是有什麼別的我沒有預見?

更新:當試驗解析單個方法字符串時,我注意到我的模式也用於識別它們。這是我想出了:

(-|\+)\s\(([\w|\*|\s]*)\)(?:(?:(?:(\w*)(?:\:\([\w|\s|\*]*)\)(\w*)\s*){1,}))?(\w*) 

但它不,不像我第一次嘗試找到沒有返回類型的方法。但是我沒有問題,因爲我從來沒有見過被使用過的人。

- noReturnType 

我不知道有關的意見和IFS什麼,但是1)它很難用太糊弄比如數學運算和2)它也分析方法本身。

現在我稍微改變了我的問題,但我試圖實現這樣的捕獲組輸出,我不知道該如何去做。

1. - 
2. void 
FOLLOWING_CAN_REPEAT 
3. setFoo: 
4. Foo* 
5. foo 
END_REPEAT 
+2

如果你想做到這一點可靠,你不能用正則表達式。你打算怎麼處理#if?宏?頭文件?人們不斷學習這一課:正則表達式不能用於計算機語言的可靠處理。如果你不介意偶爾犯錯誤,你已經有了一個可行的解決方案。你可以修補這個到你的心中,它會改善但總是有一個根本的缺陷。如果你需要一個真正的Objective C解析器,我還有另一個答案。 – 2012-07-26 17:48:09

+1

「我試圖用正則表達式解析Obj-c源代碼。」這聽起來對我來說是個壞主意。你確定這是最好的選擇嗎? – Hassan 2012-07-26 17:48:33

+1

有關使用正則表達式解析代碼的一些建議:http://stackoverflow.com/q/1732348/1487063(我最喜歡的SO問題)。 – Dustin 2012-07-26 17:52:40

回答

1

如果你想做到這一點可靠,你不能用正則表達式。

你打算怎麼處理#if?宏?頭文件?人們不斷學習這一課:正則表達式不能用於計算機語言的可靠處理。

如果你偶爾不介意犯錯誤,你已經有一個解決方案可以工作(種類);你可以修補這個到你的心中,它會改善,但總是有一個根本的缺陷。

1

我會使用類似YaccBison的東西,用Objective-C語言語法提供,以創建一個我可以插入的有效c源解析器。