Archived
1

Model Redesign: Added Reference Frames

Added Inverse Functions
UI Redesign
Cleaned Code
This commit is contained in:
Kim Wittenburg
2014-10-07 20:25:54 +02:00
parent 8f2f773909
commit 82259f87e2
40 changed files with 1124 additions and 998 deletions

View File

@@ -21,7 +21,7 @@
@interface MPExpressionEvaluator ()
@property (readwrite, nonatomic, copy) NSString *definedVariable;
@property (nonatomic, strong) NSArray *tokens;
- (void)setError:(MPParseError *)error;
@@ -41,36 +41,6 @@
return self;
}
@synthesize lexer = _lexer;
- (void)setLexer:(MPExpressionTokenizer *)lexer
{
_lexer = lexer;
self.tokens = nil;
}
- (MPExpressionTokenizer *)lexer
{
if (!_lexer) {
_lexer = [[MPExpressionTokenizer alloc] init];
}
return _lexer;
}
- (NSArray *)tokens
{
if (!_tokens) {
_tokens = [self.lexer tokenizeExpression:self.expression];
}
return _tokens;
}
- (void)expressionDidChangeInRange:(NSRange)range
replacementLength:(NSUInteger)replacementLength
{
self.tokens = nil;
}
#pragma mark Evaluating Expressions
- (void)setError:(MPParseError *)error
{
@@ -84,7 +54,7 @@
error:(MPParseError *__autoreleasing *)error
{
_error = error;
tokenStream = [[MPTokenStream alloc] initWithTokens:self.tokens];
tokenStream = [[MPTokenStream alloc] initWithTokens:[self.expression allItemsInReferenceFrame:MPTokenReferenceFrame]];
if (!tokenStream.hasMoreTokens) {
self.error = MPParseError(NSMakeRange(0, 0), @"Empty Expression");
return nil;
@@ -186,11 +156,16 @@
case MPGenericFunctionToken:
{
if ([token isKindOfClass:[MPPowerFunction class]]) {
self.error = MPParseError(NSMakeRange(token.range.location, 0), @"No Base for Power");
return nil;
}
return [self decoratedTerm:[((MPFunction *)token) parseWithError:_error]];
}
case MPSinToken:
{
BOOL inverse = [self inverseFunction];
NSRange sinTermRange;
MPTerm *sinTerm = [self nextValue:&sinTermRange];
if (!sinTerm) {
@@ -199,11 +174,12 @@
}
return nil;
}
return [[MPTerm alloc] initWithSinOfTerm:sinTerm];
return inverse ? [[MPTerm alloc] initWithInverseSinOfTerm:sinTerm] : [[MPTerm alloc] initWithSinOfTerm:sinTerm];
}
case MPCosToken:
{
BOOL inverse = [self inverseFunction];
NSRange cosTermRange;
MPTerm *cosTerm = [self nextValue:&cosTermRange];
if (!cosTerm) {
@@ -212,11 +188,12 @@
}
return nil;
}
return [[MPTerm alloc] initWithSinOfTerm:cosTerm];
return inverse ? [[MPTerm alloc] initWithInverseCosOfTerm:cosTerm] : [[MPTerm alloc] initWithCosOfTerm:cosTerm];
}
case MPTanToken:
{
BOOL inverse = [self inverseFunction];
NSRange tanTermRange;
MPTerm *tanTerm = [self nextValue:&tanTermRange];
if (!tanTerm) {
@@ -225,7 +202,7 @@
}
return nil;
}
return [[MPTerm alloc] initWithTanOfTerm:tanTerm];
return inverse ? [[MPTerm alloc] initWithInverseTanOfTerm:tanTerm] : [[MPTerm alloc] initWithTanOfTerm:tanTerm];
}
case MPEOFToken:
@@ -254,10 +231,31 @@
MPPowerFunction *powerFunction = (MPPowerFunction *)powerToken;
powerFunction.baseTerm = decoratedTerm;
return [powerFunction parseWithError:_error];
} else {
tokenStream.currentLocation--;
} else if (powerToken) {
tokenStream.currentTokenIndex--;
}
return decoratedTerm;
}
- (BOOL)inverseFunction
{
MPToken *powerToken = [tokenStream nextTokenOfType:MPGenericFunctionToken];
if ([powerToken isKindOfClass:[MPPowerFunction class]]) {
MPPowerFunction *powerFunction = (MPPowerFunction *)powerToken;
if (powerFunction.exponentExpression.countElements == 1) {
id<MPExpressionElement> element = [powerFunction.exponentExpression elementAtIndex:0];
if ([element isString]) {
NSString *exponent = [[((NSString *)element) componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:@""];
if ([exponent isEqualToString:@"-1"]) {
return YES;
}
}
}
}
if(powerToken) {
tokenStream.currentTokenIndex--;
}
return NO;
}
@end