最好的现代文本解析? AKA何时使用Lex和Yacc?

时间:2009-05-06 22:10:10

标签: regex parsing yacc lex

我输入带有命令和参数的文本块,每行一个,例如

XYZ ARG1,ARG2,ARG3,...,ARGN

我想验证XYZ的参数是否适用于该特定命令并执行正确的代码块(如果是)。有大约100个命令,其中一些有可变数量的参数,不同的关系(即如果命令XYZ被调用,那么我需要调用命令ABC)。

还存在命令,例如:

COMMAND
XYZ ARG1
BEF ARG1 ARG2
ENDCOMMAND

重要的是,文字包含在COMMANDENDCOMMAND

通常对于这样的事情,我会使用Lex和Yacc而不是正则表达式,但还有更现代的东西吗?代码是用C#编写的。 MSDN中有什么可以做到这一点而不是旧学校C Lex和Yacc吗?

6 个答案:

答案 0 :(得分:5)

如果您正在寻找Lex / Yacc的替代品,请查看ANTLR。它支持各种语言的代码生成,including C#

答案 1 :(得分:4)

ANTLR可以处理lexing和parsing,它可以生成C#(除Java,C ++和Python之外)。它非常成熟,有大量文档和大量示例。它还会生成YACC更好的错误消息。

答案 2 :(得分:1)

你有一个比“年龄”更大的问题,因为我不确定任何一个着名的C-ish编译器编译器是否会使用C#。 Boost的新奇解析模板也是如此。

你可能不得不选择像GrammaticaSpart那样深奥的东西(选择我的前两个Google hits

编辑: 再看一下,ANTLR似乎支持C#。 ANTLR是众所周知的,比LEX / YACC更新,所以我建议你查看它。

答案 3 :(得分:1)

对于像这样的简单解析问题,您可以编写递归下降解析器。当然,假设您的语言相对固定,并且不会成长为完整的编程语言。如果存在任何危险,请咬紧牙关并使用ANTLR或同等物。

答案 4 :(得分:1)

看看jay,yacc重定向到C#和Java。它包含在单声道项目中。

http://code.google.com/p/jayc/

答案 5 :(得分:0)

如果你的意思是.NET Framework中没有特殊的东西。

乍一看,您的命令结构看起来相对简单,因此手动解析非常适合这里,它几乎总是禁食的解决方案。 这也允许您检查命令参数的实际值是否正确,而不仅仅是它们的语法有效性。