Skip to content

Instantly share code, notes, and snippets.

@beelsebob
Created July 12, 2011 08:55
Show Gist options
  • Save beelsebob/1077652 to your computer and use it in GitHub Desktop.
Save beelsebob/1077652 to your computer and use it in GitHub Desktop.
pi's parser
- (BOOL)tokeniser:(CPTokeniser *)tokeniser shouldConsumeToken:(CPToken *)token
{
return YES;
}
- (NSArray *)tokeniser:(CPTokeniser *)tokeniser willProduceToken:(CPToken *)token
{
if ([token isKindOfClass:[CPWhiteSpaceToken class]] || [[token name] isEqualToString:@"Comment"])
{
return [NSArray array];
}
return [NSArray arrayWithObject:token];
}
- (id)parse:(NSString *)input
{
CPTokeniser *tokeniser = [[[CPTokeniser alloc] init] autorelease];
[tokeniser addTokenRecogniser:[CPNumberRecogniser numberRecogniser]];
[tokeniser addTokenRecogniser:[CPWhiteSpaceRecogniser whiteSpaceRecogniser]];
[tokeniser addTokenRecogniser:[CPQuotedRecogniser quotedRecogniserWithStartQuote:@"\"" endQuote:@"\"" escapeSequence:@"\\" name:@"String"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@":"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"="]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"{"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"}"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"theme"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"comment"]];
[tokeniser addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"presets"]];
[tokeniser addTokenRecogniser:[CPIdentifierRecogniser identifierRecogniser]];
[tokeniser setDelegate:self];
CPTokenStream *tokenStream = [tokeniser tokenise:input];
NSString *grammar = @"TuningSystems ::= <TuningSystem> <TuningSystems> | ;"
@"TuningSystem ::= <Theme> <Comment> <Presets>;"
@"Theme ::= \"theme\" \":\" \"String\";"
@"Comment ::= \"comment\" \":\" \"String\";"
@"Presets ::= \"presets\" \"{\" <PresetBlock> \"}\";"
@"PresetBlock ::= <Preset> <PresetBlock> | ;"
@"Preset ::= \"Identifier\" \"=\" \"Number\";";
CPGrammar *g = [CPGrammar grammarWithStart:@"TuningSystems" backusNaurForm:grammar];
CPParser parser = [CPParser parserWithGrammar:g];
[parser setDelegate:self];
return [parser parse:tokenStream];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment