Pegasus uses a PEG-style syntax to define rules. You can use directives like @namespace, @classname, and @using to configure the generated C# class. Rules can also use the -memoize directive to improve performance for certain grammar structures.
Example grammar file:
@namespace PegExamples
@classname ExpressionParser
@using System.Globalization
additive <double> -memoize
= left:additive "+" right:multiplicative { left + right }
/ left:additive "-" right:multiplicative { left - right }
/ multiplicative
multiplicative <double> -memoize
= left:multiplicative "*" right:power { left * right }
/ left:multiplicative "/" right:power { left / right }
/ power
power <double>
= left:primary "^" right:power { Math.Pow(left, right) }
/ primary
primary <double> -memoize
= decimal
/ "-" primary:primary { -primary }
/ "(" additive:additive ")" { additive }
decimal <double>
= value:([0-9]+ ("." [0-9]+)?) { double.Parse(value, CultureInfo.InvariantCulture) }
To use the generated parser in your C# code:
var parser = new PegExamples.ExpressionParser();
var result = parser.Parse("5.1+2*3");
Console.WriteLine(result); // Outputs "11.1".