Question

Avoir se familiariser un peu avec le ParseKit grammaire syntaxe (en jouant à la démo app) je vais maintenant essayer d'obtenir mon propre mini démo de travail, mais jusqu'à présent sans grand succès.L'assembleur rappels ne sont pas appelé.

Ci-dessous est une version condensée de l' pertinentes code.Lorsque testParse exécute l'analyseur semble faire OK et correspondre correctement mes cordes à mon anything de production (qui travaille également dans la démo) mais didMatchAnything:n'est tout simplement pas appelé.

#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

Creuser autour de la ParseKit code je vois que la ligne 129 de PKParser

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

N'est pas en cours d'exécution, parce que assembler est nul.Qui, à son tour, me conduit à l'analyseur de l'usine;d'où ma compréhension de ce qui se passe commence à manquer.

Avertissement;Je sais, j'ai probablement besoin de lire Le Livre, mais une chose à la fois.Je veux recevoir une petite preuve de concept de travail, avant de bifurquer 30 souris pour un livre que j'ai peut-être jamais lu encore si mon projet est un non-starter :)

Était-ce utile?

La solution

Développeur de ParseKit ici.

Un temps, j'ai changé la signature de l'Assembleur rappels à accepter deux arguments:

  1. L' Analyseur et qui correspondait à l'actuelle jeton.
  2. L' Assemblée contenant l'état actuel de l'entrée de l'analyse.

Auparavant, il y avait seulement été un argument:L'Assemblée.

Je ne suis pas sûr que les docs sont entièrement mis à jour pour refléter ce changement.

Donc je pense que si vous changez simplement votre Assembleur de la méthode de rappel de cela, il va fonctionner:

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

Si non, laissez-moi savoir, et je vais vous aider à développer plus de débogage.


Pour le fond:J'ai fait ce changement, parce que j'ai couru dans une situation où mon Assembleur de rappel vraiment nécessaire d'inspecter l'Analyseur qui venait de faire le match en cours.

Il a également aligné de plus près le fort de Cacao convention de Délégué les rappels qui ont toujours le délégataire objet en tant que premier argument.Avec le recul, je souhaite plutôt j'avais renommé le concept de Les assembleurs dans ParseKit à Les délégués.Depuis dans le Cacao, le langage, qui est fondamentalement ce que les Assembleurs sont.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top