Model Redesign: Added Reference Frames
Added Inverse Functions UI Redesign Cleaned Code
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user