       }
       if i - si > 0 {
         stream.lineEndIndex = i
-        parseLine(fn)
+        try parseLine(fn)
         if stream.currentIndex >= len {
           break
         }
         if haveNewLineKey && haveNewLine {
           stream.startIndex = i
           stream.currentIndex = i + ninc
-          fn(type: newLineKey)
+          try fn(type: newLineKey!)
         }
       } else {
         if haveNewLineKey && haveNewLine {
           stream.startIndex = i
           stream.currentIndex = i + ninc
-          fn(type: newLineKey)
+          try fn(type: newLineKey!)
         }
         lineCount += 1
       }

      }
      //p([stream.currentTokenString, status.tokenizer]);
      //p(status.stored);
      fn(type: tt)
      stream.startIndex = stream.currentIndex
    }
    //p(status.indent);
  }

  func parseTokenStrings(fn: (type: TokenType?, string: String?) -> Void) {
    parse() { tt in
      return fn(type: tt, string: self.stream.currentTokenString)
    }
  }

  func parse(fn: (type: TokenType?) -> Void) {
    let len = stream.bytes.count
    var ninc = 0
    var haveNewLine = false


  func next(entry: LexerTokenizer) -> TokenType?

  func parse(fn: (type: TokenType) throws -> Void) throws

  func parseTokenStrings(
      fn: (type: TokenType, string: String) throws -> Void) throws

}

