Skip to content

Commit 23570f4

Browse files
committed
* fixing backslash tokens
1 parent eb0a298 commit 23570f4

File tree

5 files changed

+36
-6
lines changed

5 files changed

+36
-6
lines changed

ParserGenApp/PGTokenKindDescriptor.m

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@ + (PGTokenKindDescriptor *)descriptorWithStringValue:(NSString *)s name:(NSStrin
4848
if (!desc) {
4949
desc = [[[PGTokenKindDescriptor alloc] init] autorelease];
5050

51-
// escape back slases
52-
s = [s stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
53-
5451
// escape double quotes
5552
s = [s stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
5653

res/quote_symbol.grammar

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
}
66

77
start = sym+;
8-
sym = single | double;
8+
sym = single | double | back;
99
single = "'";
10-
double = '"';
10+
double = '"';
11+
back = '\\';

test/QuoteSymbolParser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
enum {
44
QUOTESYMBOL_TOKEN_KIND_SINGLE = 14,
55
QUOTESYMBOL_TOKEN_KIND_DOUBLE,
6+
QUOTESYMBOL_TOKEN_KIND_BACK,
67
};
78

89
@interface QuoteSymbolParser : PKParser

test/QuoteSymbolParser.m

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ - (id)initWithDelegate:(id)d {
1515
self.startRuleName = @"start";
1616
self.tokenKindTab[@"'"] = @(QUOTESYMBOL_TOKEN_KIND_SINGLE);
1717
self.tokenKindTab[@"\""] = @(QUOTESYMBOL_TOKEN_KIND_DOUBLE);
18+
self.tokenKindTab[@"\\"] = @(QUOTESYMBOL_TOKEN_KIND_BACK);
1819

1920
self.tokenKindNameTab[QUOTESYMBOL_TOKEN_KIND_SINGLE] = @"'";
2021
self.tokenKindNameTab[QUOTESYMBOL_TOKEN_KIND_DOUBLE] = @"\"";
22+
self.tokenKindNameTab[QUOTESYMBOL_TOKEN_KIND_BACK] = @"\\";
2123

2224
}
2325
return self;
@@ -47,7 +49,7 @@ - (void)start_ {
4749

4850
do {
4951
[self sym_];
50-
} while ([self predicts:QUOTESYMBOL_TOKEN_KIND_DOUBLE, QUOTESYMBOL_TOKEN_KIND_SINGLE, 0]);
52+
} while ([self predicts:QUOTESYMBOL_TOKEN_KIND_BACK, QUOTESYMBOL_TOKEN_KIND_DOUBLE, QUOTESYMBOL_TOKEN_KIND_SINGLE, 0]);
5153

5254
[self fireDelegateSelector:@selector(parser:didMatchStart:)];
5355
}
@@ -58,6 +60,8 @@ - (void)sym_ {
5860
[self single_];
5961
} else if ([self predicts:QUOTESYMBOL_TOKEN_KIND_DOUBLE, 0]) {
6062
[self double_];
63+
} else if ([self predicts:QUOTESYMBOL_TOKEN_KIND_BACK, 0]) {
64+
[self back_];
6165
} else {
6266
[self raise:@"No viable alternative found in rule 'sym'."];
6367
}
@@ -79,4 +83,11 @@ - (void)double_ {
7983
[self fireDelegateSelector:@selector(parser:didMatchDouble:)];
8084
}
8185

86+
- (void)back_ {
87+
88+
[self match:QUOTESYMBOL_TOKEN_KIND_BACK discard:NO];
89+
90+
[self fireDelegateSelector:@selector(parser:didMatchBack:)];
91+
}
92+
8293
@end

test/QuoteSymbolParserTest.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,24 @@ - (void)testDoubleSpaceDoubleSpaceDouble {
100100
TDEqualObjects(TDAssembly(@"[\", \", \"]\"/\"/\"^"), [res description]);
101101
}
102102

103+
- (void)testBackBackBack {
104+
NSString *s = @"\\\\\\";
105+
106+
NSError *err = nil;
107+
PKAssembly *res = [_parser parseString:s error:&err];
108+
TDNil(err);
109+
110+
TDEqualObjects(TDAssembly(@"[\\, \\, \\]\\/\\/\\^"), [res description]);
111+
}
112+
113+
- (void)testBackSpaceBackSpaceBack {
114+
NSString *s = @"\\ \\ \\";
115+
116+
NSError *err = nil;
117+
PKAssembly *res = [_parser parseString:s error:&err];
118+
TDNil(err);
119+
120+
TDEqualObjects(TDAssembly(@"[\\, \\, \\]\\/\\/\\^"), [res description]);
121+
}
122+
103123
@end

0 commit comments

Comments
 (0)