2013-07-07 44 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

相关问题