5.2 Running parsers on input

While it is not difficult to construct a CharStream instance yourself, then apply a parser function to the CharStream, then interpret the returned Reply value and finally dispose the CharStream again, it takes less effort to instead use one of the several runParser... functions from the CharParsers module.

Among the runParser... functions run is the most convenient for simple testing purposes:

val run: Parser<'a, unit> -> string -> ParserResult<'a,unit>

run applies the parser given as the first argument to a CharStream constructed from the string argument and then captures the return value as ParserResult value. The ParserResult type is a simple discriminated union that is a bit more convenient to interpret than the Reply values returned by Parser functions.

For example:

> run pint32 "0xff";;
val it : ParserResult<int32,unit> = Success: 255

> run pint32 "0xgf";;
val it : ParserResult<int32,unit> = Failure:
Error in Ln: 1 Col: 3
0xgf
  ^
Expecting: hexadecimal digit

The text messages displayed in these examples after the = signs are the default string representations of the returned ParserResult values, just like they are printed in the F# Interactive console. The reference documentation describes the two union cases Success and Failure of the ParserResult type in more detail.

run only supports parser functions with no user state, i.e. with a unit user state. If you want to test parsers that depend on a user state, you will need to use one of the other runParser... functions, e.g. runParserOnString. Please see the reference for more details on the runParser... functions.

Note that the runParser... functions are primarily meant for the “end‐users” of parsers, i.e. those users that apply an aggregate parser on the content of a complete input stream. This is a situation different from the one where you implement a Parser function yourself. In the latter case you typically work directly with the input CharStream and output Reply values.