Skip to content

Commit

Permalink
* fix for literal token enum names that only differ by caps
Browse files Browse the repository at this point in the history
  • Loading branch information
itod committed Apr 2, 2014
1 parent ae0f94b commit 365718f
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 19 deletions.
4 changes: 2 additions & 2 deletions ParserGenApp/PGDefinitionPhaseVisitor.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ - (void)dealloc {

- (NSString *)defaultDefNameForStringValue:(NSString *)strVal {
NSString *defName = _defaultDefNameTab[strVal];
// not sure if we want this

if (!defName) {
NSArray *comps = [strVal componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];
if ([[comps lastObject] length]) {
Expand All @@ -51,7 +51,7 @@ - (NSString *)defaultDefNameForStringValue:(NSString *)strVal {
}
}
}
// end

if (!defName) {
defName = [@(_fallbackDefNameCounter++) stringValue];
_defaultDefNameTab[strVal] = defName;
Expand Down
14 changes: 14 additions & 0 deletions ParserGenApp/PGTokenKindDescriptor.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,20 @@ + (PGTokenKindDescriptor *)descriptorWithStringValue:(NSString *)s name:(NSStrin
NSParameterAssert(name);

PGTokenKindDescriptor *desc = sCache[name];

// This handles cases where the grammar has two literal tokens
// which differ only in capitalization like `Function` and `function`.
// This will ensure a unique token kind enum name for both.
if (desc && ![desc.stringValue isEqualToString:s]) {
NSString *uniqueName = name;
NSUInteger i = 0;
while (desc) {
++i;
uniqueName = [NSString stringWithFormat:@"%@_%lu", name, i];
desc = sCache[uniqueName];
}
name = uniqueName;
}

if (!desc) {
desc = [[[PGTokenKindDescriptor alloc] init] autorelease];
Expand Down
6 changes: 3 additions & 3 deletions test/DupeLiteralsParser.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#import <PEGKit/PKParser.h>

enum {
DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE = 14,
DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE,
DUPELITERALS_TOKEN_KIND_NONE_1 = 14,
DUPELITERALS_TOKEN_KIND_NONE_2,
DUPELITERALS_TOKEN_KIND_1,
DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE,
DUPELITERALS_TOKEN_KIND_NONE,
DUPELITERALS_TOKEN_KIND_2,
};

Expand Down
28 changes: 14 additions & 14 deletions test/DupeLiteralsParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ - (id)initWithDelegate:(id)d {
if (self) {

self.startRuleName = @"start";
self.tokenKindTab[@"none"] = @(DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE);
self.tokenKindTab[@"none"] = @(DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE);
self.tokenKindTab[@"NONE"] = @(DUPELITERALS_TOKEN_KIND_NONE_1);
self.tokenKindTab[@"None"] = @(DUPELITERALS_TOKEN_KIND_NONE_2);
self.tokenKindTab[@"?("] = @(DUPELITERALS_TOKEN_KIND_1);
self.tokenKindTab[@"none"] = @(DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE);
self.tokenKindTab[@"none"] = @(DUPELITERALS_TOKEN_KIND_NONE);
self.tokenKindTab[@"):"] = @(DUPELITERALS_TOKEN_KIND_2);

self.tokenKindNameTab[DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE] = @"none";
self.tokenKindNameTab[DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE] = @"none";
self.tokenKindNameTab[DUPELITERALS_TOKEN_KIND_NONE_1] = @"NONE";
self.tokenKindNameTab[DUPELITERALS_TOKEN_KIND_NONE_2] = @"None";
self.tokenKindNameTab[DUPELITERALS_TOKEN_KIND_1] = @"?(";
self.tokenKindNameTab[DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE] = @"none";
self.tokenKindNameTab[DUPELITERALS_TOKEN_KIND_NONE] = @"none";
self.tokenKindNameTab[DUPELITERALS_TOKEN_KIND_2] = @"):";

}
Expand Down Expand Up @@ -51,26 +51,26 @@ - (void)start {
- (void)start_ {

do {
if ([self predicts:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE, 0]) {
if ([self predicts:DUPELITERALS_TOKEN_KIND_NONE, DUPELITERALS_TOKEN_KIND_NONE_1, DUPELITERALS_TOKEN_KIND_NONE_2, 0]) {
[self none_];
} else if ([self predicts:DUPELITERALS_TOKEN_KIND_1, DUPELITERALS_TOKEN_KIND_2, 0]) {
[self weird_];
} else {
[self raise:@"No viable alternative found in rule 'start'."];
}
} while ([self predicts:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE, DUPELITERALS_TOKEN_KIND_1, DUPELITERALS_TOKEN_KIND_2, 0]);
} while ([self predicts:DUPELITERALS_TOKEN_KIND_1, DUPELITERALS_TOKEN_KIND_2, DUPELITERALS_TOKEN_KIND_NONE, DUPELITERALS_TOKEN_KIND_NONE_1, DUPELITERALS_TOKEN_KIND_NONE_2, 0]);

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

- (void)none_ {

if ([self speculate:^{ [self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO]; }]) {
[self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO];
} else if ([self speculate:^{ [self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO]; }]) {
[self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO];
} else if ([self speculate:^{ [self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO]; }]) {
[self match:DUPELITERALS_DUPELITERALS_DUPELITERALS_TOKEN_KIND_NONE discard:NO];
if ([self predicts:DUPELITERALS_TOKEN_KIND_NONE, 0]) {
[self match:DUPELITERALS_TOKEN_KIND_NONE discard:NO];
} else if ([self predicts:DUPELITERALS_TOKEN_KIND_NONE_1, 0]) {
[self match:DUPELITERALS_TOKEN_KIND_NONE_1 discard:NO];
} else if ([self predicts:DUPELITERALS_TOKEN_KIND_NONE_2, 0]) {
[self match:DUPELITERALS_TOKEN_KIND_NONE_2 discard:NO];
} else {
[self raise:@"No viable alternative found in rule 'none'."];
}
Expand Down

0 comments on commit 365718f

Please sign in to comment.