Frage

Nachdem ich mich ein wenig mit der Syntax der ParseKit-Grammatik vertraut gemacht habe (ich habe in der Demo-App herumgespielt), versuche ich jetzt, meine eigene Mini-Demo zum Laufen zu bringen, aber bisher ohne großen Erfolg.Die Assembler-Rückrufe werden nicht aufgerufen.

Nachfolgend finden Sie eine gekürzte Version davon relevant Code.Wann testParse Läuft der Parser, scheint alles in Ordnung zu sein und passt meine Zeichenfolge korrekt zu meiner anything Produktion (was auch in der Demo funktioniert), aber didMatchAnything:wird einfach nicht angerufen.

#import <Foundation/Foundation.h>

@class PKParser;

@interface FileParserThing : NSObject {
    PKParser* _parser;
}
- (void)testParse;
@end


#import <ParseKit/ParseKit.h>
#import "FileParserThing.h"

@interface FileParserThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)didMatchAnything:(PKAssembly *)a;
@end

@implementation FileParserThing

@synthesize parser = _parser;

-(id)init
{
    if (!(self = [super init])) return nil;

    NSString *g = @"@start = anything; anything = Any+;";
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];

    return self;
}

- (void)testParse
{
    NSString *s = @"Foo Bar";
    NSLog(@"test parse with: %@", s);
    [self.parser parse:s];
}

- (void)didMatchAnything:(PKAssembly *)a
{
    NSLog(@"Hooray!");
}

@end

Wenn ich im ParseKit-Code herumwühle, kann ich Zeile 129 von PKParser sehen

[assembler performSelector:assemblerSelector withObject:self withObject:a];

Wird nicht hingerichtet, weil assembler ist gleich Null.Was mich wiederum zur Parser-Fabrik führt;wo mein Verständnis dessen, was vor sich geht, zu scheitern beginnt.

Haftungsausschluss;Ich weiß, ich muss wahrscheinlich lesen Das Buch, aber eins nach dem anderen.Ich möchte einen kleinen Machbarkeitsnachweis erbringen, bevor ich 30 Mäuse für ein Buch austeile, das ich vielleicht nie wieder lesen werde, wenn mein Projekt nicht zum Erfolg führt :)

War es hilfreich?

Lösung

Entwickler von ParseKit hier.

Vor einiger Zeit habe ich die Signatur der Assembler-Rückrufe in „Akzeptieren“ geändert zwei Argumente:

  1. Der Parser die mit dem aktuellen Token übereinstimmte.
  2. Der Montage Enthält den aktuellen Status der Eingabeanalyse.

Zuvor gab es nur eins Streit:Die Versammlung.

Ich bin mir nicht sicher, ob die Dokumente vollständig aktualisiert sind, um dies widerzuspiegeln.

Ich vermute also, dass es funktionieren wird, wenn Sie einfach Ihre Assembler-Rückrufmethode wie folgt ändern:

- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
    NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}

Wenn nicht, lassen Sie es mich wissen und ich helfe Ihnen beim weiteren Debuggen.


Zum Hintergrund:Ich habe diese Änderung vorgenommen, weil ich in eine Situation geraten bin, in der mein Assembler-Rückruf unbedingt den Parser überprüfen musste, der gerade die aktuelle Übereinstimmung erstellt hatte.

Außerdem wurde die strenge Kakaokonvention von enger angeglichen Delegieren Rückrufe, die immer das haben Delegierter Objekt als ihr erstes Argument.Im Nachhinein wünschte ich mir, ich hätte das gesamte Konzept umbenannt Monteure in ParseKit zu Delegierte.Denn im Kakao-Sprachgebrauch sind das im Grunde die Assembler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top