itod / pegkit

'Parsing Expression Grammar' toolkit for Cocoa/Objective-C
MIT License
392 stars 37 forks source link

ParserGenApp output wrong codes. #34

Open kvinwang opened 9 years ago

kvinwang commented 9 years ago

Given a rule:

atom = '('? Number | Word;

We got generated code:

- (void)__atom {

    if ([self predicts:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN, 0]) {
        if ([self predicts:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN, 0]) {
            [self match:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN discard:NO]; 
        }
        [self matchNumber:NO]; 
    } else if ([self predicts:TOKEN_KIND_BUILTIN_WORD, 0]) {
        [self matchWord:NO]; 
    } else {
        [self raise:@"No viable alternative found in rule 'atom'."];
    }

    [self fireDelegateSelector:@selector(parser:didMatchAtom:)];
}

The first if should be:

    if ([self predicts:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN, TOKEN_KIND_BUILTIN_NUMBER, 0]) {
        if ([self predicts:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN, 0]) {
            [self match:EXPRESSIONPARSER_TOKEN_KIND_OPEN_PAREN discard:NO]; 
        }