82 lines
1.7 KiB
Objective-C
82 lines
1.7 KiB
Objective-C
//
|
|
// 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
|