Frage

Das ParseKit-Abenteuer geht weiter...und meine nächste Hürde besteht darin, Zeilenumbrüche zu erkennen.

Hier ist meine Grammatik:

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

Hier ist mein Testtext:

1
2
3
4
5

Der Text wird aus einer UTF-8-Textdatei mit Zeilenenden im Unix-Format (LF) gelesen.Ich habe dieses Format sowohl in Xcode (Dateiinspektor -> Texteinstellungen) als auch extern mit TextWrangler überprüft.

Und hier ist der entsprechende Code:

#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

Aber ich fürchte, die Farbe trocknet einfach nicht!Habe alle möglichen Variationen des oben Gesagten ausprobiert.Ich schaffe es beim besten Willen nicht, den Parser dazu zu bringen, eine neue Zeile zu erkennen.Ich kann das wahrscheinlich umgehen, indem ich den Dateipuffer Zeile für Zeile lese (was vielleicht sowieso leistungsfähiger ist?), aber es wäre trotzdem schön, die Option zu haben, „ “ abzugleichen.

War es hilfreich?

Lösung

Entwickler von ParseKit Hier.Zwei Dinge kann ich beitragen:


1.

Ich habe Ihr Beispiel mit einer in TextMate oder TextWrangler erstellten Textdatei (gespeichert als TXT-Datei) ausprobiert und alles schien gut zu funktionieren.Mein -parser:didMatchEol: Und -parser:didMatchTexline: Rückrufe wurden wie erwartet aufgerufen.

Wenn dies bei Ihnen nicht funktioniert, versuchen Sie vielleicht, mit der In-Memory-String-Eingabe zu beginnen, um zu sehen, ob zumindest das funktioniert:

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

Wie auch immer, hier ist mein Code von DebugAppDelegate.m was bei mir entweder mit In-Memory-Eingabe oder On-Disk-Eingabe funktioniert:

- (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.

Ich war tatsächlich ein wenig überrascht, dass Ihr Beispiel funktioniert hat, da ich dachte, dass Sie das verwenden Any* Die Produktion würde die gierig verzehren \n Token am Ende der Zeile, so dass nichts mehr übrig bleibt eol Produktion passend.

Wie bereits erwähnt, war dies jedoch kein Problem, als ich Ihr Beispiel ausführte (gegen ParseKit HEAD of Trunk).

Dennoch würde ich zur Sicherheit wahrscheinlich empfehlen, Ihre zu ändern textline Produktion dazu:

textline = ~eol* eol;

Die Definition dieser Produktion sollte wie folgt lauten:

Null oder mehr Token, mit denen NICHT übereinstimmt eol, gefolgt von einem Token, der mit übereinstimmt eol

~ ist der boolesche Negationsoperator in der ParseKit-Grammatiksyntax.

Nachdem ich diese Änderung an meinem Beispielcode vorgenommen hatte, funktionierte immer noch alles wie erwartet.


Wenn Sie es nach diesen beiden Tipps immer noch nicht zum Laufen bringen, lassen Sie es mich wissen.

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