Lex / Yacc for C#?

实际上,也许不是完整的Lex / Yacc。 我正在实现一个命令解释器前端来管理webapp。 我正在寻找一些能够进行语法定义并将其转换为直接调用我的对象上的方法的解析器的东西。 类似于ASP.NET MVC如何确定要调用哪个控制器方法,以及如何编写参数。

因此,如果用户在我的命令提示符下键入“create foo”,它应该透明地调用方法:

private void Create(string id) { /* ... */ } 

哦,如果它可以从这些控制器方法的(例如)属性生成帮助文本,那也是很棒的。

我不确定Lex / Yacc会有什么帮助。 你只需要一个基本的标记器和一个解释器,它们可以更快地手动编写。 如果您还在解析路线,请参阅反讽 。

作为旁注:您是否考虑过PowerShell及其命令行开关?

我用GPLEX / GPPG完成了几个小项目,这些项目在C#中非常简单地重新实现了LEX / YACC。 我没有使用上面的任何其他工具,所以我无法真正比​​较它们,但这些工作正常。

可以在这里找到GPPG和GPLEX。

话虽如此,我同意,完整的LEX / YACC解决方案可能对你的问题有点过分。 我建议使用IronPython生成一组绑定:它可以轻松地与.NET代码接口,非程序员似乎发现基本语法相当可用,并且如果您选择使用它,它会为您提供很大的灵活性/function。

另请参阅Antlr ,它具有C#支持。

仍然是早期的CTP所以不能在生产应用程序中使用,但您可能对Oslo / MGrammar感兴趣: http : //msdn.microsoft.com/en-us/oslo/

Jison最近获得了很大的吸引力。 它是javascript的Bison端口。 由于它非常简单,我已将jison解析/ lexing模板移植到php,现在移植到C#。 它仍然很新,但如果你有机会,请在这里查看: https : //github.com/robertleeplummerjr/jison/tree/master/ports/csharp/Jison

如果您不担心alpha软件并想要替代Lex / Yacc来创建自己的语言,那么您可能会考虑使用Oslo 。 我建议你参加去年PDC会议记录TL27和TL31。 TL31使用Oslo直接解决域特定语言的创建问题。

Coco / R是一个带有.NET实现的编译器生成器。 你可以尝试一下,但我不确定是否让这样的库工作比编写你自己的tokenizer更快。

http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/

我建议csflex – C#端口的flex – 最着名的unix扫描仪发生器。

我相信lex / yacc已经在其中一个SDK中(即RTM)。 Windows或.NET Framework SDK。

Gardens Point Parser Generator为C#提供Yacc / Bisonfunction。 它可以在这里下载 。 这里提供了使用GPPG的有用示例

正如安东所说,PowerShell可能还有很长的路要走。 如果你确实想要一个lex / yacc实现,那么Malcolm Crowe有一个很好的设置。

编辑: 直接链接到编译器工具

只是为了记录,在C#中为C#实现lexer和LALR解析器:

http://code.google.com/p/naive-language-tools/

它应该与Lex / Yacc类似,但是那些工具(NLT)不是发电机! 因此,忘记速度。