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*)

ただし、最初の試みとは異なり、return型のないメソッドを検索します。でも、使われているのを見たことがないので大丈夫です。

- noReturnType

コメントやifについては何も知りませんが、1)たとえば数学演算子を使用するのは非常に難しく、2)メソッド自体も解析します。

今、私は質問を少し変更していますが、このようなキャプチャグループ出力を実現しようとしています。これは方法がわかりません。

1. -
2. void
FOLLOWING_CAN_REPEAT
3. setFoo:
4. Foo*
5. foo
END_REPEAT
4

2 に答える 2

1

これを確実に実行したい場合は、正規表現では実行できません。

#ifについてどうしますか?マクロ?ヘッダーファイル?人々はこの教訓を学び続けています。正規表現は、コンピューター言語の信頼できる処理には使用できません。

たまにエラーを発生させてもかまわない場合は、すでに機能するソリューションがあります(一種)。これをあなたの心のコンテンツにパッチすることができ、それは改善されますが、常に根本的な欠陥があります。

于 2012-07-26T23:20:32.780 に答える
1

私は、Objective-C言語の文法を備えたYaccBisonのようなものを使用して、フックできる効率的なcソースパーサーを作成します。

于 2012-07-27T15:02:30.087 に答える