           )
         } catch let error as Config.Error {
           // Prefix the name of the command for a better error message
-          throw error.withKeyPrefixed(by: parserCmd.name)
+          errors.append(error.withKeyPrefixed(by: parserCmd.name))
         }
-      }
-    }
-    self.commands = cmds
+      } else {
+        errors.append(Config.Error.unknownParser(name: cmdName))
+      }
+    }
+
+    if errors.isEmpty {
+      self.commands = cmds
+    } else {
+      throw Error.multipleErrors(errors)
+    }
   }
 }
 

    guard let config = yaml as? [String: Any] else {
      throw Config.Error.wrongType(key: nil, expected: "Dictionary", got: type(of: yaml))
    }
    self.inputDir = (config[Keys.inputDir] as? String).map { Path($0) }
    self.outputDir = (config[Keys.outputDir] as? String).map { Path($0) }
    var cmds: [String: [ConfigEntry]] = [:]
    for parserCmd in ParserCLI.allCommands {
      if let cmdEntry = config[parserCmd.name] {
        do {
          cmds[parserCmd.name] = try ConfigEntry.parseCommandEntry(
            yaml: cmdEntry,

// MARK: - Config

struct Config {
  enum Keys: String {
    case inputDir = "input_dir"
    case outputDir = "output_dir"
  }

  let inputDir: Path?
