     }
     return (context(text), nil)
   }
+  matches.append((.End, ""))
   return (nil, matches)
 }
 

    self.tokens = tokens
  }

  func peekType() -> TokenType {
    return tokens[index].type
  }

  func parse() -> Yaml {
    while index < tokens.endIndex {
      let nextType = peekType()
      let match = tokens[index].match

      switch nextType {

      case .Comment, .Space:
        index += 1
        continue

      case .Null:
        return .Null

      case .True:
        return .Bool(true)

      case .False:
        return .Bool(false)

      case .Int:
        return .Int((match as NSString).integerValue)

      case .IntOct:
        return .Int(parseInt(match.substringFromIndex(advance(match.startIndex, 2)), radix: 8))

      case .IntHex:
        return .Int(parseInt(match.substringFromIndex(advance(match.startIndex, 2)), radix: 16))

      case .PositiveInfinity:
        return .Float(Float.infinity)

      case .NegativeInfinity:
        return .Float(-Float.infinity)

      case .NaN:
        return .Float(Float.NaN)

      case .Float:
        return .Float((match as NSString).floatValue)
      }
    }
    return .Null
  }
}


  case Null = "null"
  case True = "true"
  case False = "false"
  case InfinityP = "+infinity"
  case InfinityN = "-infinity"
  case NaN = "nan"
  case Float = "float"
  case Int = "int"
  case IntOct = "int-oct"
  case IntHex = "int-hex"
  case End = "end"

  var description: String {
    return self.toRaw()
