2

我正在尝试创建一个非常非常基本的命令行解析器。

例如,我可以有这个命令:

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;
    }
}

这允许整个命令使用单个参数,但我不知道如何支持无限参数。

我怎样才能做到这一点?

先感谢您!

4

1 回答 1

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(...)方法!

于 2013-10-02T21:17:55.723 回答