2012-04-10 8 views
3

Ich verwende PK, um das .gift-Dateiformat zu versuchen und zu tokenisieren. Ich versuche, die folgendes zu tun:Wie filtert man unerwünschte Token mit ParseKit aus?

einen String gegeben, die dieser ähnelt: @ „= 2 + 2“

Ich versuche, ‚2 + 2‘ zurückzukehren, ohne zu bestimmen, durch den Aufwand geht, wenn Das Token, das über diese Zeichenfolge hinausgeht, ist gleich einem Symbol und definiert dann, wie die Ausgabekette sein sollte. Was ich versuche, ist zu sagen, dass, wenn [PKToken.stringValue isEqualToString: @ "="] ist, dieser Wert aus dem PKTokenizer herausgenommen wird und dann der Rest der Zeichenkette mit der noch intakt gebliebenen Formatierung zurückgegeben wird.

Lassen Sie mich wissen, ob dies klar genug war ...

--Skylar.

Antwort

2

Entwickler von ParseKit hier. Hier ist meine ParseKit Tokenizer Antwort.

Zuerst muss ich sagen, dass die einfache Filterung einzelner Zeichen wahrscheinlich besser mit regulären Ausdrücken als ParseKit durchgeführt wird.

Das heißt, wenn Sie diese Art der Sache mit dem ParseKit tokenizer zu tun versuchen, ist hier, wie:

NSString *s = @"= 2 + 2"; 
PKTokenizer *t = [PKTokenizer tokenizerWithString:s]; 
t.whitespaceState.reportsWhitespaceTokens = YES; 

PKToken *eof = [PKToken EOFToken]; 
PKToken *tok = nil; 

NSMutableArray *toks = [NSMutableArray array]; 
while ((tok = [t nextToken]) != eof) { 
    if (![tok.stringValue isEqualToString:@"="]) { 
     [toks addObject:tok]; 
    } 
} 

NSString *result = [toks componentsJoinedByString:@""]; 
NSLog(@"%@", result); 
2

Entwickler von ParseKit hier. Hier ist meine ParseKit Grammatik Antwort.

Wiederum muss ich sagen, dass das einfache Filtern einzelner Zeichen wahrscheinlich besser mit regulären Ausdrücken als mit ParseKit durchgeführt werden kann.

Das heißt, wenn Sie diese Art der Sache mit einem ParseKit Grammatik zu tun versuchen, hier einen Weg:

Meine Grammatik:

@reportsWhitespaceTokens = YES; 

@start = (reject! | passThru)+; 
reject = '='; 
passThru = ~reject; 

Das ! bedeutet Verwerfungs dieses Token . Die ~ ist Logisch nicht.

diesen Rückruf Assembler definieren:

- (void)parser:(PKParser *)p didMatchPassThru:(PKAssembly *)a { 
    NSLog(@"%s %@", __PRETTY_FUNCTION__, a); 
    PKToken *tok = [a pop]; 
    if (!a.target) { 
     a.target = [NSMutableArray array]; 
    } 
    [a.target addObject:tok]; 
} 

Sie sehen können, sammeln wir einfach die PASSTHRU Token in einem Array als das Ziel der Baugruppe gespeichert.

Mein Treibercode:

NSString *g = // fetch grammar above 
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self]; 
NSString *s = @"= 2 + 2"; 

NSArray *toks = [p parse:s]; 
NSString *result = [toks componentsJoinedByString:@""]; 
NSLog(@"res '%@'", result); 
NSAssert([result isEqualToString:@"2 + 2"], @""); 

Am Ende gibt, holen wir nur die akkumulierten Token (das Ziel der Versammlung) und sie in einen String kombinieren.

Verwandte Themen