57 lines
1.3 KiB
Objective-C
57 lines
1.3 KiB
Objective-C
//
|
|
// MPExpressionEvaluator.m
|
|
// MathPad
|
|
//
|
|
// Created by Kim Wittenburg on 31.08.14.
|
|
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
|
|
//
|
|
|
|
#import "MPExpressionEvaluator.h"
|
|
#import "MPExpression.h"
|
|
|
|
#import "MPParsedElement.h"
|
|
#import "MPMath.h"
|
|
|
|
@implementation MPExpressionEvaluator {
|
|
NSMutableDictionary *_variableBindings;
|
|
}
|
|
- (id)initWithExpression:(MPExpression *)expression
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
_expression = expression;
|
|
_variableBindings = [[NSMutableDictionary alloc] init];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
#pragma mark Lexing
|
|
- (MPParsedElement *)structuredRepresentationOfElementAtIndex:(NSUInteger)index
|
|
{
|
|
NSString *string = (NSString *)[self.expression elementAtIndex:index];
|
|
YY_BUFFER_STATE buffer = yy_scan_string(string.UTF8String);
|
|
yyparse();
|
|
yy_delete_buffer(buffer);
|
|
return [parseResult copy];
|
|
}
|
|
|
|
#pragma mark Evaluating Expressions
|
|
- (NSDictionary *)variableBindings
|
|
{
|
|
return [_variableBindings copy];
|
|
}
|
|
|
|
- (void)bindValue:(double)value toVariableName:(NSString *)name
|
|
{
|
|
[_variableBindings setObject:@(value)
|
|
forKey:name];
|
|
}
|
|
|
|
- (double)evaluateWithError:(NSError *__autoreleasing *)error
|
|
{
|
|
MPParsedElement *element = [self structuredRepresentationOfElementAtIndex:0];
|
|
return element.standaloneValue;
|
|
}
|
|
|
|
@end
|