【问题标题】:Line number-aware scanning with NSScanner使用 NSScanner 进行行号感知扫描
【发布时间】:2015-12-27 09:21:08
【问题描述】:

我正在为我的项目的一个小型脚本系统创建一个非常简单的解析器,并且我正在使用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)
}

我怎样才能让这个实现能够感知行并自己重新实现整个扫描器?

【问题讨论】:

    标签: objective-c parsing nsscanner


    【解决方案1】:

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

    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 );
        }
    }
    

    【讨论】:

    • 我将以这个想法为起点。我真的不需要性能,因为它会在用户应用程序中解析最多 20-30 行脚本。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2021-04-05
    相关资源
    最近更新 更多