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