         }
     }
     
+    /// The parser `attempt(p)` applies the parser `p`. If `p` fails after changing the parser state,
+    /// `attempt(p)` will backtrack to the original parser state and report a error.
     public static func attempt(_ p: Parser<T>) -> Parser<T> {
         fatalError()
     }

        fatalError()
    }
    
    public static func followed(by p: Parser<T>, label: String) -> Parser<Void> {
        fatalError()
    }
    
    public static func notFollowed(by p: Parser<T>, label: String) -> Parser<Void> {
        fatalError()
    }
    
    public static func lookAhead(_ p: Parser<T>) -> Parser<T> {
        fatalError()
    }

    
    /// The parser `one(p, label: label)` applies the parser `p`.
    /// If `p` does not change the parser state (usually because `p` failed),
    /// the errors are replaced with a `.expected(label: label)`.
    public static func one(_ p: Parser<T>, label: String) -> Parser<T> {
        return Parser { state in
            let reply = p.parse(state)
