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!
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!