summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-07-26 11:48:01 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-07-26 11:48:01 +0200
commitca1c83c21c967593dfa4fced6084e83361bc6cf3 (patch)
tree15b770bc901ef01ea4568b08026a120eb00be63d
parent9f9d3bcede3a4d57fb112011be7023fdd83db369 (diff)
Reader: Support the consing dot.
-rw-r--r--MLKParenReader.m34
-rw-r--r--MLKReader.h7
-rw-r--r--MLKReader.m25
3 files changed, 64 insertions, 2 deletions
diff --git a/MLKParenReader.m b/MLKParenReader.m
index 9287ce9..b61a332 100644
--- a/MLKParenReader.m
+++ b/MLKParenReader.m
@@ -59,6 +59,7 @@ static unichar slurpWhitespaceAndPeek (MLKStream *stream, MLKReadtable *readtabl
while ((nextChar = slurpWhitespaceAndPeek(stream, readtable)) != ')')
{
id item;
+ id dotMarker = [[NSObject alloc] init];
// FIXME: What to do about dots? Maybe add a new
// singleDotAllowed:(BOOL)dotp argument to readFromStream:...?
@@ -66,8 +67,35 @@ static unichar slurpWhitespaceAndPeek (MLKStream *stream, MLKReadtable *readtabl
eofError:YES
eofValue:nil
recursive:YES
- preserveWhitespace:NO];
-
+ preserveWhitespace:NO
+ singleDotMarker:dotMarker];
+
+ if (item == dotMarker)
+ {
+ id nextItem;
+
+ RELEASE (dotMarker);
+
+ nextItem = [MLKReader readFromStream:stream
+ eofError:YES
+ eofValue:nil
+ recursive:YES
+ preserveWhitespace:NO
+ singleDotMarker:nil];
+ [tail setCdr:nextItem];
+
+ if ((nextChar = slurpWhitespaceAndPeek (stream, readtable)) == ')')
+ {
+ [stream readChar];
+ return [NSArray arrayWithObject:cons];
+ }
+ else
+ {
+ [NSException raise:@"MLKReaderError"
+ format:@"Unexpectedly read a single dot."];
+ }
+ }
+
if (!tail)
{
cons = tail = [MLKCons cons:item with:nil];
@@ -77,6 +105,8 @@ static unichar slurpWhitespaceAndPeek (MLKStream *stream, MLKReadtable *readtabl
[tail setCdr:[MLKCons cons:item with:nil]];
tail = [tail cdr];
}
+
+ RELEASE (dotMarker);
}
[stream readChar];
diff --git a/MLKReader.h b/MLKReader.h
index 9a49ef9..60954f1 100644
--- a/MLKReader.h
+++ b/MLKReader.h
@@ -26,6 +26,13 @@
eofError:(BOOL)eofError
eofValue:(id)eofValue
recursive:(BOOL)recursive
+ preserveWhitespace:(BOOL)preserveWhitespace
+ singleDotMarker:(id)dotMarker;
+
++(id) readFromStream:(MLKStream *)stream
+ eofError:(BOOL)eofError
+ eofValue:(id)eofValue
+ recursive:(BOOL)recursive
preserveWhitespace:(BOOL)preserveWhitespace;
+(id) readFromString:(NSString *)string;
diff --git a/MLKReader.m b/MLKReader.m
index 7343c64..7db9670 100644
--- a/MLKReader.m
+++ b/MLKReader.m
@@ -45,6 +45,21 @@
recursive:(BOOL)recursive
preserveWhitespace:(BOOL)preserveWhitespace
{
+ return [self readFromStream:stream
+ eofError:eofError
+ eofValue:eofValue
+ recursive:recursive
+ preserveWhitespace:preserveWhitespace
+ singleDotMarker:nil];
+}
+
++(id) readFromStream:(MLKStream *)stream
+ eofError:(BOOL)eofError
+ eofValue:(id)eofValue
+ recursive:(BOOL)recursive
+ preserveWhitespace:(BOOL)preserveWhitespace
+ singleDotMarker:(id)dotMarker
+{
unichar ch;
NSMutableString *token;
MLKReadtable *readtable;
@@ -169,6 +184,16 @@
}
//NSLog (@"--> Interpret token: %@", token);
+
+ if ([token isEqualToString:@"."])
+ {
+ if (dotMarker)
+ return dotMarker;
+ else
+ [NSException raise:@"MLKReaderError"
+ format:@"Unexpectedly read a single dot."];
+ }
+
return [self interpretToken:token
readtable:readtable
escaped:ever_escaped];