Pergunta

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!

Foi útil?

Solução

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top