Archived
1

Fundamental Redesign of Evaluation

This commit is contained in:
Kim Wittenburg
2014-11-24 22:42:44 +01:00
parent 10f0e73ad3
commit 7a32e3b0b6
45 changed files with 1398 additions and 350 deletions

View File

@@ -8,63 +8,30 @@
#import "MPVariable.h"
#import "MPParsedExpression.h"
#import "MPTokenStream.h"
#import "MPToken.h"
#import "MPExpression.h"
#import "MPEvaluationContext.h"
@implementation MPVariable {
NSRange _range;
}
@implementation MPVariable
- (instancetype)init
- (instancetype)initWithVariableName:(NSString *)variableName
{
self = [super init];
if (self) {
NSAssert(variableName != nil, @"variableName must not be nil.");
_variableName = variableName;
}
return self;
}
- (instancetype)initWithTokenStream:(MPTokenStream *)tokenStream
- (NSDecimalNumber *)doEvaluation:(NSError *__autoreleasing *)error
{
self = [self init];
if (self) {
[tokenStream beginIgnoringWhitespaceTokens];
MPToken *token = tokenStream.currentToken;
if (token.tokenType == MPVariableToken) {
_variableName = token.stringValue;
_range = token.range;
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Expected Variable" userInfo:nil];
}
[tokenStream currentTokenConsumed];
[tokenStream endIgnoringOrAcceptingWhitespaceTokens];
}
return self;
}
- (NSRange)range
{
return _range;
}
- (BOOL)validate:(NSError *__autoreleasing *)error
{
if (![[MPEvaluationContext sharedContext] isVariableDefined:self.variableName]) {
if (error) {
*error = MPParseError(9,
NSLocalizedString(@"Undefined Variable.", @"Error message. This is displayed when an expression contains an undefined variable."),
nil);
}
return NO;
}
return YES;
}
- (NSDecimalNumber *)evaluate
{
return [[MPEvaluationContext sharedContext] valueForVariable:self.variableName];
return [self valueForVariable:self.variableName
error:error];
}
@end