1

我正在尝试使用正则表达式解析 Obj-c 源代码。我想找到声明和实现。

首先,我寻找这样的类:

@implementation(.|\n)+@end

@interface(.|\n)+@end

然后我有这些模式来查找类范围内的实例方法:

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
4

2 回答 2

1

我会使用YaccBison之类的东西,用 Objective-C 语言语法来创建一个我可以挂钩的高效的 c 源代码解析器。

于 2012-07-27T15:02:30.087 回答
1

如果你想可靠地做到这一点,你不能用正则表达式来做到这一点。

你打算怎么处理#if?宏?头文件?人们不断学习这一课:正则表达式不能用于可靠地处理计算机语言。

如果您不介意偶尔犯错误,那么您已经有了一个可行的解决方案(有点);你可以把它修补到你心中,它会有所改善,但总是有一个根本性的缺陷。

于 2012-07-26T23:20:32.780 回答