Entwickler von ParseKit hier.
Es gibt zwei Funktionen in ParseKit, die verwendet werden können, um benutzerlesbare Hinweise zur Beschreibung von Syntaxfehlern zu liefern, die bei der Eingabe auftreten.
-[PKParser bestMatchFor:]
- Die
PKTrack
Klasse
Es klingt wie Sie sich der -bestMatchFor:
Methode sind, auch wenn es nicht tut, was Sie in diesem Fall erwarten.
Ich denke, die PKTrack
Klasse wird hier hilfreicher sein. Wie in Metsker's book beschrieben, ist PKTrack
genau wie PKSequence
, außer dass seine Unterparser benötigt werden, und ein Fehler wird ausgelöst (mit einer hilfreichen Fehlermeldung), wenn alle Subparser nicht übereinstimmen.
hier ist also eine Grammatik für Ihr Beispiel Eingabe:
@start = '(' expr ')' | expr;
expr = ('+' | '-') term term;
term = '(' expr ')' | Word;
Alle aneinander angrenzend aufgeführten Produktionen sind eine Folge - aber könnte stattdessen eine Spur sein.
Der Vorteil des Änderns dieser Sequenzen in Tracks besteht darin, dass ein NSException
mit einer für Menschen lesbaren Analysefehlermeldung ausgelöst wird, wenn die Eingabe nicht übereinstimmt. Der Nachteil besteht darin, dass Sie jetzt alle Verwendungen Ihres in der Factory generierten Parsers in einen try/catch-Block einschließen müssen, um diese Track-Ausnahmen zu erfassen.
Das Problem zur Zeit (oder vor jetzt, zumindest) ist, dass die PKParserFactory
nie einen Parser mit Tracks produziert. Stattdessen würde es immer Sequenzen verwenden.
So habe ich nur eine neue Option in Kopf des Rumpfes um Google Code hinzugefügt (Sie müssen udpate).
#define USE_TRACK 0
in
PKParserFactory.m
Es ist 0
standardmäßig. Wenn Sie diese Definition zu 1
ändern, werden Spuren anstelle von Sequenzen verwendet. So angesichts der Grammatik oben und ungültige Eingabe wie folgt aus:
(+ a - b c))
und dieser Client-Code:
NSString *g = // fetch grammar above
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"(+ a - b c))";
@try {
PKAssembly *res = [p parse:s];
NSLog(@"res %@", res);
}
@catch (NSException *exception) {
NSLog(@"Parse Error:%@", exception);
}
Sie einen schönen ish Menschen lesbare Fehlermeldung erhalten:
Parse Error:
After : (+ a
Expected : Alternation (term)
Found : -
Hoffnung das hilft.