Question

Le ParseKit aventure continue...et mon prochain obstacle est d'essayer d'obtenir de retour à la ligne des symboles reconnus.

Voici ma grammaire:

@symbolState = '\n';
@start = textline*;
textline = Any* eol;
eol = '\n';

Voici mon test de texte:

1
2
3
4
5

Le texte est lu à partir d'un fichier texte UTF-8 avec format Unix (LF) les fins de ligne.J'ai vérifié que le format à la fois dans Xcode (inspecteur de fichiers -> Paramètres de Texte) ainsi que de l'extérieur, avec TextWrangler.

Et voici le code correspondant:

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

@interface FileImporterThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)parser:(PKParser *)p didMatchTextline:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchEol:(PKAssembly *)a;
@end


@implementation FileImporterThing

@synthesize parser = _parser;

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

    // Have also tried "textline = Any* '\n';"
    NSString *g = @"@symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n';";
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];

    return self;
}

- (void)testParse
{
    // read string from UTF-8 file Unix (LF) line endings 
    // (this verified in project->file inspector->Text Settings and externally with TextWrangler)
    NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"LF-test" ofType:@"parsetext"];
/* file contains text:
1
2
3
4
5

*/
    NSString *s = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    [self.parser parse:s];
}

- (void)parser:(PKParser *)p didMatchEol:(PKAssembly *)a
{
    NSLog(@"eol found");// stack = %@", [a stack]);
}

- (void)parser:(PKParser *)p didMatchTextline:(PKAssembly *)a
{
    NSLog(@"textline matched");
}

@end

Mais j'ai peur que la peinture n'est tout simplement pas de séchage!Ont essayé toutes sortes de variations sur le dessus de.Je ne peux pas pour la vie de me l'analyseur de reconnaître un caractère de saut de ligne.Je peux probablement contourner cela, en lisant le fichier tampon-ligne par ligne (ce qui pourrait être plus performant de toute façon?) mais il serait agréable d'avoir l'option de mise en correspondance ' '.

Était-ce utile?

La solution

Développeur de ParseKit ici.Deux choses que je peux vous apporter:


1.

J'ai essayé votre exemple à l'aide d'un fichier texte créé dans TextMate ou TextWrangler (enregistré en tant que .fichier txt), et tout semblait bien fonctionner.Mon -parser:didMatchEol: et -parser:didMatchTexline: des rappels ont été appelés comme prévu.

Si cela ne fonctionne pas pour vous, peut-être essayer de commencer avec en mémoire la chaîne d'entrée pour voir si au moins que ce sera le travail:

NSString *s = @"foo bar\nbaz bat\n";
[parser parse:s];

De toute façon, voici mon code de DebugAppDelegate.m qui travaille pour moi, soit dans la mémoire d'entrée ou sur le disque d'entrée:

- (void)doTestGrammar {
    NSString *g = @"@symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n';";
    PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
    //NSString *s = @"foo bar\nbaz bat\n";
    NSString *path = [@"~/Desktop/text.txt" stringByExpandingTildeInPath];
    NSString *s = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [p parse:s];
}

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

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

2.

En fait j'ai été un peu surpris de voir que votre exemple a travaillé toutefois, comme je l'ai pensé de votre utilisation de l' Any* la production goulûment consommer de l' \n jetons à la fin de la ligne, ce ne laissant rien pour l' eol la production de match.

Cependant, comme je l'ai mentionné, ce n'était pas un problème quand j'ai couru votre exemple (contre ParseKit la TÊTE du tronc).

Encore, pour faire bonne mesure, je vous recommanderais sûrement la modification de votre textline la production de cette:

textline = ~eol* eol;

la définition de cette production doit être lu comme suit:

zéro, un ou plusieurs jetons PAS compensée par eol, suivi par un jeton compensée par eol

~ est la négation booléenne opérateur dans ParseKit grammaire syntaxe.

Après avoir fait ce changement à mon exemple de code, tout a fonctionné comme prévu.


Si vous ne pouvez toujours pas obtenir ce travail à l'issue de ces deux conseils, faites le moi savoir.

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