2013-07-07 80 views
0

我想寫一個簡單的方法聲明格式化程序,我需要驗證字符串是否實際上是一個客觀的c方法聲明。檢查一個字符串是否是一個客觀的c方法聲明

是否有某種構建功能來做到這一點,或者可能是正則表達式命令來驗證這樣的事情,還是我需要實現我自己的解析器的這種情況?

現在我已經修整了空白字符串並將其轉換爲小寫字母,因此使用for循環更容易驗證。例如,在下面的代碼中,我可以檢查子字符串「(void)」是否發生,以確定它是一個無效函數,但是這並不能完成這項工作。一定會有更好的辦法。

-(BOOL)isVoidMethod:(NSString*)method 
{ 
    /* Remove white spaces and lower case the method */ 
    [self convertToParseMethod:method]; 

    BOOL isVoid = NO; 

    if ([method rangeOfString:@"(void)"].location != NSNotFound) { 
     isVoid = YES; 
    } else if ([method rangeOfString:@"(ibaction)"].location != NSNotFound) { 
     isVoid = YES; 
    } 

    return isVoid; 
} 

感謝提前:)

+0

你不能這樣做,因爲返回類型不是必需的(隱式默認爲'id'),因此:'-doSomething:(id)argument'是一個完全有效的方法簽名。儘管如此,你只能在真正古老的目標中看到它。 –

+0

也可以看作'IBAction'是一個轉換爲'void'的宏,對於任何預處理文件,你都不應該有這個問題。你真的應該退後一步,準確地分析你想做什麼,爲什麼編譯器不能爲你工作? –

+0

我會通過用execl調用llvm來做到這一點。 –

回答

0

爲了正確地做到這一點/恰恰是。雖然方法聲明看起來並不複雜,因爲它可能包含C語言中可能的任何類型聲明 - 而常見的問答題是「這個C聲明是什麼意思?」 - 語法實際上非常涉及。據我所知,在Objective-C中沒有發佈BNF的組合(儘管你可能在Clang的源代碼中找到一個BNF),而且你的手中有挑戰。

所以你確實需要編寫你自己的解析器,但是你可以用模糊/不精確的方式來解決它 - 假設輸入是有效的並且基於模糊的「tokenise」,比如說,不是你期望的,而是什麼你不要指望 - 所以一個參數類型不是C類型聲明,而只是一個可能包含其他平衡括號的括號字符串,你可以通過計算括號來判斷它。

玩得開心!

+0

hehe好吧,我實際上開始解析字符串,並與小黑客也許我會到達:)謝謝你的答案! – chrs

相關問題