Archived
1

Invalid Numbers Are Now a Syntax Error

Syntax Errors Now Include a Range
Syntax Errors Are Now Displayed in a Selectable List
This commit is contained in:
Kim Wittenburg
2014-11-29 00:19:52 +01:00
parent 4bc2fdead1
commit b6973dc24a
6 changed files with 62 additions and 43 deletions

View File

@@ -25,7 +25,7 @@
#import "MPFactorialTerm.h"
#define success() state = 0
#define fail() state = -1
#define fail() self.errorTokenIndex = self.currentTokenIndex; state = -1
@interface MPExpressionParser ()
@@ -85,13 +85,13 @@
if (flag && hasVariableDefinition) {
result.definedVariable = variableName;
} else if (flag) {
[self addErrorWithCode:3 localizedDescription:NSLocalizedString(@"Expected Variable Definition.", nil)];
[self addErrorWithCode:3 localizedDescription:NSLocalizedString(@"Expected Variable Definition.", nil) useRange:NO];
if (errors) {
*errors = self.errors;
}
return nil;
} else if (hasVariableDefinition) {
[self addErrorWithCode:4 localizedDescription:NSLocalizedString(@"Unexpected Variable Definition.", nil)];
[self addErrorWithCode:4 localizedDescription:NSLocalizedString(@"Unexpected Variable Definition.", nil) useRange:NO];
if (errors) {
*errors = self.errors;
}
@@ -102,7 +102,7 @@
[self skipWhitespaces];
if (self.currentTokenIndex >= self.tokens.count) {
[self addErrorWithCode:5 localizedDescription:NSLocalizedString(@"Empty Expression.", nil)];
[self addErrorWithCode:5 localizedDescription:NSLocalizedString(@"Empty Expression.", nil) useRange:NO];
if (errors) {
*errors = self.errors;
}
@@ -173,6 +173,7 @@
}
state = 6;
} else {
self.value = nil;
state = 4;
}
break;
@@ -191,7 +192,6 @@
[self.valueGroup addObject:self.value];
state = 5;
} else {
self.errorTokenIndex = self.currentTokenIndex;
fail();
}
break;
@@ -376,9 +376,10 @@
MPPowerTerm *term = [[MPPowerTerm alloc] initWithFunction:(MPFunction *)self.currentToken errors:&errors];
if (!term) {
[self.errors addObjectsFromArray:errors];
} else {
term.baseTerm = self.value;
self.value = term;
}
term.baseTerm = self.value;
self.value = term;
}
[self nextToken];
} else {
@@ -389,15 +390,22 @@
- (void)addErrorWithCode:(NSInteger)code
localizedDescription:(NSString *)description
useRange:(BOOL)flag
{
NSInteger errorIndex = [self.expression convertIndex:self.errorTokenIndex
fromReferenceFrame:MPTokenReferenceFrame
toReferenceFrame:MPSymbolReferenceFrame];
NSRange errorRange;
if (flag) {
errorRange = [self.tokens[self.errorTokenIndex] range];
} else {
NSInteger errorIndex = [self.expression convertIndex:self.errorTokenIndex
fromReferenceFrame:MPTokenReferenceFrame
toReferenceFrame:MPSymbolReferenceFrame];
errorRange = NSMakeRange(errorIndex, 0);
}
[self.errors addObject:[NSError errorWithDomain:MPMathKitErrorDomain
code:code
userInfo:@{NSLocalizedDescriptionKey: description,
MPPathToExpressionKey: self.expression.indexPath,
MPErrorIndexKey: @(errorIndex)}]];
MPErrorRangeKey: [NSValue valueWithRange:errorRange]}]];
}
- (BOOL)errorOccured
@@ -405,13 +413,15 @@
[self skipWhitespaces];
if (self.currentTokenIndex < self.tokens.count) {
if (self.errorTokenIndex >= self.tokens.count) {
[self addErrorWithCode:0 localizedDescription:NSLocalizedString(@"Unexpected end. Expected Value.", nil)];
[self addErrorWithCode:0 localizedDescription:NSLocalizedString(@"Unexpected end. Expected Value", nil) useRange:NO];
} else {
id<MPToken> unexpectedToken = self.tokens[self.errorTokenIndex];
if (unexpectedToken.tokenType == MPPowerToken) {
[self addErrorWithCode:34 localizedDescription:NSLocalizedString(@"No base for Power", nil)];
[self addErrorWithCode:34 localizedDescription:NSLocalizedString(@"No base for Power", nil) useRange:NO];
} else if (unexpectedToken.tokenType == MPDeformedNumberToken) {
[self addErrorWithCode:42 localizedDescription:NSLocalizedString(@"Not a Number", nil) useRange:YES];
} else {
[self addErrorWithCode:1 localizedDescription:NSLocalizedString(@"Unexpected Symbol. Expected Value", nil)];
[self addErrorWithCode:1 localizedDescription:NSLocalizedString(@"Unexpected Symbol. Expected Value", nil) useRange:NO];
}
}
}