如何在NSString中循环遍历各个NSStrings? (语法高亮/着色)

时间:2011-06-13 00:03:52

标签: objective-c cocoa nsstring

我正在制作一个Brainfuck(编程语言)IDE,我一直坚持使用语法着色。

我想预定义带有子串的NSDictionary,并循环遍历它们 返回一个数组,其中包含(或循环)给定字符串中子串的范围。

示例:

NSMutableDictionary* keywords = [[NSMutableDictionary alloc] init];

[keywords setObject:[self colorForSymbol:0] forKey:@"<"];

[keywords setObject:[self colorForSymbol:0] forKey:@">"];

[keywords setObject:[self colorForSymbol:1] forKey:@"+"];

[keywords setObject:[self colorForSymbol:1] forKey:@"-"];

然后对于每个符号,我会使用NSRanges的{​​{1}}为所有匹配的NSTextStorage着色。

我需要知道的是如何为此目的使用NSTextView或类似的东西。

1 个答案:

答案 0 :(得分:2)

我对this question的回答可能有助于将语法着色挂钩到NSTextView的机制。

要进行实际的标记化,您应该查看NSScanner。对于每个标记,您可能需要在多个过程中解析文本。您还可以使用正则表达式,使用类似RegexKitLite的内容。

以下是NSScanner的简单演示:

NSScanner* scanner = [NSScanner scannerWithString:@"A string <with> <tokens>"];

NSString* token = @"<";

NSMutableArray* ranges = [NSMutableArray array];

while(![scanner isAtEnd])
{
    [scanner scanUpToString:token intoString:nil];
    if(![scanner isAtEnd])
    {
        NSRange tokenRange = NSMakeRange([scanner scanLocation], 1);
        [ranges addObject:[NSValue valueWithRange:tokenRange]];
        [scanner scanString:token intoString:nil];
    }
}