我正在尝试创建一个非常非常基本的命令行解析器。
例如,我可以有这个命令:
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/