Search code examples
c#arraysparsingsprache

Parsing a list of values with option to empty list


I'm trying to parse an array of items, using Sprache library for C# I have a working code that goes like this.

public static Parser<string> Array =
    from open in OpenBrackets.Named("open bracket")
    from items in Literal.Or(Identifier).Or(Array).DelimitedBy(Comma).Optional()
    from close in CloseBrackets.Named("close bracket")
    select open + (items.IsDefined ? string.Join(", ", items.Get()) : " ") + close;

where "Literal" is a parser for numbers or strings, "Identifier" is a parser for a variable identifier and "Comma" is a parser for a comma token. But if I want the array to allow being empty "[ ]" I need to add the Optional() property and verify if "items" is defined:

select open + (items.IsDefined ? string.Join(", ", items.Get()) : " ") + close;

Is there a better cleaner way to do this for parsing a list of items separated by a separator char, that can be empty (list). That I can reuse with other lists of items.

Sample of input data structure:

[Literal/Identifier/Array] => Value;
[Value] [,Value]* => Array

[public/private] [identifier]; => Declaration;
[public/private] [identifier] [[=] [Value]] => Initialization;

Solution

  • A little cleaner way can be accomplished by GetOrElse method.

    select open + string.Join(", ", items.GetOrElse(new string[0])) + close;