XParsec is a parser combinator library for F#
It aims to be a successor to the popular FParsec library with several important differences:
- Generalization over collection and token types
With XParsec all common contiguous collections string
'T array
ResizeArray<'T>
ImmutableArray<'T>
and Stream
can be parsed with essentially the same code.
- Pure F# implementation
F# is a great .NET language but with the power of Fable, a powerful JavaScript language too. By implementing XParsec in completely in F#, I aim to provide an equally robust and easy to use parsing library for Fable target languages.
- More Performant
By making use of newer F# & .NET technologies like [<InlineIfLambda>]
Span<'T>
and struct
unions I aim to make XParsec competitive with imperative parsing libraries while remaining terse and easy to reason about.
Initial results are encoraging with roughly 2/3 the execution time and 1/4 the allocations for the equivalent parser code parsing a single large json file.
Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
---|---|---|---|---|---|---|---|
XParsecJson | 41.40 ms | 0.205 ms | 0.182 ms | 1000.0000 | 916.6667 | - | 50.91 MB |
FParsecJson | 67.38 ms | 1.247 ms | 1.106 ms | 4375.0000 | 875.0000 | 250.0000 | 200.98 MB |
- Simplified operator precedence parsing
- No line number tracking by default
dotnet test
npm run test
-
ByteParsers
module - Fable JS compatibility
- Other Fable targets compatibility
- Multi-token operator parsing
- Performance benchmarks and optimization
- Complete FParsec API coverage
- Tests with complex grammars
- Improvements to error messages
- Release to NuGet