我输入带有命令和参数的文本块,每行一个,例如
XYZ ARG1,ARG2,ARG3,...,ARGN
我想验证XYZ
的参数是否适用于该特定命令并执行正确的代码块(如果是)。有大约100个命令,其中一些有可变数量的参数,不同的关系(即如果命令XYZ
被调用,那么我需要调用命令ABC
)。
还存在命令,例如:
COMMAND
XYZ ARG1
BEF ARG1 ARG2
ENDCOMMAND
重要的是,文字包含在COMMAND
和ENDCOMMAND
。
通常对于这样的事情,我会使用Lex和Yacc而不是正则表达式,但还有更现代的东西吗?代码是用C#编写的。 MSDN中有什么可以做到这一点而不是旧学校C Lex和Yacc吗?
答案 0 :(得分:5)
如果您正在寻找Lex / Yacc的替代品,请查看ANTLR。它支持各种语言的代码生成,including C#。
答案 1 :(得分:4)
ANTLR可以处理lexing和parsing,它可以生成C#(除Java,C ++和Python之外)。它非常成熟,有大量文档和大量示例。它还会生成YACC更好的错误消息。
答案 2 :(得分:1)
你有一个比“年龄”更大的问题,因为我不确定任何一个着名的C-ish编译器编译器是否会使用C#。 Boost的新奇解析模板也是如此。
你可能不得不选择像Grammatica或Spart那样深奥的东西(选择我的前两个Google hits)
编辑: 再看一下,ANTLR似乎支持C#。 ANTLR是众所周知的,比LEX / YACC更新,所以我建议你查看它。
答案 3 :(得分:1)
对于像这样的简单解析问题,您可以编写递归下降解析器。当然,假设您的语言相对固定,并且不会成长为完整的编程语言。如果存在任何危险,请咬紧牙关并使用ANTLR或同等物。
答案 4 :(得分:1)
看看jay,yacc重定向到C#和Java。它包含在单声道项目中。
答案 5 :(得分:0)
如果你的意思是.NET Framework中没有特殊的东西。
乍一看,您的命令结构看起来相对简单,因此手动解析非常适合这里,它几乎总是禁食的解决方案。 这也允许您检查命令参数的实际值是否正确,而不仅仅是它们的语法有效性。