使用 NSScanner 进行行号感知扫描

Line number-aware scanning with NSScanner

我正在为我的项目的一个小型脚本系统创建一个非常简单的解析器,并且我正在使用 NSScanner 读取标记。我需要知道每个标记的行号,所以如果出现语法错误,我可以显示行号。这是我当前的实现(在基本级别):

int line = 1;
NSScanner *scanner = [NSScanner scannerWithString:script];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
while (![scanner isAtEnd]) {
    NSString *readString;
    [scanner scanUpToCharactersFromSet:whitespace intoString:&readString];
    ... (process the token)
}

我怎样才能让这个实现具有行感知能力,自己重新实现整个扫描仪?

一种可能的(但不是最有效的)解决方案是使用嵌套扫描仪。外部扫描器将从输入中提取行,而内部扫描器将从行中提取标记。代码看起来像这样

NSString *script = @"First line\nSecond line\n";
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];

int lineNumber = 0;
NSScanner *lineScanner = [NSScanner scannerWithString:script];
while ( ![lineScanner isAtEnd] )
{
    lineNumber++;
    NSString *line;
    [lineScanner scanUpToString:@"\n" intoString:&line];

    int tokenNumber = 0;
    NSScanner *tokenScanner = [NSScanner scannerWithString:line];
    while ( ![tokenScanner isAtEnd])
    {
        tokenNumber++;
        NSString *token;
        [tokenScanner scanUpToCharactersFromSet:whitespace intoString:&token];
        NSLog( @"line %d:token %d: %@", lineNumber, tokenNumber, token );
    }
}