【问题标题】:Check if a string is an objective c method declaration检查字符串是否为目标 c 方法声明
【发布时间】:2013-07-07 21:33:05
【问题描述】:

我正在尝试编写一个简单的方法声明格式化程序,我需要验证该字符串是否实际上是一个客观的 c 方法声明。

是否有某种内置功能可以做到这一点,或者可能是一个正则表达式命令来验证这些事情,或者我是否需要为这种情况实现自己的解析器?

现在我已经为空格修剪了字符串并将其转换为小写,因此使用 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;
}

提前致谢:)

【问题讨论】:

  • 你不能那样做,因为返回类型不是必需的(隐式默认为id),这使得:-doSomething:(id) argument 一个完全有效的方法签名。不过,您只能在真正古老的 objc 中看到它。
  • 也看到IBAction 是一个转换为void 的宏,对于任何预处理的文件,你不应该有这个问题。你真的应该退后一步,准确分析你想要做什么,为什么编译器不能为你工作?
  • 我会通过使用 execl 调用 llvm 来做到这一点。

标签: objective-c regex string parsing nsstring


【解决方案1】:

正确/准确地做到这一点是困难。虽然方法声明看起来不太复杂,因为它可能包含 C 中可能的任何类型声明 - 一个常见的测验问题是“这个 C 声明是什么意思?” - 语法实际上相当复杂。再加上据我所知,没有针对 Objective-C 的已发布 BNF(尽管您可能会在 Clang 源代码中找到一个),而且您面临着挑战。

因此,您确实需要编写自己的解析器,但您可能会以模糊/不精确的方式处理它 - 假设输入是有效的,并模糊地“标记”它,例如,不是基于您的期望,而是基于您的不要指望 - 所以参数类型不是 C 类型声明,而只是可能包含其他平衡括号的带括号的字符串,您可以通过计算括号来进行分析。

玩得开心!

【讨论】:

  • 呵呵,好吧,我现在实际上开始解析字符串了,也许我会通过一些小技巧到达那里:) 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多