Search code examples
c#parsingirony

How to allow repetitions in Irony.NET


I'm trying to create a very very basic command line parser.

For example, I could have this command:

command @arg1 value1 @arg2 value2

I've tried to implement this with such basic grammar class:

public class CmdGrammar : Grammar
{
    public CmdGrammar()
        : base(caseSensitive: true)
    {
        var program = new NonTerminal("program");
        var command = new IdentifierTerminal("commandName");
        var argumentName = new IdentifierTerminal("argumentName");
        var argumentValue = new IdentifierTerminal("argumentValue");

        Root = program;

        argumentName.AddPrefix("@", IdOptions.NameIncludesPrefix);

        program.Rule = command + argumentName + argumentValue;
    }
}

This allows a single argument for the whole command, but I can't figure out how to support infinite arguments.

How can I achieve this?

Thank you in advance!


Solution

  • This is the solution:

        var program = new NonTerminal("program");
        var command = new IdentifierTerminal("commandName");
    
        var argumentList = new NonTerminal("argumentList");
        var argument = new NonTerminal("argument");
        var argumentName = new IdentifierTerminal("argumentName");
        var argumentValue = new IdentifierTerminal("argumentValue");
    
        Root = program;
    
        program.Rule = command + argumentList;
    
        argumentList.Rule = MakePlusRule(argumentList, null, argument);
    
        argumentName.AddPrefix("@", IdOptions.NameIncludesPrefix);
        argument.Rule = argumentName + argumentValue;
    
        RegisterOperators(0, Associativity.Left, "@");
    

    It's about using the Grammar.MakePlusRule(...) method!