Skip to content

Instantly share code, notes, and snippets.

@daemitus
Created October 29, 2021 12:36
Show Gist options
  • Save daemitus/389d229810e1872af29917371c3333da to your computer and use it in GitHub Desktop.
Save daemitus/389d229810e1872af29917371c3333da to your computer and use it in GitHub Desktop.
Grammar
using System.Linq;
using System.Runtime.CompilerServices;
using Eto.Parse;
using Eto.Parse.Parsers;
namespace TestSpace.Grammar
{
/// <summary>
/// A macro grammar definition.
/// </summary>
internal static class MacroGrammar
{
private static readonly Parser Digits = Terminals.Digit.Repeat();
private static readonly Parser FloatingNumber = Digits & ('.' & Digits).Optional();
private static readonly Parser Whitespace = Terminals.SingleLineWhiteSpace.Repeat();
private static readonly Parser OptWhitespace = Whitespace.Optional();
private static readonly Parser Eol = Terminals.Eol | Terminals.End;
private static readonly Parser AnyUntilEol = Terminals.AnyChar.Except(Terminals.Eol).Repeat(0).Until(Eol);
private static readonly Parser Quote = Terminals.Set('"');
private static readonly Parser Ident = (Terminals.LetterOrDigit | "'").Repeat();
private static readonly Parser Comment = (Terminals.Set('#') | "//") & AnyUntilEol.Named("comment");
private static readonly Parser EolWhitespaceOrComment = OptWhitespace & Comment.Optional();
private static readonly Parser ActionParser =
((Literal("/action") | Literal("/ac")
& Whitespace & Identifier("actionName")).Named("command")
& EolWhitespaceOrComment).Named("actionCommand");
public static Eto.Parse.Grammar Definition { get; } = new(
Terminals.Start
& (Whitespace | ActionParser | Comment).Repeat(0).SeparatedBy(Terminals.Eol)
& Terminals.End);
private static Parser Literal(string value) => new LiteralTerminal(value) { CaseSensitive = false };
private static Parser Identifier(string name) => Ident.Named(name) | (Quote & Ident.Repeat().SeparatedBy(Whitespace).Named(name) & Quote);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment