c# - 如何在 Irony.NET 中允许重复

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

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

我怎样才能做到这一点?

提前致谢!

最佳答案

这是解决方案:

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

关于c# - 如何在 Irony.NET 中允许重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146341/

相关文章:

c# - Windows 7 开始菜单搜索的自定义源

c# - 直通读取文件夹中的所有文件

c# - 有没有办法使用谓词在 Sqlite-Net 中删除?

c++ - 为 C++ 程序编写 BNFC 语法

c# - 具有讽刺意味的是:如何禁止两个标记之间有空格?

c# - Irony 解析器中的表达式优先级

C# Transpose() 方法转置 excel 表中的行和列

swift - 解析project.pbxproj文件

parsing - 投影文本编辑器?

parsing - 具有讽刺意味的 AST 生成抛出 nullreferenceexception