Archived
1

Reorganized File Structure

Added Documentation
This commit is contained in:
Kim Wittenburg
2014-12-12 00:39:30 +01:00
parent c367b1dbe8
commit 8f1f730358
90 changed files with 1270 additions and 1216 deletions

910
MathKit/MPExpression.h Normal file
View File

@@ -0,0 +1,910 @@
//
// MPExpression.h
// MathPad
//
// Created by Kim Wittenburg on 10.08.14.
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
//
/*!
@header
The <code>MPExpression</code> class is used to represent a mathematical
expression. It is used in the storage layer of the MathKit Expression System. An
instance of the <code>MPExpression</code> class stores all contents related to
an expression and can manipulate them. However it is not able to evaluate the
represented expression by itself.
<h2>Structure of an Expression</h2>
Expressions consist of two types of elements: string elements and function
elements. String elements are represented by the <code>NSString</code> class.
In a valid expression string elements can only contain ASCII valid characters.
(and some other special characters) that make sense in a mathematical context.
Functions are represented by the <code>MPFunction</code> class. Functions
represent everything beyond simple text (such as powers, parenthesis and roots).
An expression should be pictured as a sequence of symbols that can either be
characters or functions. For the purposes of easier processing of expressions
it is possible to access complete string or function elements. Also there is a
third way of accessing an expression's contents: You can query individual tokens
of an expression. Tokens represent logical units inside an expression. For more
information on tokens see the <code>MPToken</code> class.
<h2>The Expression Tree</h2>
Like expressions functions can likewise have expressions as elements (also
called <i>children</i> in this context). Both expressions and functions are
mutable. Through this organization expression are organized in a tree-like
structure called the <i>expression tree</i>. See <code>MPFunction</code> for
details.
<h2>Terminology</h2>
When working with expressions note that there is a special terminology for an
expression's contents:
<b>Element:</b><br />
An element is either an instance of the <code>NSString</code> or <code>
MPFunction</code> class. String elements can be multiple characters long. For
example the expression <code>4+2²</code> consists of one string element
(<code>"4+2"</code>) and one function element (the square function). All
elements conform to the <code>MPExpressionElement</code> protocol.
<b>Token:</b><br />
Tokens are logical units within an expression. For example the expression
<code>4+2²</code> consists of 4 tokens: A number token (<code>4</code>), a plus
sign token (<code>+</code>), another number (<code>2</code>) and a power token
(the square function). All tokens conform to the <code>MPToken</code> protocol.
<b>Symbol:</b><br />
Symbols are the smallest possible part of an expression. A symbol is either a
single character or a single function. For example the expression
<code>4+2²</code> consists of 4 symbols: The characters <code>"4"</code>,
<code>"+"</code> and <code>"2"</code> and the square function.
<b>Item:</b></br />
The term <i>item</i> is used to describe any of the previous. When the term
<i>item</i> is used in the name of a function or method it necessary to specify
what exactly an item is supposed to be. Usually this is done through reference
frames.
<b>Reference Frame:</b><br />
A reference frame is a way to specify what an <i>item</i> is supposed to mean in
a specific context. It can either be an <i>element</i>, a <i>symbol</i> or a
<i>token</i>. For more information about reference frames see
<code>MPReferenceFrame</code>.
<b>Children:</b><br />
Children are sub-elements of functions. The term <i>children</i> normally refers
to any kind of elements in the context of the expression tree.
This terminology is consistent within the MathKit Expression System. Because
symbols are the smalles possible unit of measurement elements and tokens both
consist of one or more symbols. Similarly elements consist of one or more
tokens. You can convert between different reference frames using one the
following methods:
<pre>
@textblock
- convertIndexFromReferenceFrame:toReferenceFrame:
- convertIndexFromReferenceFrame:toReferenceFrame:offset:
@/textblock
</pre>
<h2>Evaluating Expressions</h2>
A <code>MPExpression</code> instance can not evaluate itself. There are however
the <code>-parse:</code> and
<code>-parseExpectingVariableDefinition:errors:</code> methods. These parse and
thereby convert a <code>MPExpression</code> instance into a
<code>MPParsedExpression</code> instance that can be evaluated. For more
information on evaluation see the <code>MPParsedExpression</code> and
<code>MPTerm</code> class as well as the previously mentioned methods.
*/
/*!
@const MPIllegalElementException
@brief Name for an exception that is raised if an invalid element is
added to an expression.
@discussion This exception may be raised during initialization of an
expression or when the expression is mutated. This exception
contains the invalid element in its <code>userInfo</code>
dictionary. You can query it using the
<code>MPIllegalElementExceptionElementKey</code> key.
*/
FOUNDATION_EXPORT NSString *const MPIllegalElementException;
/*!
@const MPIllegalElementExceptionElementKey
@brief Predefined key for an invalid element that caused a
<code>MPIllegalElementException</code> to be raised.
@discussion The invalid element can be of any type. Numbers and structs are
wrapped in an <code>NSNumber</code> or <code>NSValue</code>
instance respectively.
*/
FOUNDATION_EXPORT NSString *const MPIllegalElementExceptionElementKey;
/*!
@typedef MPReferenceFrame
@brief A reference frame specifies the way an <i>item</i> is to be
interpreted.
@constant MPElementReferenceFrame
Specifies that items should be interpreted as elements.
@constant MPSymbolReferenceFrame
Specifies that items should be interpreted as symbols.
@constant MPTokenReferenceFrame
Specifies that items should be interpreted as tokens.
*/
typedef enum {
MPElementReferenceFrame,
MPSymbolReferenceFrame,
MPTokenReferenceFrame
} MPReferenceFrame;
@class MPExpression, MPFunction, MPRangePath, MPParsedExpression;
@protocol MPExpressionElement, MPToken;
/*!
@class MPExpression
@brief A <code>MPExpression</code> instance represents a mathematical
expression.
@discussion Every expression consists of string elements (represented by the
<code>NSString</code> class) and function elements (represented
by the <code>MPFunction</code> class). Functions and expressions
make up the expression tree.
*/
@interface MPExpression : NSObject <NSCopying, NSCoding>
#pragma mark Creation Methods
/*!
@methodgroup Creation Methods
*/
/*!
@method init
@brief Initlializes a new expression.
@discussion This method is a convenience initializer to initialize an
expression with <code>0</code> elements.
@return An empty expression.
*/
- (instancetype)init;
/*!
@method initWithElement:
@brief Initializes a new expression with the specified
<code>element</code>.
@discussion This method is a convenience initializer to initialize an
expression with a single element.
@param element
The element to be added to the expression. The
<code>element</code> will be copied.
@return An expression initialized with <code>element</code>.
*/
- (instancetype)initWithElement:(id<MPExpressionElement>)element;
/*!
@method initWithElements:
@brief Initializes a new expression with the specified
<code>elements</code>.
@discussion All elements must conform to the <code>MPExpressionElement</code>
protocol. If one or more objects do not conform to that protocol
a <code>MPIllegalElementException</code> is raised.
This method is the designated initializer for the
<code>MPExpression</code> class.
@param elements
The elements that should be added to the expression. Every
element must conform to the <code>MPExpressionElement</code>
protocol. Each element is copied and the copy is then added to
the expression. The object in the <code>elements</code> array is
not modified.
@return An expression containing <code>elements</code>.
*/
- (instancetype)initWithElements:(NSArray *)elements; /* designated initializer */
#pragma mark Querying Expressions
/*!
@methodgroup Querying Expressions
*/
/*!
@property parent
@brief The receiver's parent.
@discussion The receiver's parent is the function in the expression tree that
contains the receiver.
@warning You should never set this property manually. If you are
implementing a custom subclass of <code>MPFunction</code> use the
<code>MPFunctionAccessorImplementation</code> macro.
@return The parent of the receiver or <code>nil</code> if the receiver is
the root expression.
*/
@property (nonatomic, weak) MPFunction *parent;
/*!
@method rootExpression
@brief Returns the root expression from the receiver's expression tree.
@discussion The root expression is the ultimate parent of all expressions and
functions in the expression tree. A root expression does not have
a parent.
@return The root expression from the receiver's expression tree.
*/
- (MPExpression *)rootExpression;
/*!
@method indexPath
@brief Returns the index path of the receiver in the expression tree.
@discussion The index path contains the indexes (starting from the root
expression of the receiver's expression tree) that lead to the
receiver. The indexes are expressed in the element reference
frame.
@return The index path of the receiver in the expression tree.
*/
- (NSIndexPath *)indexPath;
/*!
@method countItemsInReferenceFrame:
@brief Returns the number of items in the receiver in the specified
<code>referenceFrame</code>.
@param referenceFrame
The reference frame that should be used to count the items.
@return The current number of items in the receiver counted in the
specified <code>referenceFrame</code>.
*/
- (NSUInteger)countItemsInReferenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method itemAtIndex:referenceFrame:
@brief Returns the item at <code>anIndex</code>.
@discussion The item is not copied before it is returned. So be aware that
if you mutate a <code>MPFunction</code> instance returned from
this function the receiver's expression tree will be updated to
reflect the change.
@param anIndex
The index of the item. If the index is greater than the number of
items for the respective reference frame a
<code>NSRangeException</code> is raised.
@param referenceFrame
The reference frame that should be used to identify the item at
<code>anIndex</code>.
@return The item at <code>anIndex</code>.
*/
- (id)itemAtIndex:(NSUInteger)anIndex
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method elementAtIndex:referenceFrame:
@brief Returns the element at the specified index.
@discussion An element is either a string or a function. If
<code>anIndex</code> identifies a position inside a string
element the complete element is returned.
This method always returns elements. To query items in the
specified reference frame use
<code>-itemAtIndex:referenceFrame:</code>.
@param anIndex
The index of the element.
@param referenceFrame
The reference frame <code>anIndex</code> is specified in.
@return The element at <code>anIndex</code>.
*/
- (id<MPExpressionElement>)elementAtIndex:(NSUInteger)anIndex
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method indexOfElement:
@brief Returns the index of <code>element</code> or
<code>NSNotFound</code> if it was not found.
@param element
The element to find.
@return The index of <code>element</code> expressed in the element
reference frame.
*/
- (NSUInteger)indexOfElement:(id<MPExpressionElement>)element;
/*!
@method itemsInRange:referenceFrame:
@brief Returns an array of the items that are located in the specified
range.
@discussion The objects in the returned array are copied before they are
returned.
If the <code>range</code> exceeds the receiver's bounds a
<code>NSRangeException</code> is raised.
@param aRange
The requested range within the receiver's bounds.
@param referenceFrame
The referenceFrame <code>aRange</code> is expressed in.
@return An array containing all elements in the specified range. The type
of the objects depends on the specified
<code>referenceFrame</code>.
*/
- (NSArray *)itemsInRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method allItemsInReferenceFrame:
@brief Returns an array of all items in the receiver for the specified
reference frame.
@discussion The elements in the returned array are not copied before they are
returned so be aware that mutations to any of the returned
objects will update the receiver's expression tree to reflect the
change.
@return An array of all items in the receiver.
*/
- (NSArray *)allItemsInReferenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method elementAtIndexPath:
@brief Returns the element at the specified index path.
@discussion This method finds the elements at the respective indexes starting
at the root expression from the receiver's expression tree.
The returned object can be a <code>NSString</code>, a
<code>MPFunction</code> or an <code>MPExpression</code> instance
depending on the specified <code>indexPath</code>. If any of the
indexes exceed the bounds of the respective receiver a
<code>NSRangeException</code> is raised.
If the index path does not contain any indexes the receiver
itself is returned.
@param indexPath
The index path the required object is located at. The indexes are
expressed in the element reference frame.
@return The element located at <code>indexPath</code>. The element is not
copied before it is returned. Be aware of the fact that any
mutations made to the returned object will update the receiver's
expression tree to reflect the change.
*/
- (id)elementAtIndexPath:(NSIndexPath *)indexPath;
/*!
@method convertIndex:fromReferenceFrame:toReferenceFrame:
@brief Converts an index from one reference frame to another.
@discussion This method ignores any offsets into items the conversion between
reference frames can cause. If you are interested in the offset
use <code>-convertIndex:fromReferenceFrame:toReferenceFrame:offset:</code>
instead.
@param anIndex
The index to be converted.
@param fromReferenceFrame
The reference frame <code>anIndex</code> is specified in.
@param toReferenceFrame
The reference frame <code>anIndex</code> should be converted to.
@return An index specified in the <code>toReferenceFrame</code>. If
<code>anIndex</code> identifies a location inside an item in the
<code>toReferenceFrame</code> the index of the corresponding item
is returned.
*/
- (NSUInteger)convertIndex:(NSUInteger)anIndex
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame;
/*!
@method convertIndex:fromReferenceFrame:toReferenceFrame:offset:
@brief Converts an index from one reference frame to another.
@discussion If <code>anIndex</code> identifies a location inside an item in
the <code>toReferenceFrame</code> the index of the corresponding
item is returned. In that case the <code>offset</code> parameter
will be set to the number of symbols the offset goes into the
item at the returned index.
@param anIndex
The index to be converted.
@param fromReferenceFrame
The reference frame <code>anIndex</code> is specified in.
@param toReferenceFrame
The reference frame <code>anIndex</code> should be converted to.
@param offset
This output parameter will be set to the number of symbols that
are between the location identified by <code>anIndex</code> and
the index that is actually returned. The offset is specified in
the symbol reference frame. If you are not interested in the
offset pass <code>NULL</code>.
@return An index specified in the <code>toReferenceFrame</code>
corresponding to <code>anIndex</code>.
*/
- (NSUInteger)convertIndex:(NSUInteger)anIndex
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame
offset:(NSUInteger *)offset;
/*!
@method convertRange:fromReferenceFrame:toReferenceFrame:
@brief Converts a range from one reference frame to another.
@discussion This method just converts the location and target of the range
separately using
<code>-convertIndex:fromReferenceFrame:toReferenceFrame:</code>.
It ensures that the returned range definitely includes all items
that were specified by <code>aRange</code>.
The possibility that the returned range may
include more symbols than <code>aRange</code> is ignored. If you
need that information use
<code>-convertRange:fromReferenceFrame:toReferenceFrame:leadingOffset:trailingOffset:</code>.
@param aRange
The range to be converted.
@param fromReferenceFrame
The reference frame <code>aRange</code> is specified in.
@param toReferenceFrame
The reference frame <code>aRange</code> is to be converted to.
@return A range in the <code>toReferenceFrame</code> that includes the
the items identified by <code>aRange</code>.
*/
- (NSRange)convertRange:(NSRange)aRange
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame;
/*!
@method convertRange:fromReferenceFrame:toReferenceFrame:leadingOffset:trailingOffset:
@brief Converts a range from one reference frame to another.
@discussion This method just converts the location and target of the range
separately using
<code>-convertIndex:fromReferenceFrame:toReferenceFrame:</code>.
It ensures that the returned range definitely includes all items
that were specified by <code>aRange</code>.
@param aRange
The range to be converted.
@param fromReferenceFrame
The reference frame <code>aRange</code> is specified in.
@param toReferenceFrame
The reference frame <code>aRange</code> is to be converted to.
@param leadingOffset
The offset of the location of the returned range in respect to
the location of <code>aRange</code>.
@param trailingOffset
The offset of the last index in the range in respect to the last
index of <code>aRange</code>.
@return A range in the <code>toReferenceFrame</code> that includes the the items
specified by <code>aRange</code>.
*/
- (NSRange)convertRange:(NSRange)aRange
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame
leadingOffset:(NSUInteger *)leadingOffset
trailingOffset:(NSUInteger *)trailingOffset;
#pragma mark Mutating Expressions
/*!
@methodgroup Mutating Expressions
*/
/*!
@method replaceItemsInRange:referenceFrame:withElements:
@brief Replaces the elements in the specified range with the contents of
the <code>elements</code> array.
@discussion This is the most primitive mutation method of
<code>MPExpression</code>. Every other mutating method must
ultimately call this method.
After the receiver has been mutated the integrety of the receiver
is restored. That basically means that subsequent strings are
joined and empty strings removed. After restoring integrity the
receiver sends a
<code>-changedElementsInIndexedRangePath:replacementLength:</code>
to itself. For more information see the documentation on that
method.
@param aRange
The range of symbols (including functions) to replace.
@param referenceFrame
The reference frame <code>aRange</code> is specified in.
@param elements
The elements that should replace the symbols specified by
<code>range</code>.
*/
- (void)replaceItemsInRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame
withElements:(NSArray *)elements;
/*!
@method changedElementsInRangePath:replacementLength:
@brief This is a notification message that is sent from the receiver to
itself after it has been mutated.
@discussion This method does nothing more than notify it's parent that it has
been mutated at the respective range path. If you want to get
notified about changes in an expression you should override this
method instead of
<code>-replaceSymbolsInRange:withElements:</code> because this
method gives you information about the elements that changed
during the mutation.
@param rangePath
The range path at which the receiver was changed starting at the
receiver. The range addressed by <code>rangePath</code> is
expressed in the element reference frame.
@param replacementLength
The number of elements replacing the elements specified by
<code>rangePath</code> (also specified in the element reference
frame).
*/
- (void)changedElementsInRangePath:(MPRangePath *)rangePath
replacementLength:(NSUInteger)replacementLength;
/*!
@method subexpressionFromIndex:referenceFrame:
@brief Creates an expression from the items in the receiver from the
specified index to the end.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver's expression tree.
@param from
The index from which to start constructing the subexpression.
@param referenceFrame
The reference frame <code>from</code> is specified in.
@return An expression containing the items from the specified index to
the end of the receiver.
*/
- (MPExpression *)subexpressionFromIndex:(NSUInteger)from
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method subexpressionToIndex:referenceFrame:
@brief Creates an expression from the items in the receiver from the
first to the specified item.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver's expression tree.
@param to
The index of the first element not to include in the newly
constructed subexpression.
@param referenceFrame
The reference frame <code>to</code> is specified in.
@return An expression containing the items from the first item to the one
at the specified index.
*/
- (MPExpression *)subexpressionToIndex:(NSUInteger)to
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method subexpressionWithRange:referenceFrame:
@brief Creates an expression from the items in the receiver within the
specified range.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver's expression tree.
@param aRange
Specifies the items to be included in the newly created
subexpression.
@param referenceFrame
The reference frame <code>aRange</code> is specified in.
@return An expression containing the items in <code>aRange</code>.
*/
- (MPExpression *)subexpressionWithRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame;
#pragma mark Evaluating Expressions
/*!
@methodgroup Evaluating Expressions
*/
/*!
@method parse:
@brief Parses the receiver.
@discussion This is a convenience method that calls
<code>-parseExpectingVariable:errors:</code> with <code>NO</code>
as the first argument.
@param errors
If the receiver (or any of its elements) contain syntax errors
this parameter is set to an appropriate value. All items in the
array are <code>NSError</code> instances. This parameter is never
set to an empty array. Pass <code>NULL</code> if you are not
interested in any errors that might occur.
@return A <code>MPParsedExpression</code> instance that represents the
receiver and can be evaluated or <code>nil</code> if an error
occurs. In that case the <code>errors</code> parameter is set to
an array containing at least one <code>NSError</code> instance.
*/
- (MPParsedExpression *)parse:(NSArray *__autoreleasing *)errors;
/*!
@method parseExpectingVariable:errors:
@brief Parses the receiver.
@param flag
If <code>YES</code> the receiver must (exept for whitespaces)
begin with a single letter followed by an equals sign. If it
doesn't the expression is considered invalid. Specify
<code>NO</code> If the expression should be evaluatable by itself.
@param errors
If the receiver (or any of its elements) contain syntax errors
this parameter is set to an appropriate value. All items in the
array are <code>NSError</code> instances. This parameter is never
set to an empty array. Pass <code>NULL</code> if you are not
interested in any errors that might occur.
@return A <code>MPParsedExpression</code> instance that represents the
receiver and can be evaluated or <code>nil</code> if an error
occurs. In that case the <code>errors</code> parameter is set to
an array containing at least one <code>NSError</code> instance.
*/
- (MPParsedExpression *)parseExpectingVariable:(BOOL)flag
errors:(NSArray *__autoreleasing *)errors;
@end
/*!
@category MPExpression (MPExpressionConvenience)
@brief This category defines convenience methods for the
<code>MPExpression</code> class.
@discussion All convenience methods are completely defined in terms of other
methods of the <code>MPExpression</code> class.
*/
@interface MPExpression (MPExpressionConvenience)
#pragma mark Querying Expressions
/*!
@methodgroup Querying Expressions
*/
/*!
@method countElements
@brief Returns the number of elements in the receiver.
@return The number of elements in the receiver expressed in the element
reference frame.
*/
- (NSUInteger)countElements;
/*!
@method countSymbols
@brief Returns the number of symbols in the receiver.
@return The number of symbols in the receiver expressed in the symbol
reference frame.
*/
- (NSUInteger)countSymbols;
/*!
@method countTokens
@brief Returns the number of tokens in the receiver.
@return The number of tokens in the receiver expressed in the token
reference frame.
*/
- (NSUInteger)countTokens;
/*!
@method elementAtIndex:
@brief Returns the element at the specified index.
@param anIndex
The index of the element specified in the element reference
frame.
@return The element at <code>anIndex</code>.
*/
- (id<MPExpressionElement>)elementAtIndex:(NSUInteger)anIndex;
/*!
@method symbolAtIndex:
@brief Returns the symbol at the specified index.
@param anIndex
The index of the symbol specified in the symbol reference frame.
@return The symbol at <code>anIndex</code>.
*/
- (id<MPExpressionElement>)symbolAtIndex:(NSUInteger)anIndex;
/*!
@method tokenAtIndex:
@brief Returns the token at the specified index.
@param anIndex
The index of the token specified in the token reference frame.
@return The token at <code>anIndex</code>.
*/
- (id<MPToken>)tokenAtIndex:(NSUInteger)anIndex;
#pragma mark Mutating Expressions
/*!
@methodgroup Mutating Expressions
*/
/*!
@method appendElement:
@brief Appends <code>anElement</code> to the receiver.
@param anElement
The element to append to the receiver.
*/
- (void)appendElement:(id<MPExpressionElement>)anElement;
/*!
@method appendElements:
@brief Appends the objects from <code>elements</code> to the receiver.
@discussion All objects in the <code>elements</code> array must conform to
the <code>MPExpressionElement</code> protocol. If at least one
element does not conform to that protocol a
<code>MPIllegalElementException</code> is raised.
@param elements
The elements to append to the receiver.
*/
- (void)appendElements:(NSArray *)elements;
/*!
@method insertElement:atIndex:referenceFrame:
@brief Inserts <code>anElement</code> at the specified index.
@param anElement
The element to be inserted.
@param index
The index where to insert <code>anElement</code>.
@param referenceFrame
The reference frame <code>index</code> is specified in.
*/
- (void)insertElement:(id<MPExpressionElement>)anElement
atIndex:(NSUInteger)index
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method insertElements:atIndex:referenceFrame:
@brief Inserts <code>elements</code> at the specified index.
@discussion All objects in the <code>elements</code> array must conform to
the <code>MPExpressionElement</code> protocol. If at least one
element does not conform to that protocol a
<code>MPIllegalElementException</code> is raised.
@param elements
The elements to be inserted.
@param index
The index where to insert <code>elements</code>.
@param referenceFrame
The reference frame <code>index</code> is specified in.
*/
- (void)insertElements:(NSArray *)elements
atIndex:(NSUInteger)index
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method deleteElementsInRange:
@brief Removes the elements identified by <code>range</code> from the
receiver.
@discussion If <code>range</code> exceeds the receiver's bounds a
<code>NSRangeException</code> is raised.
@param range
The range of items to remove from the receiver.
@param referenceFrame
The reference frame <code>range</code> is specified in.
*/
- (void)deleteElementsInRange:(NSRange)range
referenceFrame:(MPReferenceFrame)referenceFrame;
@end

