// // MPParsedElement.m // MathPad // // Created by Kim Wittenburg on 05.09.14. // Copyright (c) 2014 Kim Wittenburg. All rights reserved. // #import "MPParsedElement.h" @implementation MPParsedElement - (instancetype)init { self = [super init]; if (self) { } return self; } - (NSDecimalNumber *)valueAtBeginning { NSDecimalNumber *value = self.value; if (self.prefixValueExplicit) { value = [value decimalNumberByAdding:self.prefixMultiplicator]; } return value; } - (NSDecimalNumber *)valueAtEnd { NSDecimalNumber *value = self.value; if (self.suffixValueExplicit) { value = [value decimalNumberByAdding:self.suffixMultiplicator]; } return value; } - (NSDecimalNumber *)standaloneValue { if (self.isFactor) { return self.value; } NSDecimalNumber *value = self.value; if (self.prefixValueExplicit) { value = [value decimalNumberByAdding:self.prefixMultiplicator]; } if (self.suffixValueExplicit) { value = [value decimalNumberByAdding:self.suffixMultiplicator]; } return value; } - (BOOL)isValidElementAtBeginning:(MPParseError *__autoreleasing *)error { if (self.prefixOperatorExplicit) { if (error) { *error = MPParseError(0, @"Expected Number"); } return NO; } return YES; } - (BOOL)isValidStandaloneElement:(MPParseError *__autoreleasing *)error { return [self isValidElementAtBeginning:error] && [self isValidElementAtEnd:error]; } - (BOOL)isValidElementAtEnd:(MPParseError *__autoreleasing *)error { if (self.suffixOperatorExplicit) { if (error) { *error = MPParseError(self.suffixIndex, @"Expected Number"); } return NO; } return YES; } - (BOOL)isValidVariableDefinition:(MPParseError *__autoreleasing *)error { if (self.definedVariable == nil) { if (error) { *error = MPParseError(0, @"Expected Variable Definition"); } return NO; } return [self isValidElementAtBeginning:error]; } #pragma mark - NSObject Overrides - (NSString *)description { NSMutableString *description = [[NSMutableString alloc] initWithString:@"MPParsedElement<"]; if (self.isFactor) { [description appendFormat:@"factor=%@%@%@", self.prefixOperatorExplicit?@"*":@"", self.value, self.suffixOperatorExplicit?@"*":@""]; } else { [description appendFormat:@"prefix=%@%@ prefixValueExplicit=%@", self.prefixOperatorExplicit?@"*":@"", self.prefixMultiplicator, self.prefixValueExplicit?@"YES":@"NO"]; [description appendFormat:@" suffix=%@%@ suffixValueExplicit=%@", self.suffixMultiplicator, self.suffixOperatorExplicit?@"*":@"", self.suffixValueExplicit?@"YES":@"NO"]; [description appendFormat:@" value=%@", self.value]; } [description appendString:@">"]; return [description copy]; } #pragma mark - NSCopying - (id)copyWithZone:(NSZone *)zone { MPParsedElement *copy = [[MPParsedElement allocWithZone:zone] init]; copy.isFactor = self.isFactor; copy.value = self.value; copy.prefixOperatorExplicit = self.prefixOperatorExplicit; copy.prefixValueExplicit = self.prefixValueExplicit; copy.prefixMultiplicator = self.prefixMultiplicator; copy.suffixOperatorExplicit = self.suffixOperatorExplicit; copy.suffixValueExplicit = self.suffixValueExplicit; copy.suffixMultiplicator = self.suffixMultiplicator; return copy; } @end