diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index 7a3f1aa..0e3e697 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -140,13 +140,9 @@ class Reader { public static final terminators = [")", "]", "}", '"', "/*", "\n", " "]; public static function nextToken(stream:Stream, expect:String) { - switch (stream.takeUntilOneOf(terminators)) { + switch (stream.takeUntilOneOf(terminators, true)) { case Some(tok) if (tok.length > 0): return tok; - case None if (stream.content.length > 0): - var tok = stream.content; - stream.dropChars(stream.content.length); - return tok; default: stream.error('Expected $expect'); return null; diff --git a/src/kiss/Stream.hx b/src/kiss/Stream.hx index 3485564..9a20918 100644 --- a/src/kiss/Stream.hx +++ b/src/kiss/Stream.hx @@ -165,10 +165,15 @@ class Stream { dropChars(content.length - trimmed.length); } - public function takeUntilOneOf(terminators:Array):Option { + public function takeUntilOneOf(terminators:Array, allowEOF:Bool = false):Option { var indices = [for (term in terminators) content.indexOf(term)].filter((idx) -> idx >= 0); - if (indices.length == 0) - return None; + if (indices.length == 0) { + return if (allowEOF) { + Some(takeRest()); + } else { + None; + } + } var firstIndex = Math.floor(indices.fold(Math.min, indices[0])); return takeChars(firstIndex); } @@ -184,8 +189,18 @@ class Stream { return Some(toReturn); } + public function takeRest():String { + var toReturn = content; + dropChars(content.length); + return toReturn; + } + public function takeLine():Option { - return takeUntilAndDrop("\n"); + return switch (takeUntilAndDrop("\n")) { + case Some(line): Some(line); + case None if (content.length > 0): Some(takeRest()); + default: None; + }; } public function expect(whatToExpect:String, f:Void->Option):String {