View File

@@ -35,7 +35,7 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
@brief Private method. Returns an array containing all tokens from the @brief Private method. Returns an array containing all tokens from the
receiver. receiver.
@return All items in the @c MPTokenReferenceFrame. @return All items in the <code>MPTokenReferenceFrame</code>.
*/ */
- (NSArray *)tokens; - (NSArray *)tokens;
@@ -45,8 +45,8 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
@brief Private method. Checks whether all objects in the specified array @brief Private method. Checks whether all objects in the specified array
are valid expression elements. are valid expression elements.
@discussion If an object is not valid a @c MPIllegalElementException is @discussion If an object is not valid a
raised. <code>MPIllegalElementException</code> is raised.
@param elements @param elements
The array of objects to be validated. The array of objects to be validated.
@@ -65,7 +65,7 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
/*! /*!
@method _replaceSymbolsInRange:withElements: @method _replaceSymbolsInRange:withElements:
@brief Private method. Replaces the symbols in the specified range with @brief Private method. Replaces the symbols in the specified range with
the elements from the @c elements array. the elements from the <code>elements</code> array.
@discussion This is the most primitive mutation method of the @c MPExpression @discussion This is the most primitive mutation method of the @c MPExpression
class. class.
@@ -73,7 +73,7 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
@param range @param range
The range of symbols to be replaced. The range is specified in The range of symbols to be replaced. The range is specified in
the symbol reference frame. If the range exceeds the receiver's the symbol reference frame. If the range exceeds the receiver's
bounds a @c NSRangeException is raised. bounds a <code>NSRangeException</code> is raised.
@param elements @param elements
The elements that should replace the symbols in the specified The elements that should replace the symbols in the specified
@@ -85,14 +85,15 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
/*! /*!
@method _splitElementsAtLocation:insertionIndex: @method _splitElementsAtLocation:insertionIndex:
@brief Splits the receiver's elements at the specified @c location. @brief Splits the receiver's elements at the specified
<code>location</code>.
@discussion The split location can be inside a string element. In that case @discussion The split location can be inside a string element. In that case
the string is replaced with two other smaller strings. the string is replaced with two other smaller strings.
Splitting the elements destroys the receiver's integrity. The Splitting the elements destroys the receiver's integrity. The
receiver of this message must also receive a @c -fixElements receiver of this message must also receive a
message soon afterwards. <code>-fixElements</code> message soon afterwards.
@param location @param location
The index where to split the elements. Specified in the symbol The index where to split the elements. Specified in the symbol
@@ -105,9 +106,9 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
element at the location where the elements were previously element at the location where the elements were previously
splitted. splitted.
@return @c YES if a string element was split into two smaller strings, @c @return @c YES if a string element was split into two smaller strings,
NO if the split @c location corresponds to a location between two <code>NO</code> if the split <code>location</code> corresponds to
elements. a location between two elements.
*/ */
- (BOOL)_splitElementsAtLocation:(NSUInteger)location - (BOOL)_splitElementsAtLocation:(NSUInteger)location
insertionIndex:(NSUInteger *)insertionIndex; insertionIndex:(NSUInteger *)insertionIndex;
@@ -635,26 +636,6 @@ NSString *const MPIllegalElementExceptionElementKey = @"MPIllegalElementExceptio
#pragma mark Evaluating Expressions #pragma mark Evaluating Expressions
- (NSDecimalNumber *)evaluateWithErrors:(NSArray *__autoreleasing *)errors
{
NSArray *parsingErrors;
MPParsedExpression *parsedExpression = [self parse:&parsingErrors];
NSError *evaluationError;
NSDecimalNumber *result = parsedExpression ? [parsedExpression evaluate:&evaluationError] : nil;
if (errors && (parsedExpression || evaluationError)) {
NSMutableArray *localErrors = [[NSMutableArray alloc] initWithCapacity:parsingErrors.count+1];
if (parsingErrors) {
[localErrors addObjectsFromArray:parsingErrors];
}
if (evaluationError) {
[localErrors addObject:evaluationError];
}
*errors = localErrors;
}
return result;
}
- (MPParsedExpression *)parse:(NSArray *__autoreleasing *)errors - (MPParsedExpression *)parse:(NSArray *__autoreleasing *)errors
{ {
return [self parseExpectingVariable:NO return [self parseExpectingVariable:NO

View File

@@ -33,9 +33,11 @@
return [NSIndexSet indexSetWithIndex:0]; return [NSIndexSet indexSetWithIndex:0];
} }
#warning Broken Power Layout
- (NSPoint)offsetOfChildLayoutAtIndex:(NSUInteger)index - (NSPoint)offsetOfChildLayoutAtIndex:(NSUInteger)index
{ {
CGFloat y = (self.baseBounds.size.height + self.baseBounds.origin.y) / 2; NSRect exponentBounds = [self childLayoutAtIndex:0].bounds;
CGFloat y = (self.baseBounds.size.height + self.baseBounds.origin.y) - ((exponentBounds.size.height + exponentBounds.origin.y) / 2);
return NSMakePoint(kPowerFunctionExponentXOffset, y); return NSMakePoint(kPowerFunctionExponentXOffset, y);
} }
@@ -52,13 +54,14 @@
- (NSRect)generateBounds - (NSRect)generateBounds
{ {
NSRect exponentBounds = [self childLayoutAtIndex:0].bounds; NSRect exponentBounds = [self childLayoutAtIndex:0].bounds;
CGFloat y = self.baseBounds.origin.y; CGFloat height = [self offsetOfChildLayoutAtIndex:0].y + exponentBounds.size.height + exponentBounds.origin.y;
CGFloat height = -y + [self offsetOfChildLayoutAtIndex:0].y + exponentBounds.size.height + exponentBounds.origin.y;
CGFloat width = kPowerFunctionExponentXOffset + exponentBounds.size.width + kPowerFunctionTrailingOffset; CGFloat width = kPowerFunctionExponentXOffset + exponentBounds.size.width + kPowerFunctionTrailingOffset;
return NSMakeRect(0, y, width, height); return NSMakeRect(0, 0, width, height);
} }
- (void)draw - (void)draw
{} {
[[NSBezierPath bezierPathWithRect:self.bounds] stroke];
}
@end @end

View File

@@ -8,105 +8,105 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
3B52CEC119BB9FA900CEDCFC /* MathKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; }; 3B52CEC119BB9FA900CEDCFC /* MathKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; };
3B52CEDC19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B52CEDA19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.h */; }; 3B6338351A3A4B5800698BFB /* MPExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338321A3A4B5800698BFB /* MPExpression.h */; };
3B52CEDD19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52CEDB19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.m */; }; 3B6338361A3A4B5800698BFB /* MPExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338331A3A4B5800698BFB /* MPExpression.m */; };
3B591BBB19C58D000061D86B /* MPMathRules.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B591BB919C58D000061D86B /* MPMathRules.h */; }; 3B6338371A3A4B5800698BFB /* MPExpressionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338341A3A4B5800698BFB /* MPExpressionElement.h */; };
3B591BBC19C58D000061D86B /* MPMathRules.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B591BBA19C58D000061D86B /* MPMathRules.m */; }; 3B63383A1A3A4B7600698BFB /* NSString+MPExpressionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338381A3A4B7600698BFB /* NSString+MPExpressionElement.h */; };
3B5FF73B19DB2FF500C8348A /* MPPowerFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5FF73919DB2FF500C8348A /* MPPowerFunction.h */; }; 3B63383B1A3A4B7600698BFB /* NSString+MPExpressionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338391A3A4B7600698BFB /* NSString+MPExpressionElement.m */; };
3B5FF73C19DB2FF500C8348A /* MPPowerFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B5FF73A19DB2FF500C8348A /* MPPowerFunction.m */; }; 3B63383E1A3A4B8500698BFB /* MPToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63383C1A3A4B8500698BFB /* MPToken.h */; };
3B69B66C19DB41B90028E608 /* MPPowerFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B66A19DB41B90028E608 /* MPPowerFunctionLayout.h */; }; 3B63383F1A3A4B8500698BFB /* MPToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63383D1A3A4B8500698BFB /* MPToken.m */; };
3B69B66D19DB41B90028E608 /* MPPowerFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B66B19DB41B90028E608 /* MPPowerFunctionLayout.m */; }; 3B6338421A3A4B9500698BFB /* MPFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338401A3A4B9500698BFB /* MPFunction.h */; };
3B69B67C19E4915E0028E608 /* MPFractionFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B67A19E4915E0028E608 /* MPFractionFunction.h */; }; 3B6338431A3A4B9500698BFB /* MPFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338411A3A4B9500698BFB /* MPFunction.m */; };
3B69B67D19E4915E0028E608 /* MPFractionFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B67B19E4915E0028E608 /* MPFractionFunction.m */; }; 3B6338461A3A4BA500698BFB /* MPExpressionTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338441A3A4BA500698BFB /* MPExpressionTokenizer.h */; };
3B69B68019E493630028E608 /* MPFractionFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B67E19E493630028E608 /* MPFractionFunctionLayout.h */; }; 3B6338471A3A4BA500698BFB /* MPExpressionTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338451A3A4BA500698BFB /* MPExpressionTokenizer.m */; };
3B69B68119E493630028E608 /* MPFractionFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B67F19E493630028E608 /* MPFractionFunctionLayout.m */; }; 3B63384A1A3A4BB300698BFB /* MPFunction+MPToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338481A3A4BB300698BFB /* MPFunction+MPToken.h */; };
3B69B69D19E6F2110028E608 /* MPNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B69B19E6F2110028E608 /* MPNumber.h */; }; 3B63384B1A3A4BB300698BFB /* MPFunction+MPToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338491A3A4BB300698BFB /* MPFunction+MPToken.m */; };
3B69B69E19E6F2110028E608 /* MPNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B69C19E6F2110028E608 /* MPNumber.m */; }; 3B6338501A3A4BD100698BFB /* MPParenthesisFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63384C1A3A4BD100698BFB /* MPParenthesisFunction.h */; };
3B69B6A119E6F2420028E608 /* MPVariable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B69F19E6F2420028E608 /* MPVariable.h */; }; 3B6338511A3A4BD100698BFB /* MPParenthesisFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63384D1A3A4BD100698BFB /* MPParenthesisFunction.m */; };
3B69B6A219E6F2420028E608 /* MPVariable.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B6A019E6F2420028E608 /* MPVariable.m */; }; 3B6338521A3A4BD100698BFB /* MPSumFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63384E1A3A4BD100698BFB /* MPSumFunction.h */; };
3B69B6BD19E948740028E608 /* MPElementaryFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B69B6BB19E948740028E608 /* MPElementaryFunctionTerm.h */; }; 3B6338531A3A4BD100698BFB /* MPSumFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63384F1A3A4BD100698BFB /* MPSumFunction.m */; };
3B69B6BE19E948740028E608 /* MPElementaryFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69B6BC19E948740028E608 /* MPElementaryFunctionTerm.m */; }; 3B6338581A3A4BE800698BFB /* MPFractionFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338541A3A4BE800698BFB /* MPFractionFunction.h */; };
3B6338591A3A4BE800698BFB /* MPFractionFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338551A3A4BE800698BFB /* MPFractionFunction.m */; };
3B63385A1A3A4BE800698BFB /* MPPowerFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338561A3A4BE800698BFB /* MPPowerFunction.h */; };
3B63385B1A3A4BE800698BFB /* MPPowerFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338571A3A4BE800698BFB /* MPPowerFunction.m */; };
3B63385E1A3A4C0700698BFB /* MPExpressionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63385C1A3A4C0700698BFB /* MPExpressionParser.h */; };
3B63385F1A3A4C0700698BFB /* MPExpressionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63385D1A3A4C0700698BFB /* MPExpressionParser.m */; };
3B63386C1A3A4C2B00698BFB /* MPNegatedTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338601A3A4C2B00698BFB /* MPNegatedTerm.h */; };
3B63386D1A3A4C2B00698BFB /* MPNegatedTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338611A3A4C2B00698BFB /* MPNegatedTerm.m */; };
3B63386E1A3A4C2B00698BFB /* MPNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338621A3A4C2B00698BFB /* MPNumber.h */; };
3B63386F1A3A4C2B00698BFB /* MPNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338631A3A4C2B00698BFB /* MPNumber.m */; };
3B6338701A3A4C2B00698BFB /* MPParenthesisTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338641A3A4C2B00698BFB /* MPParenthesisTerm.h */; };
3B6338711A3A4C2B00698BFB /* MPParenthesisTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338651A3A4C2B00698BFB /* MPParenthesisTerm.m */; };
3B6338721A3A4C2B00698BFB /* MPParsedExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338661A3A4C2B00698BFB /* MPParsedExpression.h */; };
3B6338731A3A4C2B00698BFB /* MPParsedExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338671A3A4C2B00698BFB /* MPParsedExpression.m */; };
3B6338741A3A4C2B00698BFB /* MPPowerTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338681A3A4C2B00698BFB /* MPPowerTerm.h */; };
3B6338751A3A4C2B00698BFB /* MPPowerTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338691A3A4C2B00698BFB /* MPPowerTerm.m */; };
3B6338761A3A4C2B00698BFB /* MPProductTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63386A1A3A4C2B00698BFB /* MPProductTerm.h */; };
3B6338771A3A4C2B00698BFB /* MPProductTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63386B1A3A4C2B00698BFB /* MPProductTerm.m */; };
3B63387E1A3A4C7E00698BFB /* MPSumTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338781A3A4C7E00698BFB /* MPSumTerm.h */; };
3B63387F1A3A4C7E00698BFB /* MPSumTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338791A3A4C7E00698BFB /* MPSumTerm.m */; };
3B6338801A3A4C7E00698BFB /* MPTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63387A1A3A4C7E00698BFB /* MPTerm.h */; };
3B6338811A3A4C7E00698BFB /* MPTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63387B1A3A4C7E00698BFB /* MPTerm.m */; };
3B6338821A3A4C7E00698BFB /* MPVariable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63387C1A3A4C7E00698BFB /* MPVariable.h */; };
3B6338831A3A4C7E00698BFB /* MPVariable.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63387D1A3A4C7E00698BFB /* MPVariable.m */; };
3B6338861A3A4CA500698BFB /* MPFactorialTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338841A3A4CA500698BFB /* MPFactorialTerm.h */; };
3B6338871A3A4CA500698BFB /* MPFactorialTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338851A3A4CA500698BFB /* MPFactorialTerm.m */; };
3B63388A1A3A4CAF00698BFB /* MPElementaryFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338881A3A4CAF00698BFB /* MPElementaryFunctionTerm.h */; };
3B63388B1A3A4CAF00698BFB /* MPElementaryFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338891A3A4CAF00698BFB /* MPElementaryFunctionTerm.m */; };
3B63388E1A3A4CBE00698BFB /* MPFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63388C1A3A4CBE00698BFB /* MPFunctionTerm.h */; };
3B63388F1A3A4CBE00698BFB /* MPFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63388D1A3A4CBE00698BFB /* MPFunctionTerm.m */; };
3B6338921A3A4CCA00698BFB /* MPEvaluationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338901A3A4CCA00698BFB /* MPEvaluationContext.h */; };
3B6338931A3A4CCA00698BFB /* MPEvaluationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338911A3A4CCA00698BFB /* MPEvaluationContext.m */; };
3B6338961A3A4CD100698BFB /* MPMathRules.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338941A3A4CD100698BFB /* MPMathRules.h */; };
3B6338971A3A4CD100698BFB /* MPMathRules.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338951A3A4CD100698BFB /* MPMathRules.m */; };
3B63389A1A3A4CE100698BFB /* MPSumFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338981A3A4CE100698BFB /* MPSumFunctionTerm.h */; };
3B63389B1A3A4CE100698BFB /* MPSumFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338991A3A4CE100698BFB /* MPSumFunctionTerm.m */; };
3B63389E1A3A4CEF00698BFB /* MPFractionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B63389C1A3A4CEF00698BFB /* MPFractionTerm.h */; };
3B63389F1A3A4CEF00698BFB /* MPFractionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B63389D1A3A4CEF00698BFB /* MPFractionTerm.m */; };
3B6338A21A3A4CFC00698BFB /* MPRangePath.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338A01A3A4CFC00698BFB /* MPRangePath.h */; };
3B6338A31A3A4CFC00698BFB /* MPRangePath.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338A11A3A4CFC00698BFB /* MPRangePath.m */; };
3B6338A51A3A4D1200698BFB /* Fonts in Resources */ = {isa = PBXBuildFile; fileRef = 3B6338A41A3A4D1200698BFB /* Fonts */; };
3B6338A81A3A4D2600698BFB /* NSIndexPath+MPAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338A61A3A4D2600698BFB /* NSIndexPath+MPAdditions.h */; };
3B6338A91A3A4D2600698BFB /* NSIndexPath+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338A71A3A4D2600698BFB /* NSIndexPath+MPAdditions.m */; };
3B6338AC1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338AA1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.h */; };
3B6338AD1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338AB1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.m */; };
3B6338B01A3A4D6A00698BFB /* MPExpressionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338AE1A3A4D6A00698BFB /* MPExpressionView.h */; };
3B6338B11A3A4D6A00698BFB /* MPExpressionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338AF1A3A4D6A00698BFB /* MPExpressionView.m */; };
3B6338B41A3A4D7900698BFB /* MPExpressionStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338B21A3A4D7900698BFB /* MPExpressionStorage.h */; };
3B6338B51A3A4D7900698BFB /* MPExpressionStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338B31A3A4D7900698BFB /* MPExpressionStorage.m */; };
3B6338BB1A3A4D9400698BFB /* MPFunctionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338B61A3A4D9400698BFB /* MPFunctionsViewController.h */; };
3B6338BC1A3A4D9400698BFB /* MPFunctionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338B71A3A4D9400698BFB /* MPFunctionsViewController.m */; };
3B6338BD1A3A4D9400698BFB /* MPFunctionsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B6338B81A3A4D9400698BFB /* MPFunctionsViewController.xib */; };
3B6338BE1A3A4D9400698BFB /* MPWhiteView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338B91A3A4D9400698BFB /* MPWhiteView.h */; };
3B6338BF1A3A4D9400698BFB /* MPWhiteView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338BA1A3A4D9400698BFB /* MPWhiteView.m */; };
3B6338C21A3A4DA500698BFB /* MPLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338C01A3A4DA500698BFB /* MPLayout.h */; };
3B6338C31A3A4DA500698BFB /* MPLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338C11A3A4DA500698BFB /* MPLayout.m */; };
3B6338C61A3A4DB600698BFB /* MPExpressionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338C41A3A4DB600698BFB /* MPExpressionLayout.h */; };
3B6338C71A3A4DB600698BFB /* MPExpressionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338C51A3A4DB600698BFB /* MPExpressionLayout.m */; };
3B6338CA1A3A4DC400698BFB /* MPFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338C81A3A4DC400698BFB /* MPFunctionLayout.h */; };
3B6338CB1A3A4DC400698BFB /* MPFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338C91A3A4DC400698BFB /* MPFunctionLayout.m */; };
3B6338D41A3A4DE100698BFB /* MPFractionFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338CC1A3A4DE100698BFB /* MPFractionFunctionLayout.h */; };
3B6338D51A3A4DE100698BFB /* MPFractionFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338CD1A3A4DE100698BFB /* MPFractionFunctionLayout.m */; };
3B6338D61A3A4DE100698BFB /* MPParenthesisFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338CE1A3A4DE100698BFB /* MPParenthesisFunctionLayout.h */; };
3B6338D71A3A4DE100698BFB /* MPParenthesisFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338CF1A3A4DE100698BFB /* MPParenthesisFunctionLayout.m */; };
3B6338D81A3A4DE100698BFB /* MPPowerFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338D01A3A4DE100698BFB /* MPPowerFunctionLayout.h */; };
3B6338D91A3A4DE100698BFB /* MPPowerFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338D11A3A4DE100698BFB /* MPPowerFunctionLayout.m */; };
3B6338DA1A3A4DE100698BFB /* MPSumFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6338D21A3A4DE100698BFB /* MPSumFunctionLayout.h */; };
3B6338DB1A3A4DE100698BFB /* MPSumFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6338D31A3A4DE100698BFB /* MPSumFunctionLayout.m */; };
3B7172EA19C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */; }; 3B7172EA19C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */; };
3B7172EB19C7147000FEAA5B /* FunctionsButtonDisclosure.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */; }; 3B7172EB19C7147000FEAA5B /* FunctionsButtonDisclosure.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */; };
3B7172EE19C9FA8E00FEAA5B /* MPParenthesisFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7172EC19C9FA8E00FEAA5B /* MPParenthesisFunction.h */; };
3B7172EF19C9FA8E00FEAA5B /* MPParenthesisFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7172ED19C9FA8E00FEAA5B /* MPParenthesisFunction.m */; };
3B7172F219C9FC6700FEAA5B /* MPParenthesisFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7172F019C9FC6700FEAA5B /* MPParenthesisFunctionLayout.h */; };
3B7172F319C9FC6700FEAA5B /* MPParenthesisFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7172F119C9FC6700FEAA5B /* MPParenthesisFunctionLayout.m */; };
3B74BFB319A4C51800E5B5DE /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B74BFB219A4C51800E5B5DE /* CoreText.framework */; }; 3B74BFB319A4C51800E5B5DE /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B74BFB219A4C51800E5B5DE /* CoreText.framework */; };
3B78C85419C2DA5300516335 /* MPEvaluationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B78C85219C2DA5300516335 /* MPEvaluationContext.h */; };
3B78C85519C2DA5300516335 /* MPEvaluationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B78C85319C2DA5300516335 /* MPEvaluationContext.m */; };
3B7B3A1819CC44E4005849E5 /* MPExpressionTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7B3A1619CC44E4005849E5 /* MPExpressionTokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; };
3B7B3A1919CC44E4005849E5 /* MPExpressionTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7B3A1719CC44E4005849E5 /* MPExpressionTokenizer.m */; };
3B7B3A2C19CC467E005849E5 /* MPToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7B3A2A19CC467E005849E5 /* MPToken.h */; };
3B7B3A2D19CC467E005849E5 /* MPToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7B3A2B19CC467E005849E5 /* MPToken.m */; };
3B7B3A5419CC50B1005849E5 /* MPFunction+MPToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7B3A5219CC50B1005849E5 /* MPFunction+MPToken.h */; };
3B7B3A5519CC50B1005849E5 /* MPFunction+MPToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7B3A5319CC50B1005849E5 /* MPFunction+MPToken.m */; };
3B85830E19BB5E5500D76A8D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; }; 3B85830E19BB5E5500D76A8D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; };
3B85831419BB5E5500D76A8D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B85831219BB5E5500D76A8D /* InfoPlist.strings */; }; 3B85831419BB5E5500D76A8D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B85831219BB5E5500D76A8D /* InfoPlist.strings */; };
3B85831E19BB5E5500D76A8D /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9979018DE623E009CF6C4 /* XCTest.framework */; }; 3B85831E19BB5E5500D76A8D /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9979018DE623E009CF6C4 /* XCTest.framework */; };
3B85831F19BB5E5500D76A8D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; }; 3B85831F19BB5E5500D76A8D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; };
3B85832219BB5E5500D76A8D /* MathKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; }; 3B85832219BB5E5500D76A8D /* MathKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; };
3B85832819BB5E5500D76A8D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B85832619BB5E5500D76A8D /* InfoPlist.strings */; }; 3B85832819BB5E5500D76A8D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B85832619BB5E5500D76A8D /* InfoPlist.strings */; };
3B85833819BB63BD00D76A8D /* MPExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BFAC38D1997B61300B3EF67 /* MPExpression.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85833919BB63C500D76A8D /* MPExpressionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BFAC3961997B67400B3EF67 /* MPExpressionElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85833A19BB63D400D76A8D /* MPFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B87E35E19009D5F00259938 /* MPFunction.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834119BB651E00D76A8D /* MPRangePath.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B87E35B1900933200259938 /* MPRangePath.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834319BB653700D76A8D /* MPSumFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB09EC71906FD830080A5ED /* MPSumFunction.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834419BB654D00D76A8D /* NSString+MPExpressionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BFAC39A1997BC7600B3EF67 /* NSString+MPExpressionElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834519BB655200D76A8D /* NSIndexPath+MPAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB09EDC190728220080A5ED /* NSIndexPath+MPAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834619BB655C00D76A8D /* MPExpressionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B87E3541900856F00259938 /* MPExpressionView.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834719BB655F00D76A8D /* MPExpressionStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB09EB01905DE500080A5ED /* MPExpressionStorage.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B85834819BB65B600D76A8D /* MPLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B528D0D199417740054DB5F /* MPLayout.h */; };
3B85834919BB65B600D76A8D /* MPExpressionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B528D0E199417E10054DB5F /* MPExpressionLayout.h */; };
3B85834A19BB65B600D76A8D /* MPFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B528D11199417E90054DB5F /* MPFunctionLayout.h */; };
3B85834B19BB65B600D76A8D /* MPSumFunctionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB09EDF190736160080A5ED /* MPSumFunctionLayout.h */; };
3B85834C19BB661100D76A8D /* MathKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B85833219BB5F2D00D76A8D /* MathKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3B85834C19BB661100D76A8D /* MathKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B85833219BB5F2D00D76A8D /* MathKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
3B9265C71A2147DF00AD2809 /* MPNegatedTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B9265C51A2147DF00AD2809 /* MPNegatedTerm.h */; };
3B9265C81A2147DF00AD2809 /* MPNegatedTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9265C61A2147DF00AD2809 /* MPNegatedTerm.m */; };
3BBEA92C19BB680B00133766 /* MathKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 3BBEA92C19BB680B00133766 /* MathKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3B85830D19BB5E5500D76A8D /* MathKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
3BBEA93519BB79A700133766 /* MPExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFAC38E1997B61300B3EF67 /* MPExpression.m */; };
3BBEA93619BB79A700133766 /* MPFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B87E35F19009D5F00259938 /* MPFunction.m */; };
3BBEA93A19BB79A700133766 /* MPSumFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB09EC81906FD830080A5ED /* MPSumFunction.m */; };
3BBEA93B19BB79A700133766 /* MPRangePath.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B87E35C1900933200259938 /* MPRangePath.m */; };
3BBEA93D19BB79A700133766 /* NSString+MPExpressionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFAC39B1997BC7600B3EF67 /* NSString+MPExpressionElement.m */; };
3BBEA93E19BB79A700133766 /* NSIndexPath+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB09EDD190728220080A5ED /* NSIndexPath+MPAdditions.m */; };
3BBEA93F19BB79A700133766 /* MPExpressionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B87E3551900856F00259938 /* MPExpressionView.m */; };
3BBEA94019BB79A700133766 /* MPExpressionStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB09EB11905DE500080A5ED /* MPExpressionStorage.m */; };
3BBEA94119BB79A700133766 /* MPLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B688D9819982DF50006B4AB /* MPLayout.m */; };
3BBEA94219BB79A700133766 /* MPExpressionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B528D0F199417E10054DB5F /* MPExpressionLayout.m */; };
3BBEA94319BB79A700133766 /* MPFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B528D12199417E90054DB5F /* MPFunctionLayout.m */; };
3BBEA94419BB79A700133766 /* MPSumFunctionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB09EE0190736160080A5ED /* MPSumFunctionLayout.m */; };
3BBEA94F19BB79EF00133766 /* MPExpressionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B0F69AB1902A82C00817707 /* MPExpressionTests.m */; }; 3BBEA94F19BB79EF00133766 /* MPExpressionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B0F69AB1902A82C00817707 /* MPExpressionTests.m */; };
3BBEA95019BB79EF00133766 /* MPRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBBA3941905704200824E74 /* MPRangeTests.m */; }; 3BBEA95019BB79EF00133766 /* MPRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBBA3941905704200824E74 /* MPRangeTests.m */; };
3BC4660B19B2425A0033F13A /* MPDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BF9978318DE623E009CF6C4 /* MPDocument.xib */; }; 3BC4660B19B2425A0033F13A /* MPDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BF9978318DE623E009CF6C4 /* MPDocument.xib */; };
3BC4661419B245C60033F13A /* Fonts in Resources */ = {isa = PBXBuildFile; fileRef = 3BC4661319B245C60033F13A /* Fonts */; };
3BCA0C801A12619500C9E3E0 /* MPTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCA0C7E1A12619500C9E3E0 /* MPTerm.h */; };
3BCA0C811A12619500C9E3E0 /* MPTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BCA0C7F1A12619500C9E3E0 /* MPTerm.m */; };
3BCA0C851A1405C000C9E3E0 /* MPFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCA0C831A1405C000C9E3E0 /* MPFunctionTerm.h */; };
3BCA0C861A1405C000C9E3E0 /* MPFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BCA0C841A1405C000C9E3E0 /* MPFunctionTerm.m */; };
3BEFF74D1A16A4DA00301C0C /* MPSumTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF74B1A16A4DA00301C0C /* MPSumTerm.h */; };
3BEFF74E1A16A4DA00301C0C /* MPSumTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF74C1A16A4DA00301C0C /* MPSumTerm.m */; };
3BEFF7511A16B06600301C0C /* MPParsedExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF74F1A16B06600301C0C /* MPParsedExpression.h */; };
3BEFF7521A16B06600301C0C /* MPParsedExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7501A16B06600301C0C /* MPParsedExpression.m */; };
3BEFF7551A17AA3200301C0C /* MPProductTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF7531A17AA3200301C0C /* MPProductTerm.h */; };
3BEFF7561A17AA3200301C0C /* MPProductTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7541A17AA3200301C0C /* MPProductTerm.m */; };
3BEFF7621A1804AF00301C0C /* MPFactorialTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF7601A1804AF00301C0C /* MPFactorialTerm.h */; };
3BEFF7631A1804AF00301C0C /* MPFactorialTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7611A1804AF00301C0C /* MPFactorialTerm.m */; };
3BEFF7661A18066300301C0C /* MPSumFunctionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF7641A18066300301C0C /* MPSumFunctionTerm.h */; };
3BEFF7671A18066300301C0C /* MPSumFunctionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7651A18066300301C0C /* MPSumFunctionTerm.m */; };
3BEFF76A1A1807B000301C0C /* MPParenthesisTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF7681A1807B000301C0C /* MPParenthesisTerm.h */; };
3BEFF76B1A1807B000301C0C /* MPParenthesisTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7691A1807B000301C0C /* MPParenthesisTerm.m */; };
3BEFF76E1A18083C00301C0C /* MPPowerTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF76C1A18083C00301C0C /* MPPowerTerm.h */; };
3BEFF76F1A18083C00301C0C /* MPPowerTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF76D1A18083C00301C0C /* MPPowerTerm.m */; };
3BEFF7721A180C8800301C0C /* MPFractionTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEFF7701A180C8800301C0C /* MPFractionTerm.h */; };
3BEFF7731A180C8800301C0C /* MPFractionTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEFF7711A180C8800301C0C /* MPFractionTerm.m */; };
3BF54BB91A18D08400883BFA /* MPExpressionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF54BB71A18D08400883BFA /* MPExpressionParser.h */; };
3BF54BBA1A18D08400883BFA /* MPExpressionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF54BB81A18D08400883BFA /* MPExpressionParser.m */; };
3BF59AFE19D80ECC00E54292 /* MPFunctionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF59AFB19D80ECC00E54292 /* MPFunctionsViewController.h */; };
3BF59AFF19D80ECC00E54292 /* MPFunctionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF59AFC19D80ECC00E54292 /* MPFunctionsViewController.m */; };
3BF59B0019D80ECC00E54292 /* MPFunctionsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BF59AFD19D80ECC00E54292 /* MPFunctionsViewController.xib */; };
3BF59B0319D81EE600E54292 /* MPWhiteView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF59B0119D81EE600E54292 /* MPWhiteView.h */; };
3BF59B0419D81EE600E54292 /* MPWhiteView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF59B0219D81EE600E54292 /* MPWhiteView.m */; };
3BF9976F18DE623E009CF6C4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; }; 3BF9976F18DE623E009CF6C4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */; };
3BF9977918DE623E009CF6C4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3BF9977718DE623E009CF6C4 /* InfoPlist.strings */; }; 3BF9977918DE623E009CF6C4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3BF9977718DE623E009CF6C4 /* InfoPlist.strings */; };
3BF9977B18DE623E009CF6C4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF9977A18DE623E009CF6C4 /* main.m */; }; 3BF9977B18DE623E009CF6C4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF9977A18DE623E009CF6C4 /* main.m */; };
@@ -158,45 +158,94 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
3B0F69AB1902A82C00817707 /* MPExpressionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionTests.m; path = ../MathPadTests/MPExpressionTests.m; sourceTree = "<group>"; }; 3B0F69AB1902A82C00817707 /* MPExpressionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionTests.m; path = ../MathPadTests/MPExpressionTests.m; sourceTree = "<group>"; };
3B528D0D199417740054DB5F /* MPLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPLayout.h; sourceTree = "<group>"; }; 3B6338321A3A4B5800698BFB /* MPExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpression.h; path = MathKit/MPExpression.h; sourceTree = SOURCE_ROOT; };
3B528D0E199417E10054DB5F /* MPExpressionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpressionLayout.h; sourceTree = "<group>"; }; 3B6338331A3A4B5800698BFB /* MPExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpression.m; path = MathKit/MPExpression.m; sourceTree = SOURCE_ROOT; };
3B528D0F199417E10054DB5F /* MPExpressionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpressionLayout.m; sourceTree = "<group>"; }; 3B6338341A3A4B5800698BFB /* MPExpressionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionElement.h; path = MathKit/MPExpressionElement.h; sourceTree = SOURCE_ROOT; };
3B528D11199417E90054DB5F /* MPFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFunctionLayout.h; sourceTree = "<group>"; }; 3B6338381A3A4B7600698BFB /* NSString+MPExpressionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+MPExpressionElement.h"; path = "MathKit/NSString+MPExpressionElement.h"; sourceTree = SOURCE_ROOT; };
3B528D12199417E90054DB5F /* MPFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFunctionLayout.m; sourceTree = "<group>"; }; 3B6338391A3A4B7600698BFB /* NSString+MPExpressionElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+MPExpressionElement.m"; path = "MathKit/NSString+MPExpressionElement.m"; sourceTree = SOURCE_ROOT; };
3B52CEDA19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSRegularExpression+MPParsingAdditions.h"; sourceTree = "<group>"; }; 3B63383C1A3A4B8500698BFB /* MPToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPToken.h; path = MathKit/MPToken.h; sourceTree = SOURCE_ROOT; };
3B52CEDB19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSRegularExpression+MPParsingAdditions.m"; sourceTree = "<group>"; }; 3B63383D1A3A4B8500698BFB /* MPToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPToken.m; path = MathKit/MPToken.m; sourceTree = SOURCE_ROOT; };
3B591BB919C58D000061D86B /* MPMathRules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPMathRules.h; sourceTree = "<group>"; }; 3B6338401A3A4B9500698BFB /* MPFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFunction.h; path = MathKit/MPFunction.h; sourceTree = SOURCE_ROOT; };
3B591BBA19C58D000061D86B /* MPMathRules.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMathRules.m; sourceTree = "<group>"; }; 3B6338411A3A4B9500698BFB /* MPFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFunction.m; path = MathKit/MPFunction.m; sourceTree = SOURCE_ROOT; };
3B5FF73919DB2FF500C8348A /* MPPowerFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPowerFunction.h; sourceTree = "<group>"; }; 3B6338441A3A4BA500698BFB /* MPExpressionTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionTokenizer.h; path = MathKit/MPExpressionTokenizer.h; sourceTree = SOURCE_ROOT; };
3B5FF73A19DB2FF500C8348A /* MPPowerFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPowerFunction.m; sourceTree = "<group>"; }; 3B6338451A3A4BA500698BFB /* MPExpressionTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionTokenizer.m; path = MathKit/MPExpressionTokenizer.m; sourceTree = SOURCE_ROOT; };
3B688D9819982DF50006B4AB /* MPLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLayout.m; sourceTree = "<group>"; }; 3B6338481A3A4BB300698BFB /* MPFunction+MPToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MPFunction+MPToken.h"; path = "MathKit/MPFunction+MPToken.h"; sourceTree = SOURCE_ROOT; };
3B69B66A19DB41B90028E608 /* MPPowerFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPowerFunctionLayout.h; sourceTree = "<group>"; }; 3B6338491A3A4BB300698BFB /* MPFunction+MPToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MPFunction+MPToken.m"; path = "MathKit/MPFunction+MPToken.m"; sourceTree = SOURCE_ROOT; };
3B69B66B19DB41B90028E608 /* MPPowerFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPowerFunctionLayout.m; sourceTree = "<group>"; }; 3B63384C1A3A4BD100698BFB /* MPParenthesisFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPParenthesisFunction.h; path = MathKit/MPParenthesisFunction.h; sourceTree = SOURCE_ROOT; };
3B69B67A19E4915E0028E608 /* MPFractionFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFractionFunction.h; sourceTree = "<group>"; }; 3B63384D1A3A4BD100698BFB /* MPParenthesisFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPParenthesisFunction.m; path = MathKit/MPParenthesisFunction.m; sourceTree = SOURCE_ROOT; };
3B69B67B19E4915E0028E608 /* MPFractionFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFractionFunction.m; sourceTree = "<group>"; }; 3B63384E1A3A4BD100698BFB /* MPSumFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPSumFunction.h; path = MathKit/MPSumFunction.h; sourceTree = SOURCE_ROOT; };
3B69B67E19E493630028E608 /* MPFractionFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFractionFunctionLayout.h; sourceTree = "<group>"; }; 3B63384F1A3A4BD100698BFB /* MPSumFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPSumFunction.m; path = MathKit/MPSumFunction.m; sourceTree = SOURCE_ROOT; };
3B69B67F19E493630028E608 /* MPFractionFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFractionFunctionLayout.m; sourceTree = "<group>"; }; 3B6338541A3A4BE800698BFB /* MPFractionFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFractionFunction.h; path = MathKit/MPFractionFunction.h; sourceTree = SOURCE_ROOT; };
3B69B69B19E6F2110028E608 /* MPNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNumber.h; sourceTree = "<group>"; }; 3B6338551A3A4BE800698BFB /* MPFractionFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFractionFunction.m; path = MathKit/MPFractionFunction.m; sourceTree = SOURCE_ROOT; };
3B69B69C19E6F2110028E608 /* MPNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNumber.m; sourceTree = "<group>"; }; 3B6338561A3A4BE800698BFB /* MPPowerFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPPowerFunction.h; path = MathKit/MPPowerFunction.h; sourceTree = SOURCE_ROOT; };
3B69B69F19E6F2420028E608 /* MPVariable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPVariable.h; sourceTree = "<group>"; }; 3B6338571A3A4BE800698BFB /* MPPowerFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPPowerFunction.m; path = MathKit/MPPowerFunction.m; sourceTree = SOURCE_ROOT; };
3B69B6A019E6F2420028E608 /* MPVariable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPVariable.m; sourceTree = "<group>"; }; 3B63385C1A3A4C0700698BFB /* MPExpressionParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionParser.h; path = MathKit/MPExpressionParser.h; sourceTree = SOURCE_ROOT; };
3B69B6BB19E948740028E608 /* MPElementaryFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPElementaryFunctionTerm.h; sourceTree = "<group>"; }; 3B63385D1A3A4C0700698BFB /* MPExpressionParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionParser.m; path = MathKit/MPExpressionParser.m; sourceTree = SOURCE_ROOT; };
3B69B6BC19E948740028E608 /* MPElementaryFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPElementaryFunctionTerm.m; sourceTree = "<group>"; }; 3B6338601A3A4C2B00698BFB /* MPNegatedTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPNegatedTerm.h; path = MathKit/MPNegatedTerm.h; sourceTree = SOURCE_ROOT; };
3B6338611A3A4C2B00698BFB /* MPNegatedTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPNegatedTerm.m; path = MathKit/MPNegatedTerm.m; sourceTree = SOURCE_ROOT; };
3B6338621A3A4C2B00698BFB /* MPNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPNumber.h; path = MathKit/MPNumber.h; sourceTree = SOURCE_ROOT; };
3B6338631A3A4C2B00698BFB /* MPNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPNumber.m; path = MathKit/MPNumber.m; sourceTree = SOURCE_ROOT; };
3B6338641A3A4C2B00698BFB /* MPParenthesisTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPParenthesisTerm.h; path = MathKit/MPParenthesisTerm.h; sourceTree = SOURCE_ROOT; };
3B6338651A3A4C2B00698BFB /* MPParenthesisTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPParenthesisTerm.m; path = MathKit/MPParenthesisTerm.m; sourceTree = SOURCE_ROOT; };
3B6338661A3A4C2B00698BFB /* MPParsedExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPParsedExpression.h; path = MathKit/MPParsedExpression.h; sourceTree = SOURCE_ROOT; };
3B6338671A3A4C2B00698BFB /* MPParsedExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPParsedExpression.m; path = MathKit/MPParsedExpression.m; sourceTree = SOURCE_ROOT; };
3B6338681A3A4C2B00698BFB /* MPPowerTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPPowerTerm.h; path = MathKit/MPPowerTerm.h; sourceTree = SOURCE_ROOT; };
3B6338691A3A4C2B00698BFB /* MPPowerTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPPowerTerm.m; path = MathKit/MPPowerTerm.m; sourceTree = SOURCE_ROOT; };
3B63386A1A3A4C2B00698BFB /* MPProductTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPProductTerm.h; path = MathKit/MPProductTerm.h; sourceTree = SOURCE_ROOT; };
3B63386B1A3A4C2B00698BFB /* MPProductTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPProductTerm.m; path = MathKit/MPProductTerm.m; sourceTree = SOURCE_ROOT; };
3B6338781A3A4C7E00698BFB /* MPSumTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPSumTerm.h; path = MathKit/MPSumTerm.h; sourceTree = SOURCE_ROOT; };
3B6338791A3A4C7E00698BFB /* MPSumTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPSumTerm.m; path = MathKit/MPSumTerm.m; sourceTree = SOURCE_ROOT; };
3B63387A1A3A4C7E00698BFB /* MPTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPTerm.h; path = MathKit/MPTerm.h; sourceTree = SOURCE_ROOT; };
3B63387B1A3A4C7E00698BFB /* MPTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPTerm.m; path = MathKit/MPTerm.m; sourceTree = SOURCE_ROOT; };
3B63387C1A3A4C7E00698BFB /* MPVariable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPVariable.h; path = MathKit/MPVariable.h; sourceTree = SOURCE_ROOT; };
3B63387D1A3A4C7E00698BFB /* MPVariable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPVariable.m; path = MathKit/MPVariable.m; sourceTree = SOURCE_ROOT; };
3B6338841A3A4CA500698BFB /* MPFactorialTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFactorialTerm.h; path = MathKit/MPFactorialTerm.h; sourceTree = SOURCE_ROOT; };
3B6338851A3A4CA500698BFB /* MPFactorialTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFactorialTerm.m; path = MathKit/MPFactorialTerm.m; sourceTree = SOURCE_ROOT; };
3B6338881A3A4CAF00698BFB /* MPElementaryFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPElementaryFunctionTerm.h; path = MathKit/MPElementaryFunctionTerm.h; sourceTree = SOURCE_ROOT; };
3B6338891A3A4CAF00698BFB /* MPElementaryFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPElementaryFunctionTerm.m; path = MathKit/MPElementaryFunctionTerm.m; sourceTree = SOURCE_ROOT; };
3B63388C1A3A4CBE00698BFB /* MPFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFunctionTerm.h; path = MathKit/MPFunctionTerm.h; sourceTree = SOURCE_ROOT; };
3B63388D1A3A4CBE00698BFB /* MPFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFunctionTerm.m; path = MathKit/MPFunctionTerm.m; sourceTree = SOURCE_ROOT; };
3B6338901A3A4CCA00698BFB /* MPEvaluationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPEvaluationContext.h; path = MathKit/MPEvaluationContext.h; sourceTree = SOURCE_ROOT; };
3B6338911A3A4CCA00698BFB /* MPEvaluationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPEvaluationContext.m; path = MathKit/MPEvaluationContext.m; sourceTree = SOURCE_ROOT; };
3B6338941A3A4CD100698BFB /* MPMathRules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPMathRules.h; path = MathKit/MPMathRules.h; sourceTree = SOURCE_ROOT; };
3B6338951A3A4CD100698BFB /* MPMathRules.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPMathRules.m; path = MathKit/MPMathRules.m; sourceTree = SOURCE_ROOT; };
3B6338981A3A4CE100698BFB /* MPSumFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPSumFunctionTerm.h; path = MathKit/MPSumFunctionTerm.h; sourceTree = SOURCE_ROOT; };
3B6338991A3A4CE100698BFB /* MPSumFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPSumFunctionTerm.m; path = MathKit/MPSumFunctionTerm.m; sourceTree = SOURCE_ROOT; };
3B63389C1A3A4CEF00698BFB /* MPFractionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFractionTerm.h; path = MathKit/MPFractionTerm.h; sourceTree = SOURCE_ROOT; };
3B63389D1A3A4CEF00698BFB /* MPFractionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFractionTerm.m; path = MathKit/MPFractionTerm.m; sourceTree = SOURCE_ROOT; };
3B6338A01A3A4CFC00698BFB /* MPRangePath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPRangePath.h; path = MathKit/MPRangePath.h; sourceTree = SOURCE_ROOT; };
3B6338A11A3A4CFC00698BFB /* MPRangePath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPRangePath.m; path = MathKit/MPRangePath.m; sourceTree = SOURCE_ROOT; };
3B6338A41A3A4D1200698BFB /* Fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Fonts; sourceTree = "<group>"; };
3B6338A61A3A4D2600698BFB /* NSIndexPath+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSIndexPath+MPAdditions.h"; path = "MathKit/NSIndexPath+MPAdditions.h"; sourceTree = SOURCE_ROOT; };
3B6338A71A3A4D2600698BFB /* NSIndexPath+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSIndexPath+MPAdditions.m"; path = "MathKit/NSIndexPath+MPAdditions.m"; sourceTree = SOURCE_ROOT; };
3B6338AA1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSRegularExpression+MPParsingAdditions.h"; path = "MathKit/NSRegularExpression+MPParsingAdditions.h"; sourceTree = SOURCE_ROOT; };
3B6338AB1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSRegularExpression+MPParsingAdditions.m"; path = "MathKit/NSRegularExpression+MPParsingAdditions.m"; sourceTree = SOURCE_ROOT; };
3B6338AE1A3A4D6A00698BFB /* MPExpressionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpressionView.h; sourceTree = "<group>"; };
3B6338AF1A3A4D6A00698BFB /* MPExpressionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpressionView.m; sourceTree = "<group>"; };
3B6338B21A3A4D7900698BFB /* MPExpressionStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpressionStorage.h; sourceTree = "<group>"; };
3B6338B31A3A4D7900698BFB /* MPExpressionStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpressionStorage.m; sourceTree = "<group>"; };
3B6338B61A3A4D9400698BFB /* MPFunctionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFunctionsViewController.h; path = MathKit/MPFunctionsViewController.h; sourceTree = SOURCE_ROOT; };
3B6338B71A3A4D9400698BFB /* MPFunctionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFunctionsViewController.m; path = MathKit/MPFunctionsViewController.m; sourceTree = SOURCE_ROOT; };
3B6338B81A3A4D9400698BFB /* MPFunctionsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MPFunctionsViewController.xib; path = MathKit/MPFunctionsViewController.xib; sourceTree = SOURCE_ROOT; };
3B6338B91A3A4D9400698BFB /* MPWhiteView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPWhiteView.h; path = MathKit/MPWhiteView.h; sourceTree = SOURCE_ROOT; };
3B6338BA1A3A4D9400698BFB /* MPWhiteView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPWhiteView.m; path = MathKit/MPWhiteView.m; sourceTree = SOURCE_ROOT; };
3B6338C01A3A4DA500698BFB /* MPLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPLayout.h; path = MathKit/MPLayout.h; sourceTree = SOURCE_ROOT; };
3B6338C11A3A4DA500698BFB /* MPLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPLayout.m; path = MathKit/MPLayout.m; sourceTree = SOURCE_ROOT; };
3B6338C41A3A4DB600698BFB /* MPExpressionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionLayout.h; path = MathKit/MPExpressionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338C51A3A4DB600698BFB /* MPExpressionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionLayout.m; path = MathKit/MPExpressionLayout.m; sourceTree = SOURCE_ROOT; };
3B6338C81A3A4DC400698BFB /* MPFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFunctionLayout.h; path = MathKit/MPFunctionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338C91A3A4DC400698BFB /* MPFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFunctionLayout.m; path = MathKit/MPFunctionLayout.m; sourceTree = SOURCE_ROOT; };
3B6338CC1A3A4DE100698BFB /* MPFractionFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPFractionFunctionLayout.h; path = MathKit/MPFractionFunctionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338CD1A3A4DE100698BFB /* MPFractionFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPFractionFunctionLayout.m; path = MathKit/MPFractionFunctionLayout.m; sourceTree = SOURCE_ROOT; };
3B6338CE1A3A4DE100698BFB /* MPParenthesisFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPParenthesisFunctionLayout.h; path = MathKit/MPParenthesisFunctionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338CF1A3A4DE100698BFB /* MPParenthesisFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPParenthesisFunctionLayout.m; path = MathKit/MPParenthesisFunctionLayout.m; sourceTree = SOURCE_ROOT; };
3B6338D01A3A4DE100698BFB /* MPPowerFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPPowerFunctionLayout.h; path = MathKit/MPPowerFunctionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338D11A3A4DE100698BFB /* MPPowerFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPPowerFunctionLayout.m; path = MathKit/MPPowerFunctionLayout.m; sourceTree = SOURCE_ROOT; };
3B6338D21A3A4DE100698BFB /* MPSumFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPSumFunctionLayout.h; path = MathKit/MPSumFunctionLayout.h; sourceTree = SOURCE_ROOT; };
3B6338D31A3A4DE100698BFB /* MPSumFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPSumFunctionLayout.m; path = MathKit/MPSumFunctionLayout.m; sourceTree = SOURCE_ROOT; };
3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "FunctionsButtonDisclosure@2x.png"; sourceTree = "<group>"; }; 3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "FunctionsButtonDisclosure@2x.png"; sourceTree = "<group>"; };
3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FunctionsButtonDisclosure.png; sourceTree = "<group>"; }; 3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FunctionsButtonDisclosure.png; sourceTree = "<group>"; };
3B7172EC19C9FA8E00FEAA5B /* MPParenthesisFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPParenthesisFunction.h; sourceTree = "<group>"; };
3B7172ED19C9FA8E00FEAA5B /* MPParenthesisFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPParenthesisFunction.m; sourceTree = "<group>"; };
3B7172F019C9FC6700FEAA5B /* MPParenthesisFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPParenthesisFunctionLayout.h; sourceTree = "<group>"; };
3B7172F119C9FC6700FEAA5B /* MPParenthesisFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPParenthesisFunctionLayout.m; sourceTree = "<group>"; };
3B74BFB219A4C51800E5B5DE /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 3B74BFB219A4C51800E5B5DE /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
3B78C85219C2DA5300516335 /* MPEvaluationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEvaluationContext.h; sourceTree = "<group>"; };
3B78C85319C2DA5300516335 /* MPEvaluationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEvaluationContext.m; sourceTree = "<group>"; };
3B7B3A1619CC44E4005849E5 /* MPExpressionTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpressionTokenizer.h; sourceTree = "<group>"; };
3B7B3A1719CC44E4005849E5 /* MPExpressionTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpressionTokenizer.m; sourceTree = "<group>"; };
3B7B3A2A19CC467E005849E5 /* MPToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToken.h; sourceTree = "<group>"; };
3B7B3A2B19CC467E005849E5 /* MPToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToken.m; sourceTree = "<group>"; };
3B7B3A5219CC50B1005849E5 /* MPFunction+MPToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MPFunction+MPToken.h"; sourceTree = "<group>"; };
3B7B3A5319CC50B1005849E5 /* MPFunction+MPToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MPFunction+MPToken.m"; sourceTree = "<group>"; };
3B85830D19BB5E5500D76A8D /* MathKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MathKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B85830D19BB5E5500D76A8D /* MathKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MathKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3B85831119BB5E5500D76A8D /* MathKit-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathKit-Info.plist"; sourceTree = "<group>"; }; 3B85831119BB5E5500D76A8D /* MathKit-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathKit-Info.plist"; sourceTree = "<group>"; };
3B85831319BB5E5500D76A8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3B85831319BB5E5500D76A8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -205,53 +254,9 @@
3B85832519BB5E5500D76A8D /* MathKitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathKitTests-Info.plist"; sourceTree = "<group>"; }; 3B85832519BB5E5500D76A8D /* MathKitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathKitTests-Info.plist"; sourceTree = "<group>"; };
3B85832719BB5E5500D76A8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3B85832719BB5E5500D76A8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3B85833219BB5F2D00D76A8D /* MathKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MathKit.h; sourceTree = "<group>"; }; 3B85833219BB5F2D00D76A8D /* MathKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MathKit.h; sourceTree = "<group>"; };
3B87E3541900856F00259938 /* MPExpressionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionView.h; path = ../MathPad/MPExpressionView.h; sourceTree = "<group>"; };
3B87E3551900856F00259938 /* MPExpressionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionView.m; path = ../MathPad/MPExpressionView.m; sourceTree = "<group>"; };
3B87E35B1900933200259938 /* MPRangePath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPRangePath.h; sourceTree = "<group>"; };
3B87E35C1900933200259938 /* MPRangePath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPRangePath.m; sourceTree = "<group>"; };
3B87E35E19009D5F00259938 /* MPFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFunction.h; sourceTree = "<group>"; };
3B87E35F19009D5F00259938 /* MPFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFunction.m; sourceTree = "<group>"; };
3B9265C51A2147DF00AD2809 /* MPNegatedTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNegatedTerm.h; sourceTree = "<group>"; };
3B9265C61A2147DF00AD2809 /* MPNegatedTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNegatedTerm.m; sourceTree = "<group>"; };
3BB09EB01905DE500080A5ED /* MPExpressionStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MPExpressionStorage.h; path = ../MathPad/MPExpressionStorage.h; sourceTree = "<group>"; };
3BB09EB11905DE500080A5ED /* MPExpressionStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPExpressionStorage.m; path = ../MathPad/MPExpressionStorage.m; sourceTree = "<group>"; };
3BB09EC71906FD830080A5ED /* MPSumFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSumFunction.h; sourceTree = "<group>"; };
3BB09EC81906FD830080A5ED /* MPSumFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSumFunction.m; sourceTree = "<group>"; };
3BB09EDC190728220080A5ED /* NSIndexPath+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSIndexPath+MPAdditions.h"; sourceTree = "<group>"; };
3BB09EDD190728220080A5ED /* NSIndexPath+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSIndexPath+MPAdditions.m"; sourceTree = "<group>"; };
3BB09EDF190736160080A5ED /* MPSumFunctionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSumFunctionLayout.h; sourceTree = "<group>"; };
3BB09EE0190736160080A5ED /* MPSumFunctionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSumFunctionLayout.m; sourceTree = "<group>"; };
3BBBA3941905704200824E74 /* MPRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPRangeTests.m; path = ../MathPadTests/MPRangeTests.m; sourceTree = "<group>"; }; 3BBBA3941905704200824E74 /* MPRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MPRangeTests.m; path = ../MathPadTests/MPRangeTests.m; sourceTree = "<group>"; };
3BC4661319B245C60033F13A /* Fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Fonts; sourceTree = "<group>"; };
3BC4661519B365070033F13A /* MPArrayCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayCache.h; sourceTree = "<group>"; }; 3BC4661519B365070033F13A /* MPArrayCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayCache.h; sourceTree = "<group>"; };
3BC4661619B365070033F13A /* MPArrayCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPArrayCache.m; sourceTree = "<group>"; }; 3BC4661619B365070033F13A /* MPArrayCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPArrayCache.m; sourceTree = "<group>"; };
3BCA0C7E1A12619500C9E3E0 /* MPTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTerm.h; sourceTree = "<group>"; };
3BCA0C7F1A12619500C9E3E0 /* MPTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTerm.m; sourceTree = "<group>"; };
3BCA0C831A1405C000C9E3E0 /* MPFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFunctionTerm.h; sourceTree = "<group>"; };
3BCA0C841A1405C000C9E3E0 /* MPFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFunctionTerm.m; sourceTree = "<group>"; };
3BEFF74B1A16A4DA00301C0C /* MPSumTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSumTerm.h; sourceTree = "<group>"; };
3BEFF74C1A16A4DA00301C0C /* MPSumTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSumTerm.m; sourceTree = "<group>"; };
3BEFF74F1A16B06600301C0C /* MPParsedExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPParsedExpression.h; sourceTree = "<group>"; };
3BEFF7501A16B06600301C0C /* MPParsedExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPParsedExpression.m; sourceTree = "<group>"; };
3BEFF7531A17AA3200301C0C /* MPProductTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPProductTerm.h; sourceTree = "<group>"; };
3BEFF7541A17AA3200301C0C /* MPProductTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPProductTerm.m; sourceTree = "<group>"; };
3BEFF7601A1804AF00301C0C /* MPFactorialTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFactorialTerm.h; sourceTree = "<group>"; };
3BEFF7611A1804AF00301C0C /* MPFactorialTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFactorialTerm.m; sourceTree = "<group>"; };
3BEFF7641A18066300301C0C /* MPSumFunctionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSumFunctionTerm.h; sourceTree = "<group>"; };
3BEFF7651A18066300301C0C /* MPSumFunctionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSumFunctionTerm.m; sourceTree = "<group>"; };
3BEFF7681A1807B000301C0C /* MPParenthesisTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPParenthesisTerm.h; sourceTree = "<group>"; };
3BEFF7691A1807B000301C0C /* MPParenthesisTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPParenthesisTerm.m; sourceTree = "<group>"; };
3BEFF76C1A18083C00301C0C /* MPPowerTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPowerTerm.h; sourceTree = "<group>"; };
3BEFF76D1A18083C00301C0C /* MPPowerTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPowerTerm.m; sourceTree = "<group>"; };
3BEFF7701A180C8800301C0C /* MPFractionTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFractionTerm.h; sourceTree = "<group>"; };
3BEFF7711A180C8800301C0C /* MPFractionTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFractionTerm.m; sourceTree = "<group>"; };
3BF54BB71A18D08400883BFA /* MPExpressionParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpressionParser.h; sourceTree = "<group>"; };
3BF54BB81A18D08400883BFA /* MPExpressionParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpressionParser.m; sourceTree = "<group>"; };
3BF59AFB19D80ECC00E54292 /* MPFunctionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFunctionsViewController.h; sourceTree = "<group>"; };
3BF59AFC19D80ECC00E54292 /* MPFunctionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFunctionsViewController.m; sourceTree = "<group>"; };
3BF59AFD19D80ECC00E54292 /* MPFunctionsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPFunctionsViewController.xib; sourceTree = "<group>"; };
3BF59B0119D81EE600E54292 /* MPWhiteView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPWhiteView.h; sourceTree = "<group>"; };
3BF59B0219D81EE600E54292 /* MPWhiteView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPWhiteView.m; sourceTree = "<group>"; };
3BF9976B18DE623E009CF6C4 /* MathPad.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MathPad.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3BF9976B18DE623E009CF6C4 /* MathPad.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MathPad.app; sourceTree = BUILT_PRODUCTS_DIR; };
3BF9976E18DE623E009CF6C4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 3BF9976E18DE623E009CF6C4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
3BF9977118DE623E009CF6C4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 3BF9977118DE623E009CF6C4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
@@ -271,11 +276,6 @@
3BF9979018DE623E009CF6C4 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3BF9979018DE623E009CF6C4 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
3BF9979718DE623E009CF6C4 /* MathPadTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathPadTests-Info.plist"; sourceTree = "<group>"; }; 3BF9979718DE623E009CF6C4 /* MathPadTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MathPadTests-Info.plist"; sourceTree = "<group>"; };
3BF9979918DE623E009CF6C4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3BF9979918DE623E009CF6C4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3BFAC38D1997B61300B3EF67 /* MPExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPExpression.h; sourceTree = "<group>"; };
3BFAC38E1997B61300B3EF67 /* MPExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPExpression.m; sourceTree = "<group>"; };
3BFAC3961997B67400B3EF67 /* MPExpressionElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPExpressionElement.h; sourceTree = "<group>"; };
3BFAC39A1997BC7600B3EF67 /* NSString+MPExpressionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MPExpressionElement.h"; sourceTree = "<group>"; };
3BFAC39B1997BC7600B3EF67 /* NSString+MPExpressionElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MPExpressionElement.m"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -322,6 +322,7 @@
3B7172E519C7112C00FEAA5B /* Resources */ = { 3B7172E519C7112C00FEAA5B /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3B6338A41A3A4D1200698BFB /* Fonts */,
3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */, 3B7172E819C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png */,
3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */, 3B7172E919C7147000FEAA5B /* FunctionsButtonDisclosure.png */,
); );
@@ -372,10 +373,10 @@
3B85833119BB5EC800D76A8D /* View */ = { 3B85833119BB5EC800D76A8D /* View */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3B87E3541900856F00259938 /* MPExpressionView.h */, 3B6338AE1A3A4D6A00698BFB /* MPExpressionView.h */,
3B87E3551900856F00259938 /* MPExpressionView.m */, 3B6338AF1A3A4D6A00698BFB /* MPExpressionView.m */,
3BB09EB01905DE500080A5ED /* MPExpressionStorage.h */, 3B6338B21A3A4D7900698BFB /* MPExpressionStorage.h */,
3BB09EB11905DE500080A5ED /* MPExpressionStorage.m */, 3B6338B31A3A4D7900698BFB /* MPExpressionStorage.m */,
3BB09ED819071C270080A5ED /* Private */, 3BB09ED819071C270080A5ED /* Private */,
); );
name = View; name = View;
@@ -385,8 +386,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BC46B4B19B38CB60033F13A /* Base Expression Classes */, 3BC46B4B19B38CB60033F13A /* Base Expression Classes */,
3B87E35B1900933200259938 /* MPRangePath.h */, 3B6338A01A3A4CFC00698BFB /* MPRangePath.h */,
3B87E35C1900933200259938 /* MPRangePath.m */, 3B6338A11A3A4CFC00698BFB /* MPRangePath.m */,
3BC46B4D19B38CFB0033F13A /* Helpers */, 3BC46B4D19B38CFB0033F13A /* Helpers */,
); );
name = Model; name = Model;
@@ -399,7 +400,6 @@
3BF9978318DE623E009CF6C4 /* MPDocument.xib */, 3BF9978318DE623E009CF6C4 /* MPDocument.xib */,
3BF9978618DE623E009CF6C4 /* MainMenu.xib */, 3BF9978618DE623E009CF6C4 /* MainMenu.xib */,
3BF9978918DE623E009CF6C4 /* Images.xcassets */, 3BF9978918DE623E009CF6C4 /* Images.xcassets */,
3BC4661319B245C60033F13A /* Fonts */,
); );
name = Resources; name = Resources;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -407,14 +407,14 @@
3BB09EBC1905EF210080A5ED /* Functions */ = { 3BB09EBC1905EF210080A5ED /* Functions */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BB09EC71906FD830080A5ED /* MPSumFunction.h */, 3B6338541A3A4BE800698BFB /* MPFractionFunction.h */,
3BB09EC81906FD830080A5ED /* MPSumFunction.m */, 3B6338551A3A4BE800698BFB /* MPFractionFunction.m */,
3B7172EC19C9FA8E00FEAA5B /* MPParenthesisFunction.h */, 3B63384C1A3A4BD100698BFB /* MPParenthesisFunction.h */,
3B7172ED19C9FA8E00FEAA5B /* MPParenthesisFunction.m */, 3B63384D1A3A4BD100698BFB /* MPParenthesisFunction.m */,
3B5FF73919DB2FF500C8348A /* MPPowerFunction.h */, 3B6338561A3A4BE800698BFB /* MPPowerFunction.h */,
3B5FF73A19DB2FF500C8348A /* MPPowerFunction.m */, 3B6338571A3A4BE800698BFB /* MPPowerFunction.m */,
3B69B67A19E4915E0028E608 /* MPFractionFunction.h */, 3B63384E1A3A4BD100698BFB /* MPSumFunction.h */,
3B69B67B19E4915E0028E608 /* MPFractionFunction.m */, 3B63384F1A3A4BD100698BFB /* MPSumFunction.m */,
); );
name = Functions; name = Functions;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -422,17 +422,17 @@
3BB09ED819071C270080A5ED /* Private */ = { 3BB09ED819071C270080A5ED /* Private */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BF59AFB19D80ECC00E54292 /* MPFunctionsViewController.h */, 3B6338B61A3A4D9400698BFB /* MPFunctionsViewController.h */,
3BF59AFC19D80ECC00E54292 /* MPFunctionsViewController.m */, 3B6338B71A3A4D9400698BFB /* MPFunctionsViewController.m */,
3BF59AFD19D80ECC00E54292 /* MPFunctionsViewController.xib */, 3B6338B81A3A4D9400698BFB /* MPFunctionsViewController.xib */,
3BF59B0119D81EE600E54292 /* MPWhiteView.h */, 3B6338B91A3A4D9400698BFB /* MPWhiteView.h */,
3BF59B0219D81EE600E54292 /* MPWhiteView.m */, 3B6338BA1A3A4D9400698BFB /* MPWhiteView.m */,
3B528D0D199417740054DB5F /* MPLayout.h */, 3B6338C01A3A4DA500698BFB /* MPLayout.h */,
3B688D9819982DF50006B4AB /* MPLayout.m */, 3B6338C11A3A4DA500698BFB /* MPLayout.m */,
3B528D0E199417E10054DB5F /* MPExpressionLayout.h */, 3B6338C41A3A4DB600698BFB /* MPExpressionLayout.h */,
3B528D0F199417E10054DB5F /* MPExpressionLayout.m */, 3B6338C51A3A4DB600698BFB /* MPExpressionLayout.m */,
3B528D11199417E90054DB5F /* MPFunctionLayout.h */, 3B6338C81A3A4DC400698BFB /* MPFunctionLayout.h */,
3B528D12199417E90054DB5F /* MPFunctionLayout.m */, 3B6338C91A3A4DC400698BFB /* MPFunctionLayout.m */,
3BB09EE21907361C0080A5ED /* Function Layouts */, 3BB09EE21907361C0080A5ED /* Function Layouts */,
); );
name = Private; name = Private;
@@ -442,14 +442,14 @@
3BB09EE21907361C0080A5ED /* Function Layouts */ = { 3BB09EE21907361C0080A5ED /* Function Layouts */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BB09EDF190736160080A5ED /* MPSumFunctionLayout.h */, 3B6338CC1A3A4DE100698BFB /* MPFractionFunctionLayout.h */,
3BB09EE0190736160080A5ED /* MPSumFunctionLayout.m */, 3B6338CD1A3A4DE100698BFB /* MPFractionFunctionLayout.m */,
3B7172F019C9FC6700FEAA5B /* MPParenthesisFunctionLayout.h */, 3B6338CE1A3A4DE100698BFB /* MPParenthesisFunctionLayout.h */,
3B7172F119C9FC6700FEAA5B /* MPParenthesisFunctionLayout.m */, 3B6338CF1A3A4DE100698BFB /* MPParenthesisFunctionLayout.m */,
3B69B66A19DB41B90028E608 /* MPPowerFunctionLayout.h */, 3B6338D01A3A4DE100698BFB /* MPPowerFunctionLayout.h */,
3B69B66B19DB41B90028E608 /* MPPowerFunctionLayout.m */, 3B6338D11A3A4DE100698BFB /* MPPowerFunctionLayout.m */,
3B69B67E19E493630028E608 /* MPFractionFunctionLayout.h */, 3B6338D21A3A4DE100698BFB /* MPSumFunctionLayout.h */,
3B69B67F19E493630028E608 /* MPFractionFunctionLayout.m */, 3B6338D31A3A4DE100698BFB /* MPSumFunctionLayout.m */,
); );
name = "Function Layouts"; name = "Function Layouts";
sourceTree = "<group>"; sourceTree = "<group>";
@@ -466,19 +466,19 @@
3BC46B4B19B38CB60033F13A /* Base Expression Classes */ = { 3BC46B4B19B38CB60033F13A /* Base Expression Classes */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BFAC38D1997B61300B3EF67 /* MPExpression.h */, 3B6338321A3A4B5800698BFB /* MPExpression.h */,
3BFAC38E1997B61300B3EF67 /* MPExpression.m */, 3B6338331A3A4B5800698BFB /* MPExpression.m */,
3BFAC3961997B67400B3EF67 /* MPExpressionElement.h */, 3B6338341A3A4B5800698BFB /* MPExpressionElement.h */,
3BFAC39A1997BC7600B3EF67 /* NSString+MPExpressionElement.h */, 3B6338381A3A4B7600698BFB /* NSString+MPExpressionElement.h */,
3BFAC39B1997BC7600B3EF67 /* NSString+MPExpressionElement.m */, 3B6338391A3A4B7600698BFB /* NSString+MPExpressionElement.m */,
3B87E35E19009D5F00259938 /* MPFunction.h */, 3B6338401A3A4B9500698BFB /* MPFunction.h */,
3B87E35F19009D5F00259938 /* MPFunction.m */, 3B6338411A3A4B9500698BFB /* MPFunction.m */,
3B7B3A1619CC44E4005849E5 /* MPExpressionTokenizer.h */, 3B6338441A3A4BA500698BFB /* MPExpressionTokenizer.h */,
3B7B3A1719CC44E4005849E5 /* MPExpressionTokenizer.m */, 3B6338451A3A4BA500698BFB /* MPExpressionTokenizer.m */,
3B7B3A2A19CC467E005849E5 /* MPToken.h */, 3B63383C1A3A4B8500698BFB /* MPToken.h */,
3B7B3A2B19CC467E005849E5 /* MPToken.m */, 3B63383D1A3A4B8500698BFB /* MPToken.m */,
3B7B3A5219CC50B1005849E5 /* MPFunction+MPToken.h */, 3B6338481A3A4BB300698BFB /* MPFunction+MPToken.h */,
3B7B3A5319CC50B1005849E5 /* MPFunction+MPToken.m */, 3B6338491A3A4BB300698BFB /* MPFunction+MPToken.m */,
3BB09EBC1905EF210080A5ED /* Functions */, 3BB09EBC1905EF210080A5ED /* Functions */,
3BC46B4F19B506F20033F13A /* Evaluation */, 3BC46B4F19B506F20033F13A /* Evaluation */,
); );
@@ -488,10 +488,10 @@
3BC46B4D19B38CFB0033F13A /* Helpers */ = { 3BC46B4D19B38CFB0033F13A /* Helpers */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BB09EDC190728220080A5ED /* NSIndexPath+MPAdditions.h */, 3B6338A61A3A4D2600698BFB /* NSIndexPath+MPAdditions.h */,
3BB09EDD190728220080A5ED /* NSIndexPath+MPAdditions.m */, 3B6338A71A3A4D2600698BFB /* NSIndexPath+MPAdditions.m */,
3B52CEDA19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.h */, 3B6338AA1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.h */,
3B52CEDB19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.m */, 3B6338AB1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.m */,
); );
name = Helpers; name = Helpers;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -499,32 +499,32 @@
3BC46B4F19B506F20033F13A /* Evaluation */ = { 3BC46B4F19B506F20033F13A /* Evaluation */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BF54BB71A18D08400883BFA /* MPExpressionParser.h */, 3B63385C1A3A4C0700698BFB /* MPExpressionParser.h */,
3BF54BB81A18D08400883BFA /* MPExpressionParser.m */, 3B63385D1A3A4C0700698BFB /* MPExpressionParser.m */,
3BEFF74F1A16B06600301C0C /* MPParsedExpression.h */, 3B6338661A3A4C2B00698BFB /* MPParsedExpression.h */,
3BEFF7501A16B06600301C0C /* MPParsedExpression.m */, 3B6338671A3A4C2B00698BFB /* MPParsedExpression.m */,
3BCA0C7E1A12619500C9E3E0 /* MPTerm.h */, 3B63387A1A3A4C7E00698BFB /* MPTerm.h */,
3BCA0C7F1A12619500C9E3E0 /* MPTerm.m */, 3B63387B1A3A4C7E00698BFB /* MPTerm.m */,
3B9265C51A2147DF00AD2809 /* MPNegatedTerm.h */, 3B6338601A3A4C2B00698BFB /* MPNegatedTerm.h */,
3B9265C61A2147DF00AD2809 /* MPNegatedTerm.m */, 3B6338611A3A4C2B00698BFB /* MPNegatedTerm.m */,
3BEFF74B1A16A4DA00301C0C /* MPSumTerm.h */, 3B6338781A3A4C7E00698BFB /* MPSumTerm.h */,
3BEFF74C1A16A4DA00301C0C /* MPSumTerm.m */, 3B6338791A3A4C7E00698BFB /* MPSumTerm.m */,
3BEFF7531A17AA3200301C0C /* MPProductTerm.h */, 3B63386A1A3A4C2B00698BFB /* MPProductTerm.h */,
3BEFF7541A17AA3200301C0C /* MPProductTerm.m */, 3B63386B1A3A4C2B00698BFB /* MPProductTerm.m */,
3BEFF7601A1804AF00301C0C /* MPFactorialTerm.h */, 3B6338841A3A4CA500698BFB /* MPFactorialTerm.h */,
3BEFF7611A1804AF00301C0C /* MPFactorialTerm.m */, 3B6338851A3A4CA500698BFB /* MPFactorialTerm.m */,
3B69B6BB19E948740028E608 /* MPElementaryFunctionTerm.h */, 3B6338881A3A4CAF00698BFB /* MPElementaryFunctionTerm.h */,
3B69B6BC19E948740028E608 /* MPElementaryFunctionTerm.m */, 3B6338891A3A4CAF00698BFB /* MPElementaryFunctionTerm.m */,
3B69B69B19E6F2110028E608 /* MPNumber.h */, 3B6338621A3A4C2B00698BFB /* MPNumber.h */,
3B69B69C19E6F2110028E608 /* MPNumber.m */, 3B6338631A3A4C2B00698BFB /* MPNumber.m */,
3B69B69F19E6F2420028E608 /* MPVariable.h */, 3B63387C1A3A4C7E00698BFB /* MPVariable.h */,
3B69B6A019E6F2420028E608 /* MPVariable.m */, 3B63387D1A3A4C7E00698BFB /* MPVariable.m */,
3BCA0C831A1405C000C9E3E0 /* MPFunctionTerm.h */, 3B63388C1A3A4CBE00698BFB /* MPFunctionTerm.h */,
3BCA0C841A1405C000C9E3E0 /* MPFunctionTerm.m */, 3B63388D1A3A4CBE00698BFB /* MPFunctionTerm.m */,
3B78C85219C2DA5300516335 /* MPEvaluationContext.h */, 3B6338901A3A4CCA00698BFB /* MPEvaluationContext.h */,
3B78C85319C2DA5300516335 /* MPEvaluationContext.m */, 3B6338911A3A4CCA00698BFB /* MPEvaluationContext.m */,
3B591BB919C58D000061D86B /* MPMathRules.h */, 3B6338941A3A4CD100698BFB /* MPMathRules.h */,
3B591BBA19C58D000061D86B /* MPMathRules.m */, 3B6338951A3A4CD100698BFB /* MPMathRules.m */,
3BEFF75F1A17FF5C00301C0C /* Functions */, 3BEFF75F1A17FF5C00301C0C /* Functions */,
); );
name = Evaluation; name = Evaluation;
@@ -533,14 +533,14 @@
3BEFF75F1A17FF5C00301C0C /* Functions */ = { 3BEFF75F1A17FF5C00301C0C /* Functions */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3BEFF7641A18066300301C0C /* MPSumFunctionTerm.h */, 3B6338981A3A4CE100698BFB /* MPSumFunctionTerm.h */,
3BEFF7651A18066300301C0C /* MPSumFunctionTerm.m */, 3B6338991A3A4CE100698BFB /* MPSumFunctionTerm.m */,
3BEFF7681A1807B000301C0C /* MPParenthesisTerm.h */, 3B6338641A3A4C2B00698BFB /* MPParenthesisTerm.h */,
3BEFF7691A1807B000301C0C /* MPParenthesisTerm.m */, 3B6338651A3A4C2B00698BFB /* MPParenthesisTerm.m */,
3BEFF76C1A18083C00301C0C /* MPPowerTerm.h */, 3B6338681A3A4C2B00698BFB /* MPPowerTerm.h */,
3BEFF76D1A18083C00301C0C /* MPPowerTerm.m */, 3B6338691A3A4C2B00698BFB /* MPPowerTerm.m */,
3BEFF7701A180C8800301C0C /* MPFractionTerm.h */, 3B63389C1A3A4CEF00698BFB /* MPFractionTerm.h */,
3BEFF7711A180C8800301C0C /* MPFractionTerm.m */, 3B63389D1A3A4CEF00698BFB /* MPFractionTerm.m */,
); );
name = Functions; name = Functions;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -638,49 +638,49 @@
isa = PBXHeadersBuildPhase; isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3B6338A81A3A4D2600698BFB /* NSIndexPath+MPAdditions.h in Headers */,
3B85834C19BB661100D76A8D /* MathKit.h in Headers */, 3B85834C19BB661100D76A8D /* MathKit.h in Headers */,
3BEFF76E1A18083C00301C0C /* MPPowerTerm.h in Headers */, 3B63383A1A3A4B7600698BFB /* NSString+MPExpressionElement.h in Headers */,
3B85833819BB63BD00D76A8D /* MPExpression.h in Headers */, 3B6338C21A3A4DA500698BFB /* MPLayout.h in Headers */,
3B85833919BB63C500D76A8D /* MPExpressionElement.h in Headers */, 3B6338721A3A4C2B00698BFB /* MPParsedExpression.h in Headers */,
3B69B67C19E4915E0028E608 /* MPFractionFunction.h in Headers */, 3B6338B01A3A4D6A00698BFB /* MPExpressionView.h in Headers */,
3BEFF7551A17AA3200301C0C /* MPProductTerm.h in Headers */, 3B6338DA1A3A4DE100698BFB /* MPSumFunctionLayout.h in Headers */,
3B78C85419C2DA5300516335 /* MPEvaluationContext.h in Headers */, 3B6338AC1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.h in Headers */,
3B85834419BB654D00D76A8D /* NSString+MPExpressionElement.h in Headers */, 3B6338501A3A4BD100698BFB /* MPParenthesisFunction.h in Headers */,
3BCA0C851A1405C000C9E3E0 /* MPFunctionTerm.h in Headers */, 3B63387E1A3A4C7E00698BFB /* MPSumTerm.h in Headers */,
3B7172F219C9FC6700FEAA5B /* MPParenthesisFunctionLayout.h in Headers */, 3B6338D81A3A4DE100698BFB /* MPPowerFunctionLayout.h in Headers */,
3B52CEDC19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.h in Headers */, 3B6338801A3A4C7E00698BFB /* MPTerm.h in Headers */,
3BEFF76A1A1807B000301C0C /* MPParenthesisTerm.h in Headers */, 3B6338521A3A4BD100698BFB /* MPSumFunction.h in Headers */,
3B85833A19BB63D400D76A8D /* MPFunction.h in Headers */, 3B6338CA1A3A4DC400698BFB /* MPFunctionLayout.h in Headers */,
3B69B66C19DB41B90028E608 /* MPPowerFunctionLayout.h in Headers */, 3B6338701A3A4C2B00698BFB /* MPParenthesisTerm.h in Headers */,
3B85834319BB653700D76A8D /* MPSumFunction.h in Headers */, 3B63389E1A3A4CEF00698BFB /* MPFractionTerm.h in Headers */,
3BCA0C801A12619500C9E3E0 /* MPTerm.h in Headers */, 3B6338961A3A4CD100698BFB /* MPMathRules.h in Headers */,
3B85834119BB651E00D76A8D /* MPRangePath.h in Headers */, 3B6338421A3A4B9500698BFB /* MPFunction.h in Headers */,
3B69B69D19E6F2110028E608 /* MPNumber.h in Headers */, 3B63388E1A3A4CBE00698BFB /* MPFunctionTerm.h in Headers */,
3B85834519BB655200D76A8D /* NSIndexPath+MPAdditions.h in Headers */, 3B6338D41A3A4DE100698BFB /* MPFractionFunctionLayout.h in Headers */,
3B5FF73B19DB2FF500C8348A /* MPPowerFunction.h in Headers */, 3B6338741A3A4C2B00698BFB /* MPPowerTerm.h in Headers */,
3B7172EE19C9FA8E00FEAA5B /* MPParenthesisFunction.h in Headers */, 3B6338371A3A4B5800698BFB /* MPExpressionElement.h in Headers */,
3BF54BB91A18D08400883BFA /* MPExpressionParser.h in Headers */, 3B6338BE1A3A4D9400698BFB /* MPWhiteView.h in Headers */,
3BEFF7511A16B06600301C0C /* MPParsedExpression.h in Headers */, 3B6338A21A3A4CFC00698BFB /* MPRangePath.h in Headers */,
3BEFF7721A180C8800301C0C /* MPFractionTerm.h in Headers */, 3B63386E1A3A4C2B00698BFB /* MPNumber.h in Headers */,
3B85834619BB655C00D76A8D /* MPExpressionView.h in Headers */, 3B6338C61A3A4DB600698BFB /* MPExpressionLayout.h in Headers */,
3B85834719BB655F00D76A8D /* MPExpressionStorage.h in Headers */, 3B63385A1A3A4BE800698BFB /* MPPowerFunction.h in Headers */,
3B9265C71A2147DF00AD2809 /* MPNegatedTerm.h in Headers */, 3B63389A1A3A4CE100698BFB /* MPSumFunctionTerm.h in Headers */,
3BF59AFE19D80ECC00E54292 /* MPFunctionsViewController.h in Headers */, 3B6338921A3A4CCA00698BFB /* MPEvaluationContext.h in Headers */,
3B7B3A2C19CC467E005849E5 /* MPToken.h in Headers */, 3B63386C1A3A4C2B00698BFB /* MPNegatedTerm.h in Headers */,
3B7B3A1819CC44E4005849E5 /* MPExpressionTokenizer.h in Headers */, 3B63385E1A3A4C0700698BFB /* MPExpressionParser.h in Headers */,
3BF59B0319D81EE600E54292 /* MPWhiteView.h in Headers */, 3B63384A1A3A4BB300698BFB /* MPFunction+MPToken.h in Headers */,
3B85834819BB65B600D76A8D /* MPLayout.h in Headers */, 3B63383E1A3A4B8500698BFB /* MPToken.h in Headers */,
3BEFF7661A18066300301C0C /* MPSumFunctionTerm.h in Headers */, 3B6338461A3A4BA500698BFB /* MPExpressionTokenizer.h in Headers */,
3B85834919BB65B600D76A8D /* MPExpressionLayout.h in Headers */, 3B63388A1A3A4CAF00698BFB /* MPElementaryFunctionTerm.h in Headers */,
3BEFF7621A1804AF00301C0C /* MPFactorialTerm.h in Headers */, 3B6338861A3A4CA500698BFB /* MPFactorialTerm.h in Headers */,
3B7B3A5419CC50B1005849E5 /* MPFunction+MPToken.h in Headers */, 3B6338581A3A4BE800698BFB /* MPFractionFunction.h in Headers */,
3B69B6BD19E948740028E608 /* MPElementaryFunctionTerm.h in Headers */, 3B6338761A3A4C2B00698BFB /* MPProductTerm.h in Headers */,
3B591BBB19C58D000061D86B /* MPMathRules.h in Headers */, 3B6338351A3A4B5800698BFB /* MPExpression.h in Headers */,
3BEFF74D1A16A4DA00301C0C /* MPSumTerm.h in Headers */, 3B6338BB1A3A4D9400698BFB /* MPFunctionsViewController.h in Headers */,
3B69B68019E493630028E608 /* MPFractionFunctionLayout.h in Headers */, 3B6338D61A3A4DE100698BFB /* MPParenthesisFunctionLayout.h in Headers */,
3B69B6A119E6F2420028E608 /* MPVariable.h in Headers */, 3B6338821A3A4C7E00698BFB /* MPVariable.h in Headers */,
3B85834A19BB65B600D76A8D /* MPFunctionLayout.h in Headers */, 3B6338B41A3A4D7900698BFB /* MPExpressionStorage.h in Headers */,
3B85834B19BB65B600D76A8D /* MPSumFunctionLayout.h in Headers */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -805,10 +805,11 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3BF59B0019D80ECC00E54292 /* MPFunctionsViewController.xib in Resources */, 3B6338A51A3A4D1200698BFB /* Fonts in Resources */,
3B7172EA19C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png in Resources */, 3B7172EA19C7147000FEAA5B /* FunctionsButtonDisclosure@2x.png in Resources */,
3B7172EB19C7147000FEAA5B /* FunctionsButtonDisclosure.png in Resources */, 3B7172EB19C7147000FEAA5B /* FunctionsButtonDisclosure.png in Resources */,
3B85831419BB5E5500D76A8D /* InfoPlist.strings in Resources */, 3B85831419BB5E5500D76A8D /* InfoPlist.strings in Resources */,
3B6338BD1A3A4D9400698BFB /* MPFunctionsViewController.xib in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -827,7 +828,6 @@
3BF9977918DE623E009CF6C4 /* InfoPlist.strings in Resources */, 3BF9977918DE623E009CF6C4 /* InfoPlist.strings in Resources */,
3BF9978A18DE623E009CF6C4 /* Images.xcassets in Resources */, 3BF9978A18DE623E009CF6C4 /* Images.xcassets in Resources */,
3BC4660B19B2425A0033F13A /* MPDocument.xib in Resources */, 3BC4660B19B2425A0033F13A /* MPDocument.xib in Resources */,
3BC4661419B245C60033F13A /* Fonts in Resources */,
3BF9977F18DE623E009CF6C4 /* Credits.rtf in Resources */, 3BF9977F18DE623E009CF6C4 /* Credits.rtf in Resources */,
3BF9978818DE623E009CF6C4 /* MainMenu.xib in Resources */, 3BF9978818DE623E009CF6C4 /* MainMenu.xib in Resources */,
); );
@@ -848,47 +848,47 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3BEFF76F1A18083C00301C0C /* MPPowerTerm.m in Sources */, 3B6338DB1A3A4DE100698BFB /* MPSumFunctionLayout.m in Sources */,
3B5FF73C19DB2FF500C8348A /* MPPowerFunction.m in Sources */, 3B63385F1A3A4C0700698BFB /* MPExpressionParser.m in Sources */,
3BBEA94219BB79A700133766 /* MPExpressionLayout.m in Sources */, 3B6338A91A3A4D2600698BFB /* NSIndexPath+MPAdditions.m in Sources */,
3BF54BBA1A18D08400883BFA /* MPExpressionParser.m in Sources */, 3B6338591A3A4BE800698BFB /* MPFractionFunction.m in Sources */,
3B7B3A1919CC44E4005849E5 /* MPExpressionTokenizer.m in Sources */, 3B6338471A3A4BA500698BFB /* MPExpressionTokenizer.m in Sources */,
3B591BBC19C58D000061D86B /* MPMathRules.m in Sources */, 3B6338D91A3A4DE100698BFB /* MPPowerFunctionLayout.m in Sources */,
3B69B6BE19E948740028E608 /* MPElementaryFunctionTerm.m in Sources */, 3B6338D51A3A4DE100698BFB /* MPFractionFunctionLayout.m in Sources */,
3B7172EF19C9FA8E00FEAA5B /* MPParenthesisFunction.m in Sources */, 3B63389B1A3A4CE100698BFB /* MPSumFunctionTerm.m in Sources */,
3B7B3A5519CC50B1005849E5 /* MPFunction+MPToken.m in Sources */, 3B6338361A3A4B5800698BFB /* MPExpression.m in Sources */,
3B9265C81A2147DF00AD2809 /* MPNegatedTerm.m in Sources */, 3B6338BC1A3A4D9400698BFB /* MPFunctionsViewController.m in Sources */,
3BBEA94119BB79A700133766 /* MPLayout.m in Sources */, 3B63383B1A3A4B7600698BFB /* NSString+MPExpressionElement.m in Sources */,
3BBEA93D19BB79A700133766 /* NSString+MPExpressionElement.m in Sources */, 3B63386D1A3A4C2B00698BFB /* MPNegatedTerm.m in Sources */,
3B69B68119E493630028E608 /* MPFractionFunctionLayout.m in Sources */, 3B6338531A3A4BD100698BFB /* MPSumFunction.m in Sources */,
3BF59B0419D81EE600E54292 /* MPWhiteView.m in Sources */, 3B6338A31A3A4CFC00698BFB /* MPRangePath.m in Sources */,
3BBEA94019BB79A700133766 /* MPExpressionStorage.m in Sources */, 3B63383F1A3A4B8500698BFB /* MPToken.m in Sources */,
3BBEA93F19BB79A700133766 /* MPExpressionView.m in Sources */, 3B63389F1A3A4CEF00698BFB /* MPFractionTerm.m in Sources */,
3B7B3A2D19CC467E005849E5 /* MPToken.m in Sources */, 3B6338D71A3A4DE100698BFB /* MPParenthesisFunctionLayout.m in Sources */,
3B78C85519C2DA5300516335 /* MPEvaluationContext.m in Sources */, 3B63388F1A3A4CBE00698BFB /* MPFunctionTerm.m in Sources */,
3B69B6A219E6F2420028E608 /* MPVariable.m in Sources */, 3B6338971A3A4CD100698BFB /* MPMathRules.m in Sources */,
3BBEA94419BB79A700133766 /* MPSumFunctionLayout.m in Sources */, 3B6338C71A3A4DB600698BFB /* MPExpressionLayout.m in Sources */,
3B69B69E19E6F2110028E608 /* MPNumber.m in Sources */, 3B6338831A3A4C7E00698BFB /* MPVariable.m in Sources */,
3BEFF7521A16B06600301C0C /* MPParsedExpression.m in Sources */, 3B63385B1A3A4BE800698BFB /* MPPowerFunction.m in Sources */,
3B7172F319C9FC6700FEAA5B /* MPParenthesisFunctionLayout.m in Sources */, 3B6338711A3A4C2B00698BFB /* MPParenthesisTerm.m in Sources */,
3BEFF76B1A1807B000301C0C /* MPParenthesisTerm.m in Sources */, 3B6338731A3A4C2B00698BFB /* MPParsedExpression.m in Sources */,
3BEFF7631A1804AF00301C0C /* MPFactorialTerm.m in Sources */, 3B6338771A3A4C2B00698BFB /* MPProductTerm.m in Sources */,
3BEFF7731A180C8800301C0C /* MPFractionTerm.m in Sources */, 3B6338B51A3A4D7900698BFB /* MPExpressionStorage.m in Sources */,
3BEFF7671A18066300301C0C /* MPSumFunctionTerm.m in Sources */, 3B63386F1A3A4C2B00698BFB /* MPNumber.m in Sources */,
3BBEA93A19BB79A700133766 /* MPSumFunction.m in Sources */, 3B6338CB1A3A4DC400698BFB /* MPFunctionLayout.m in Sources */,
3BBEA93E19BB79A700133766 /* NSIndexPath+MPAdditions.m in Sources */, 3B63384B1A3A4BB300698BFB /* MPFunction+MPToken.m in Sources */,
3B52CEDD19BEE63000CEDCFC /* NSRegularExpression+MPParsingAdditions.m in Sources */, 3B6338BF1A3A4D9400698BFB /* MPWhiteView.m in Sources */,
3BEFF7561A17AA3200301C0C /* MPProductTerm.m in Sources */, 3B6338931A3A4CCA00698BFB /* MPEvaluationContext.m in Sources */,
3B69B67D19E4915E0028E608 /* MPFractionFunction.m in Sources */, 3B6338C31A3A4DA500698BFB /* MPLayout.m in Sources */,
3BEFF74E1A16A4DA00301C0C /* MPSumTerm.m in Sources */, 3B63387F1A3A4C7E00698BFB /* MPSumTerm.m in Sources */,
3BF59AFF19D80ECC00E54292 /* MPFunctionsViewController.m in Sources */, 3B6338811A3A4C7E00698BFB /* MPTerm.m in Sources */,
3BCA0C861A1405C000C9E3E0 /* MPFunctionTerm.m in Sources */, 3B6338B11A3A4D6A00698BFB /* MPExpressionView.m in Sources */,
3BCA0C811A12619500C9E3E0 /* MPTerm.m in Sources */, 3B6338AD1A3A4D3000698BFB /* NSRegularExpression+MPParsingAdditions.m in Sources */,
3B69B66D19DB41B90028E608 /* MPPowerFunctionLayout.m in Sources */, 3B63388B1A3A4CAF00698BFB /* MPElementaryFunctionTerm.m in Sources */,
3BBEA93619BB79A700133766 /* MPFunction.m in Sources */, 3B6338511A3A4BD100698BFB /* MPParenthesisFunction.m in Sources */,
3BBEA93519BB79A700133766 /* MPExpression.m in Sources */, 3B6338871A3A4CA500698BFB /* MPFactorialTerm.m in Sources */,
3BBEA93B19BB79A700133766 /* MPRangePath.m in Sources */, 3B6338431A3A4B9500698BFB /* MPFunction.m in Sources */,
3BBEA94319BB79A700133766 /* MPFunctionLayout.m in Sources */, 3B6338751A3A4C2B00698BFB /* MPPowerTerm.m in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@@ -1,840 +0,0 @@
//
// MPExpression.h
// MathPad
//
// Created by Kim Wittenburg on 10.08.14.
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
//
/*!
@const MPIllegalElementException
@brief Name for an exception that is raised if an invalid element is
added to an expression.
@discussion This exception may be raised during initialization of an
expression or when the expression is mutated. This exception
always contains the @c MPIllegalElementExceptionElementKey key in
its @c userInfo dictionary.
*/
FOUNDATION_EXPORT NSString *const MPIllegalElementException;
/*!
@const MPIllegalElementExceptionElementKey
@brief Predefined key for the invalid element that caused an exception
to be raised.
@discussion The invalid element can be of any type.
*/
FOUNDATION_EXPORT NSString *const MPIllegalElementExceptionElementKey;
/*!
@typedef MPReferenceFrame
@brief A reference frame describes what an @em item in an expression is.
@discussion Reference frames have to be passed in multiple methods of the @c
MPExpression class. You can convert between reference frames
using the following methods:
<pre>
@textblock
- convertIndexFromReferenceFrame:toReferenceFrame:
- convertIndexFromReferenceFrame:toReferenceFrame:offset:
@/textblock
</pre>
There are three different types of items (reference frames):
symbols, tokens and elements. A symbol is the smalles possible
unit in an expression. Thus a token consists of one or more
symbols. Similarly an element consists of one or more tokens.
@constant MPElementReferenceFrame
Specifies that items should be interpreted as elements. An
element is either a @c NSString object or a @c MPFunction object.
@constant MPSymbolReferenceFrame
Specifies that items should be interpreted as symbols. A symbol
can be a single character (represented by the @c NSString class)
or a @c MPFunction object.
@constant MPTokenReferenceFrame
Specifies that items should be interpreted as tokens. A token is
a logical unit of content in an expression. This can be a single
character (e.g. '+'), an arbitrary number of characters (e.g. a
number) or a @c MPFunction object.
All tokens conform to the @c MPToken protocol.
*/
typedef NS_ENUM(NSUInteger, MPReferenceFrame) {
MPElementReferenceFrame,
MPSymbolReferenceFrame,
MPTokenReferenceFrame
};
@class MPExpression, MPFunction, MPRangePath, MPParsedExpression;
@protocol MPExpressionElement, MPToken;
/*!
@class MPExpression
@brief An @c MPExpression object is the base object for any mathematical
expression.
@discussion Every expression consists of string elements (represented by the
@c NSString class) and function elements (represented by the @c
MPFunction class). Functions likewise can have expressions as
elements (also called <i>children</i> in this context). Both
expressions and functions are mutable. Through this organization
expression are organized in a tree-like structure called the
'expression tree'.
An expression can evaluate itself giving you either a
result or possibly an error if the expression was not constructed
correctly or could not be evaluated.
*/
@interface MPExpression : NSObject <NSCopying, NSCoding>
#pragma mark Creation Methods
/*!
@methodgroup Creation Methods
*/
/*!
@method init
@brief Initlializes a newly created expression.
@discussion This method is a convenience initializer to initialize an
expression with @c 0 elements.
@return An expression.
*/
- (instancetype)init;
/*!
@method initWithElement:
@brief Initializes a newly created expression with @c element.
@discussion This method is a convenience initializer to initialize an
expression with a single element.
@param element
The element to be added to the expression. The @c element will be
copied.
@return An expression initialized with @c element.
*/
- (instancetype)initWithElement:(id<MPExpressionElement>)element;
/*!
@method initWithElements:
@brief Initializes a newly created expression with the specified
elements.
@discussion All elements must conform to the @c MPExpressionElement protocol.
If one or more objects do not conform to that protocol an @c
MPIllegalElementException is raised.
This method is the designated initializer for the @c MPExpression
class.
@param elements
The elements that should be added to the expression. Every
element must conform to the @c MPExpressionElement protocol. Each
element is copied and the copy is then added to the expression.
The object in the @c elements array is not modified.
@return An expression containing @c elements.
*/
- (instancetype)initWithElements:(NSArray *)elements; /* designated initializer */
#pragma mark Querying Expressions
/*!
@methodgroup Querying Expressions
*/
/*!
@property parent
@brief The receiver's parent.
@discussion Expressions are organized in a tree-like structure. Through this
property an expression's containing function can be accessed.
@warning You should never set this property manually. If you are
implementing a custom subclass of @c MPFunction use the @c
MPFunctionAccessorImplementation macro.
@return The parent of the receiver or @c nil if the receiver is the root
expression.
*/
@property (nonatomic, weak) MPFunction *parent;
/*!
@method rootExpression
@brief Returns the root expression from the receiver's expression tree.
@discussion The root expression is the ultimate parent of all expressions and
functions in the expression tree. A root expression does not have
a parent.
@return The root expression from the receiver's expression tree.
*/
- (MPExpression *)rootExpression;
/*!
@method indexPath
@brief Returns the index path of the receiver in the expression tree.
@discussion The index path is calculated by going up the expression tree
collecting the respective index of the receiver. The indexes are
expressed in the element reference frame. If any of the indexes
exceed the respective receiver's bounds a @c NSRangeException is
raised.
@return The index path of the receiver in the expression tree.
*/
- (NSIndexPath *)indexPath;
/*!
@method countItemsInReferenceFrame:
@brief Returns the number of items in the receiver in the respective
reference frame.
@param referenceFrame
The reference frame that should be used to count the items.
@return The current number of items in the receiver counted in the
specified reference frame.
*/
- (NSUInteger)countItemsInReferenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method itemAtIndex:referenceFrame:
@brief Returns the item at @c anIndex.
@discussion The item is not copied before it is returned. So be aware that
if you mutate a @c MPFunction object returned from this function
the changes will be reflected in the receiver.
@param anIndex
The index of the item. If the index is greater than the number of
items for the respective reference frame an @c NSRangeException
is raised.
@param referenceFrame
The reference frame that should be used to identify the item at
@c anIndex.
@return The item at @c anIndex.
*/
- (id)itemAtIndex:(NSUInteger)anIndex
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method elementAtIndex:referenceFrame:
@brief Returns the element at the specified index.
@discussion An element is either a string or a function. If @c anIndex
specifies a position inside a string the complete string element
is returned.
This method does not return any item in any reference frame but
only complete elements. Use @c -itemAtIndex:referenceFrame: for
that purpose.
@param anIndex
The index of the element.
@param referenceFrame
The reference frame @c anIndex is specified in.
@return The item at @c anIndex.
*/
- (id<MPExpressionElement>)elementAtIndex:(NSUInteger)anIndex
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method indexOfElement:
@brief Returns the index of @c element or @c NSNotFound if it was not
found.
@param element
The element to find.
@return The index of @c element expressed in the element reference frame.
*/
- (NSUInteger)indexOfElement:(id<MPExpressionElement>)element;
/*!
@method itemsInRange:referenceFrame:
@brief Returns an array of the items that are located in the specified
range.
@discussion The objects in the returned array are not copied before they are
returned. You should be aware of the fact that mutations to any
returned objects will be reflected in the receiver.
If the @c range exceeds the receiver's bounds an @c
NSRangeException is raised.
@param aRange
The requested range within the receiver's bounds.
@param referenceFrame
The referenceFrame @c aRange is expressed in.
@return An array of objects that conform to the @c MPExpressionElement
protocol (that is @c NSString objects and @c MPFunction objects).
The length of the returned array is equal to the length of the
specified range.
*/
- (NSArray *)itemsInRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method allItemsInReferenceFrame:
@brief Returns an array of all items in the receiver for the specified
reference frame.
@discussion The elements in the returned array are not copied before they are
returned so be aware that mutations to any of the returned
objects will be reflected in the receiver.
@return An array of all items in the receiver.
*/
- (NSArray *)allItemsInReferenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method elementAtIndexPath:
@brief Returns the element at the specified index path.
@discussion This method @em walks down the expression tree (including
functions) using the specified index path and finds the
corresponding element. The returned object can be an @c NSString,
a @c MPFunction or an @c MPExpression depending on the element @c
indexPath points to. If any of the indexes exceed the bounds of
the respective receiver an @c NSRangeException is raised.
If the index path does not contain any indexes the receiver
itself is returned.
@param indexPath
The index path the required object is located at. The indexes are
expressed in the element reference frame.
@return The element located at @c indexPath. The element is not copied
before it is returned. Be aware of the fact that any mutations
made to the returned object are reflected in the receiver.
*/
- (id)elementAtIndexPath:(NSIndexPath *)indexPath;
/*!
@method convertIndex:fromReferenceFrame:toReferenceFrame:
@brief Converts an index from one reference frame to another.
@discussion This method ignores any offsets into items the conversion between
reference frames can cause. If you are interested in the offset
use @c -convertIndex:fromReferenceFrame:toReferenceFrame:offset:
instead.
@param anIndex
The index to be converted.
@param fromReferenceFrame
The reference frame @c anIndex is specified in.
@param toReferenceFrame
The reference frame @c anIndex should be converted to.
@return An index specified in the @c toReferenceFrame. If @c anIndex
specifies a location inside an item in the @c toReferenceFrame
the index of the corresponding item is returned.
*/
- (NSUInteger)convertIndex:(NSUInteger)anIndex
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame;
/*!
@method convertIndex:fromReferenceFrame:toReferenceFrame:offset:
@brief Converts an index from one reference frame to another.
@discussion If @c anIndex specifies a location inside an item in the @c
toReferenceFrame the index of the corresponding item is returned.
@param anIndex
The index to be converted.
@param fromReferenceFrame
The reference frame @c anIndex is specified in.
@param toReferenceFrame
The reference frame @c anIndex should be converted to.
@param offset
This output parameter will be set to the number of symbols that
are between the location specified by @c anIndex and the index
that is actually returned. The offset is specified in the symbol
reference frame. If you are not interested in the offset pass
@c NULL.
@return An index specified in the @c toReferenceFrame corresponding to
@c anIndex.
*/
- (NSUInteger)convertIndex:(NSUInteger)anIndex
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame
offset:(out NSUInteger *)offset;
/*!
@method convertRange:fromReferenceFrame:toReferenceFrame:
@brief Converts a range from one reference frame to another.
@discussion This method just converts the location and target of the range
separately using @c
-convertIndex:fromReferenceFrame:toReferenceFrame:. This method
ensures that the returned range definitely includes all items
that were specified by @c aRange.
This method ignores the possibility that the returned range may
include more than @a aRange. If you need that information use
@c -convertRange:fromReferenceFrame:toReferenceFrame:leadingOffset:trailingOffset:.
@param aRange
The range to be converted.
@param fromReferenceFrame
The reference frame @c aRange is specified in.
@param toReferenceFrame
The reference frame @c aRange is to be converted to.
@return A range in the @c toReferenceFrame that includes the the items
specified by @c aRange.
*/
- (NSRange)convertRange:(NSRange)aRange
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame;
/*!
@method convertRange:fromReferenceFrame:toReferenceFrame:leadingOffset:trailingOffset:
@brief Converts a range from one reference frame to another.
@discussion This method just converts the location and target of the range
separately using @c
-convertIndex:fromReferenceFrame:toReferenceFrame:. This method
ensures that the returned range definitely includes all items
that were specified by @c aRange.
@param aRange
The range to be converted.
@param fromReferenceFrame
The reference frame @c aRange is specified in.
@param toReferenceFrame
The reference frame @c aRange is to be converted to.
@param leadingOffset
The offset of the location of the returned range in respect to
the location of @c aRange.
@param trailingOffset
The offset of the last index in the range in respect to the last
index of @c aRange.
@return A range in the @c toReferenceFrame that includes the the items
specified by @c aRange.
*/
- (NSRange)convertRange:(NSRange)aRange
fromReferenceFrame:(MPReferenceFrame)fromReferenceFrame
toReferenceFrame:(MPReferenceFrame)toReferenceFrame
leadingOffset:(NSUInteger *)leadingOffset
trailingOffset:(NSUInteger *)trailingOffset;
#pragma mark Mutating Expressions
/*!
@methodgroup Mutating Expressions
*/
/*!
@method replaceItemsInRange:referenceFrame:withElements:
@brief Replaces the elements in the specified range with the contents of
the @c elements array.
@discussion This is the most primitive mutation method of @c MPExpression.
Every other mutating method utlimately must call this method.
After the receiver has been mutated the integrety of the receiver
is restored. That basically means that subsequent strings are
joined and empty strings removed. After restoring integrity the
receiver sends a @c
-changedElementsInIndexedRangePath:replacementLength: to
itself. For more information see the documentation on that
method.
@param aRange
The @c range of symbols (including functions) to replace.
@param referenceFrame
The reference frame @c aRange is specified in.
@param elements
The elements that should replace the symbols specified by @c
range.
*/
- (void)replaceItemsInRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame
withElements:(NSArray *)elements;
/*!
@method changedElementsInRangePath:replacementLength:
@brief Called after the receiver has been mutated.
@discussion This method does nothing more than notify it's parent that it has
been mutated at the receiver's index. If you need to know about
changes in an expression you should override this method instead
of @c -replaceSymbolsInRange:withElements: because this method
gives you information about the number of elements changed during
the mutation.
@param rangePath
The range path at which the receiver was changed starting at the
receiver. The range addressed by @c rangePath is expressed in the
element reference frame.
@param replacementLength
The number of elements replacing the elements specified by @c
rangePath (also specified in the element reference frame).
*/
- (void)changedElementsInRangePath:(MPRangePath *)rangePath
replacementLength:(NSUInteger)replacementLength;
/*!
@method subexpressionFromIndex:referenceFrame:
@brief Creates an expression from the items in the receiver from the
specified index to the end.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver.
@param from
The index from which to start constructing the subexpression.
@param referenceFrame
The reference frame @c from is specified in.
@return An expression containing the items from the specified index to
the end of the receiver.
*/
- (MPExpression *)subexpressionFromIndex:(NSUInteger)from
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method subexpressionToIndex:referenceFrame:
@brief Creates an expression from the items in the receiver from the
first item to the end.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver.
@param to
The index of the first element not to include in the newly
constructed subexpression.
@param referenceFrame
The reference frame @c to is specified in.
@return An expression containing the items from the first item to the one
at the specified index.
*/
- (MPExpression *)subexpressionToIndex:(NSUInteger)to
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method subexpressionWithRange:referenceFrame:
@brief Creates an expression from the items in the receiver within the
specified range.
@discussion The items from the receiver are copied. Mutations to the returned
expression will not change the receiver.
@param aRange
Specifies the items to be included in the newly created
subexpression.
@param referenceFrame
The reference frame @c aRange is specified in.
@return An expression containing the items in @c aRange.
*/
- (MPExpression *)subexpressionWithRange:(NSRange)aRange
referenceFrame:(MPReferenceFrame)referenceFrame;
#pragma mark Evaluating Expressions
/*!
@methodgroup Evaluating Expressions
*/
/*!
@method evaluateWitErrors:
@brief Evaluates the receiver.
@discussion This is a convenience method for evaluating an expression. If you
want more control over the evaluation process use @c -parse
instead.
@param errors
If the receiver (or any of its elements) contain syntax errors or
can not be evaluated this parameter is set to an appropriate
value. All items in the array are @c NSError instances. This
parameter is never set to an empty array.
Pass @c NULL if you are not interested in any errors that might
occur.
@return The result of the evaluation or @c nil of the receiver could not
be evaluated. In that case the @c error parameter is set to an
appropriate value.
*/
- (NSDecimalNumber *)evaluateWithErrors:(NSArray *__autoreleasing *)errors;
/*!
@method parse:
@brief Parses the receiver.
@discussion This is a convenience method that calls @c
-parseExpectingVariable:errors: with @c NO as the first argument.
@param errors
If the receiver (or any of its elements) contain syntax errors
this parameter is set to an appropriate value. All items in the
array are @c NSError instances. This parameter is never set to an
empty array.
Pass @c NULL if you are not interested in any errors that might
occur.
@return A @c MPParsedExpression object that represents the receiver and
can be evaluated or @c nil if an error occurs. In that case the
@c errors parameter is set to an array containing at least one
@c NSError instance.
*/
- (MPParsedExpression *)parse:(NSArray *__autoreleasing *)errors;
/*!
@method parseExpectingVariable:errors:
@brief Parses the receiver.
@param flag
If @c YES the receiver must (exept for whitespaces) begin with a
single letter followed by an equals sign. If it doesn't the
expression is considered invalid. Specify @c NO If the expression
should be evaluatable by itself.
@param errors
If the receiver (or any of its elements) contain syntax errors
this parameter is set to an appropriate value. All items in the
array are @c NSError instances. This parameter is never set to an
empty array.
Pass @c NULL if you are not interested in any errors that might
occur.
@return A @c MPParsedExpression object that represents the receiver and
can be evaluated or @c nil if an error occurs. In that case the
@c errors parameter is set to an array containing at least one
@c NSError instance.
*/
- (MPParsedExpression *)parseExpectingVariable:(BOOL)flag
errors:(NSArray *__autoreleasing *)errors;
@end
/*!
@category MPExpression (MPExpressionConvenience)
@brief This category defines convenience methods for the @c MPExpression
class.
@discussion All convenience methods are completely defined in terms of other
methods of the @c MPExpression class.
*/
@interface MPExpression (MPExpressionConvenience)
#pragma mark Querying Expressions
/*!
@methodgroup Querying Expressions
*/
/*!
@method countElements
@brief Returns the number of elements in the receiver.
@return The number of elements in the receiver expressed in the element
reference frame.
*/
- (NSUInteger)countElements;
/*!
@method countSymbols
@brief Returns the number of symbols in the receiver.
@return The number of symbols in the receiver expressed in the symbol
reference frame.
*/
- (NSUInteger)countSymbols;
/*!
@method countTokens
@brief Returns the number of tokens in the receiver.
@return The number of tokens in the receiver expressed in the token
reference frame.
*/
- (NSUInteger)countTokens;
/*!
@method elementAtIndex:
@brief Returns the element at the specified index.
@param anIndex
The index of the element specified in the element reference
frame.
@return The element at @c anIndex.
*/
- (id<MPExpressionElement>)elementAtIndex:(NSUInteger)anIndex;
/*!
@method symbolAtIndex:
@brief Returns the symbol at the specified index.
@param anIndex
The index of the symbol specified in the symbol reference frame.
@return The symbol at @c anIndex.
*/
- (id<MPExpressionElement>)symbolAtIndex:(NSUInteger)anIndex;
/*!
@method tokenAtIndex:
@brief Returns the token at the specified index.
@param anIndex
The index of the token specified in the token reference frame.
@return The token at @c anIndex.
*/
- (id<MPToken>)tokenAtIndex:(NSUInteger)anIndex;
#pragma mark Mutating Expressions
/*!
@methodgroup Mutating Expressions
*/
/*!
@method appendElement:
@brief Appends @c anElement to the receiver.
@param anElement
The element to append to the receiver.
*/
- (void)appendElement:(id<MPExpressionElement>)anElement;
/*!
@method appendElements:
@brief Appends the objects from @c elements to the receiver.
@param elements
The elements to append to the receiver.
*/
- (void)appendElements:(NSArray *)elements;
/*!
@method insertElement:atIndex:referenceFrame:
@brief Inserts @c anElement at the specified index.
@param anElement
The element to be inserted.
@param index
The index where to insert @c anElement.
@param referenceFrame
The reference frame @c index is specified in.
*/
- (void)insertElement:(id<MPExpressionElement>)anElement
atIndex:(NSUInteger)index
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method insertElements:atIndex:referenceFrame:
@brief Inserts @c elements at the specified index.
@param elements
The elements to be inserted.
@param index
The index where to insert @c elements.
@param referenceFrame
The reference frame @c index is specified in.
*/
- (void)insertElements:(NSArray *)elements
atIndex:(NSUInteger)index
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method deleteElementsInRange:
@brief Removes the elements specified by @c range from the receiver.
@param range
The range of items to remove from the receiver.
@param referenceFrame
The reference frame @c range is specified in.
*/
- (void)deleteElementsInRange:(NSRange)range
referenceFrame:(MPReferenceFrame)referenceFrame;
@end