如何允许在Irony.NET中重复

时间:2013-10-02 20:33:59

标签: c# parsing irony

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

例如,我可以使用此命令:

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

这允许整个命令的单个参数,但我无法弄清楚如何支持无限参数。

我怎样才能做到这一点?

提前谢谢!

1 个答案:

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