Can Poyrazoğlu
Can Poyrazoğlu

Reputation: 34830

Line number-aware scanning with NSScanner

I am creating a very simple parser for a small scripting system of my project, and I'm reading tokens using NSScanner. I need to be aware of line number of each token, so in case of a syntax error, I can display the line number. Here is my current implementation (at the basic level):

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

How can I make this implementation line-aware reimplementing the whole scanner by myself?

Upvotes: 2

Views: 86

Answers (1)

user3386109
user3386109

Reputation: 34839

One possible (but not the most efficient) solution is to use nested scanners. The outer scanner would extract lines from the input while the inner scanner would extract tokens from the lines. The code would look something like this

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

Upvotes: 1

Related Questions