我正在尝试编写一个简单的方法声明格式化程序,我需要验证字符串是否实际上是一个客观的c方法声明。
是否有某种功能构建或者可能是regex命令来验证这些事情,或者我是否需要为这种情况实现自己的解析器?
现在我已经修剪了白色空格的字符串并将其转换为小写,因此使用for循环更容易验证。例如,在下面的代码中,我可以检查子串“(void)”是否发生以确定它是一个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 :(得分:0)
要正确/精确地执行此操作 hard 。虽然方法声明看起来并不太复杂,因为它可能包含C中可能的任何类型声明 - 而常见的测验问题是“这个C声明是什么意思?” - 语法实际上非常复杂。据我所知,还没有为Objective-C发布BNF(尽管你可能在Clang源代码中找到一个),并且你手上有一个挑战。
所以你确实需要编写自己的解析器,但是你可以用模糊/不精确的方式解决它 - 假设输入是有效的,并且“标记化”它模糊不清,比如说,不是你期望的,而是你的意思不要指望 - 所以参数类型不是C类型声明,而只是一个带括号的字符串,可能包含其他平衡括号,你可以通过计算括号来解释它。
玩得开心!