This parser is for "everything in your life!" as you need inside your projects. This parser is an easy to use expression parser library. It can not like the most parsers only calculate math, it can also calculate logical boolean expressions, working with strings calculation and date/time expressions.
This project repository is only for .Net-Core we are currently working on an integration for many other programming languages. It's planed for Java, Python, Typescript and Ruby.
The recommended way to get EveryParser.Net is to use NuGet. The package is provided and maintained in the public NuGet Gallery.
dotnet add package EveryParser.Netor with Visual Studio's Package Manager Console:
Install-Package EveryParser.NetThe know how to use, look at our Wiki of this project or the quick start below. You can also check out the tests written for this project.
To create the C# classes from AntLR use the following command: java -jar antlr-4.13.2-complete.jar -Dlanguage=CSharp -o EveryParser EveryGrammar.g4
If you just want to evaluate with no thinking of own parameters or errors:
Expression.CalculateDecimal("IndexOf([1,2,3], 1)")
Results in => 0
If you have an expression with variables from outside the formular:
var expr = new Expression("variable1 + variable2"); var arguments = expr.GetFormularArgumentNames(); if (arguments.Any()) { expr.AddArgument("variable1", 1); expr.AddArgument("variable2", 2); } expr.CalculateDecimal();
Results in => 3
If you want to check for errors from the evaluation of an expression:
var expr = new Expression("# + ! * testfunc(1)"); expr.Calculate(); if (expr.HasErrors) for(int i = 0; i < expr.CalculationErrors.Length; ++i) Console.WriteLine(expr.CalculationErrors[i].Item2);
Returns all errors you receive from the evaluation
EveryParser.Net includes an integrated benchmark suite powered by BenchmarkDotNet in the EveryParser.Benchmarks project.
Always execute benchmarks in Release mode:
# Interactive menu (choose any benchmark):
dotnet run -c Release --project EveryParser.Benchmarks/EveryParser.Benchmarks.csproj
# Run formula parsing benchmarks (from simple to stress-test):
dotnet run -c Release --project EveryParser.Benchmarks/EveryParser.Benchmarks.csproj -- --filter "*ParsingBenchmarks*"
# Run repeated evaluation benchmarks:
dotnet run -c Release --project EveryParser.Benchmarks/EveryParser.Benchmarks.csproj -- --filter "*EvaluationBenchmarks*"
# Run competitive comparison benchmarks (EveryParser vs. NCalc, Flee, DynamicExpresso):
dotnet run -c Release --project EveryParser.Benchmarks/EveryParser.Benchmarks.csproj -- --filter "*Comparison*"
# Quick run (fewer warmup/target iterations):
dotnet run -c Release --project EveryParser.Benchmarks/EveryParser.Benchmarks.csproj -- --filter "*ComparisonRepeated*" --job shortReports are automatically generated and saved in:
- HTML:
BenchmarkDotNet.Artifacts/results/*-report.html(visual report with formatting) - Markdown:
BenchmarkDotNet.Artifacts/results/*-report-github.md(summary tables) - CSV:
BenchmarkDotNet.Artifacts/results/*-report.csv(raw data)
EveryParser currently utilizes an event-driven ANTLR4 ParseTreeWalker with an intermediate DOM tree (NodeCalculator). For repeated calculations, formulas are currently re-parsed on each execution.
| Formula Complexity | Sample Expression | Mean Latency | Gen 0 / 1k Ops | Allocated Memory |
|---|---|---|---|---|
| Short | 1 + 2 * 3 |
21.68 µs | 1.068 | 13.41 KB |
| Huge / Stress-Test | Multi-term math with Pow, Sin, Clamp, polynomials (~360 chars) |
629.93 µs | 22.461 | 276.05 KB |
Formula: "(a * 1.19 + b * 0.07) * (1 - 0.15) / (quantity + 1)"
| Engine | Execution Strategy | Mean Time (100 Ops) | Allocated Memory | Speedup vs EveryParser |
|---|---|---|---|---|
| EveryParser.Net | ANTLR4 Listener (Current) | 9.06 ms | 4,162 KB (~4.16 MB) | 1.0x (Baseline) |
| NCalc (v7.2) | ANTLR4 + AST-Cache | 34.22 µs | 141.6 KB | ~265x faster |
| Flee (v2.0) | IL-JIT Compiled (Reflection.Emit) |
3.11 µs | 2.4 KB | ~2,900x faster |
| DynamicExpresso (v2.19) | .NET Expression Tree (.Compile()) |
90.85 ns | 0 B (Zero Allocation) | ~100,000x faster |
We call it EveryParser and we mean it in all ways. If you think there is something missing or you need some more functions, let us know with an Issue or feel free to create a pull request.
Thanks to all contributors for this project. Also thanks to the teams behind ANTLR, Math.Net, XUnit and also Microsoft .Net.
The project runs under the MIT License.