A parser is a function that takes some unstructured input and returns something more structured. One way to write them is using a lot of procedural code. But with parser combinators, you can create a parser declaratively by combining small composable parsers into larger ones.