Domanda

L'avventura di Parsekit continua ... e il mio prossimo ostacolo sta cercando di ottenere simboli Newline riconosciuti.

Ecco la mia grammatica:

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

Ecco il mio testo del test:

1
2
3
4
5
.

Il testo viene letto da un file di testo UTF-8 con terminazioni linee UNIX Formato (LF).Ho verificato quel formato sia in Xcode (ispettore file -> Impostazioni testo) che esternamente, con TextWranGler.

Ed ecco il codice pertinente:

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

Ma temo che la vernice non sia asciugata!Hanno provato tutti i tipi di variazioni su quanto sopra.Non posso per la vita di me ottenere il parser per riconoscere una nuova linea.Probabilmente posso lavorare intorno a questo, leggendo la riga del buffer di file in linea (che potrebbe essere comunque più performante?) Ma sarebbe comunque bello avere la possibilità di abbinare '\ n'.

È stato utile?

Soluzione

Sviluppatore di parrsekit qui. Due cose che posso contribuire:


.

1.

Ho provato il tuo esempio utilizzando un file di testo creato in TextMate o TextWranGler (salvato come file .txt), e tutto sembrava funzionare bene. I miei callback -parser:didMatchEol: e -parser:didMatchTexline: sono stati chiamati come previsto.

Se questo non funziona per te, magari provare a iniziare con l'ingresso della stringa in-memory per vedere se almeno questo funzionerà:

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

Comunque, ecco il mio codice da DebugAppDelegate.m che funziona per me con ingresso in-memoria o ingresso su disco:

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

Ero in realtà un po 'sorpreso che il tuo esempio abbia funzionato tuttavia, come pensavo che il tuo uso della produzione Any* avrebbe consumato avidamente i token \n alla fine della linea, non lasciando così nulla per la produzione di eol. Tuttavia, come ho detto, questo non era un problema quando ho corso il tuo esempio (contro la testa di Parsekit del tronco).

Eppure, per buona misura, probabilmente consiglierei di modificare la produzione di textline a questo:

textline = ~eol* eol;
.

La definizione di questa produzione dovrebbe essere letta come:

zero o più token non corrispondenti da eol, seguito da un token abbinato da eol

~ è l'operatore di negazione booleano nella sintassi della grammatica di Parsekit.

Dopo aver effettuato questa modifica al mio codice di esempio, tutto è stato ancora funzionato come previsto.


Se ancora non riesci a farlo funzionare dopo questi due suggerimenti, fammi sapere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top