             }
         } else {
             do {
-                
+                print("Parsing \(inputFiles.count) input file(s)")
                 for inputFile in inputFiles {
+                    print("\(inputFile.path)".style(.bold))
+
                     let input = try String(contentsOfFile: inputFile.path, encoding: String.Encoding.utf8)
                     
                     do {
                         try parseInput(language: language, input: input)
+                        print("Done".color(.green))
                     } catch {
+                        print("\(error)".color(.red).style(.blink))
                         return RunnableReturnValue.failure(error: error, code: -1)
                     }
                 }

    }
    
    init(){
        super.init("parse", description: "Parses a set of input files using the supplied grammar", options: Options.all, parameters: Parameters.all)
    }
    
    func prettyPrint(source:String, contents:[HeterogeneousNode], indent : String = ""){
        for node in contents {
            print("\(indent)\(node.token) '\(node.stringValue(source: source))'")
            prettyPrint(source:source, contents: node.children, indent: indent+"\t")
        }
    }
    

import Foundation
import OysterKit

fileprivate extension String {
    var escaped : String {
        return self.replacingOccurrences(of: "\n", with: "\\n").replacingOccurrences(of: "\t", with: "\\t")
    }
}

class ParseCommand : Command, IndexableOptioned, IndexableParameterized, GrammarConsumer {
    typealias OptionIndexType = Options
