我正在尝试创建一个非常非常基本的命令行解析器。
例如,我可以使用此命令:
command @arg1 value1 @arg2 value2
我试图用这样的基本语法类来实现它:
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;
}
}
这允许整个命令的单个参数,但我无法弄清楚如何支持无限参数。
我怎样才能做到这一点?
提前谢谢!
答案 0 :(得分:1)
这是解决方案:
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, "@");
这是关于使用Grammar.MakePlusRule(...)
方法!