// // MPTokenStream.m // MathPad // // Created by Kim Wittenburg on 20.09.14. // Copyright (c) 2014 Kim Wittenburg. All rights reserved. // #import "MPTokenStream.h" @implementation MPTokenStream { NSUInteger eofLocation; } - (instancetype)initWithTokens:(NSArray *)tokens { self = [super init]; if (self) { self.tokens = tokens; self.ignoringWhitespaceTokens = YES; if (tokens.count > 0) { eofLocation = NSMaxRange([tokens.lastObject range]); } [self reset]; } return self; } - (void)skipWhitespaces { if (!self.isIgnoringWhitespaceTokens) { return; } while (self.currentTokenIndex < self.tokens.count) { MPToken *token = self.tokens[self.currentTokenIndex]; if (token.tokenType != MPWhitespaceToken) { return; } ++self.currentTokenIndex; } } - (void)reset { self.currentTokenIndex = 0; [self skipWhitespaces]; } - (BOOL)hasMoreTokens { [self skipWhitespaces]; return self.currentTokenIndex < self.tokens.count; } - (MPToken *)nextToken { [self skipWhitespaces]; if (self.currentTokenIndex >= self.tokens.count) { return [[MPToken alloc] initEOFTokenAtLocation:eofLocation]; } else { MPToken *token = self.tokens[self.currentTokenIndex++]; return token; } } - (MPToken *)nextTokenOfType:(MPTokenType)type { [self skipWhitespaces]; if (self.currentTokenIndex >= self.tokens.count) { return nil; } else { MPToken *token = self.tokens[self.currentTokenIndex]; if (token.tokenType != type) { return nil; } ++self.currentTokenIndex; return token; } } @end