2011-08-17 2 views
3

Je viens de découvrir ParseKit mais je n'arrive pas à le faire fonctionner sur un exemple simple.Impossible d'obtenir un exemple ParseKit simple

NSString *test = @"FOO:BAR"; 

    NSString *grammar = ...//get grammar txt file and read it into a string 

    PKParser *parser = nil; 
    parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self]; 

    [parser parse:test]; 
} 

- (void)didMatchFoo:(PKAssembly *)a 
{ 
    NSLog(@"FOO"); 
} 

- (void)didMatchBar:(PKAssembly *)a 
{ 
    NSLog(@"BAR"); 
} 

Mon fichier de grammaire ressemble à ceci:

@start = foo; 
foo = 'FOO:' bar; 
bar = 'BAR'; 

Mais les méthodes ne se déclenchent pas.

+0

NSString * grammaire = @ "@ start = foo, foo = 'FOO:' bar, bar = 'bar';"; n'a pas fonctionné non plus – JPC

Répondre

2

Développeur de ParseKit ici. L'exemple ci-dessus ne fonctionnera pas. Par défaut, le Tokenizer sera tokenize ceci:

FOO:BAR 

que trois jetons:

Word (FOO) 
Symbol (:) 
Word (BAR) 

Le problème est votre grammaire attend un mot comme « FOO: », mais les deux points sont les caractères Symbole par défaut, non Mot chars. Si vous voulez que les deux-points (:) soient acceptés comme caractères "Word" internes valides, vous devrez personnaliser le Tokenizer pour qu'il accepte cela. Je doute que tu veuilles vraiment ça. Si vous le faites, lisez les documents ici pour savoir comment personnaliser l'Tokenizer: http://parsekit.com/tokenization.html

Je pense qu'une meilleure grammaire jouet »pour commencer peut-être quelque chose comme:

@start = pair; 
pair = foo colon bar; 
foo = 'FOO'; 
colon = ':'; 
bar = 'BAR'; 

Vous avez beaucoup de flexibilité dans la façon dont vous faites vos déclarations dans votre grammaire. Une grammaire équivalente serait:

@start = foo ':' bar; 
foo = 'FOO'; 
bar = 'BAR'; 
+0

Cela l'a fait. Merci! – JPC