【问题标题】:Lex/Yacc for C#?用于 C# 的 Lex/Yacc?
【发布时间】:2010-10-07 03:17:12
【问题描述】:

实际上,也许不是成熟的 Lex/Yacc。我正在实现一个命令解释器前端来管理一个 web 应用程序。我正在寻找可以接受语法定义并将其转换为直接调用我的对象上的方法的解析器的东西。类似于 ASP.NET MVC 如何确定要调用哪个控制器方法,以及如何计算参数。

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

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

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

【问题讨论】:

    标签: c# parsing yacc


    【解决方案1】:

    我不确定 Lex/Yacc 是否会有所帮助。您只需要一个基本的分词器和一个解释器,它们的手写速度更快。如果您仍在解析路由,请参阅Irony

    附带说明:您是否考虑过 PowerShell 及其命令行开关?

    【讨论】:

    • 虽然基本的标记器很容易编写——这些年来我已经完成了好几个,但如果有人已经完成了这项工作,它们仍然不是免费的。另外,是的,我考虑过 PowerShell。我对它不够熟悉,无法决定它是否合适。
    • 如果有 C++CLI lex/yacc 就好了
    • Irony 的链接已失效。
    • 更新了链接,Irony 现在在 github 上。
    【解决方案2】:

    正如 Anton 所说,PowerShell 可能是要走的路。如果你确实想要一个 lex/yacc 实现,那么 Malcolm Crowe 有一个很好的集合。

    编辑: Direct Link to the Compiler Tools

    【讨论】:

      【解决方案3】:

      CTP 仍处于早期阶段,因此无法在生产应用中使用,但您可能对 Oslo/MGrammar 感兴趣: http://msdn.microsoft.com/en-us/oslo/

      【讨论】:

      【解决方案4】:

      如果您不惧怕 alpha 软件,并且想要替代 Lex / Yacc 来创建您自己的语言,您可以查看Oslo。我建议您通过last years PDC 的会话 TL27 和 TL31 进行会话记录。 TL31 直接解决了使用 Oslo 创建领域特定语言的问题。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我建议csflex - flex 的 C# 端口 - 最著名的 unix 扫描仪生成器。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • Microsoft Visual Studio 2008 SDK 在 VisualStudioIntegration\Tools\Bin 下有 MPLex 和 MPPG
            【解决方案8】:

            还可以查看Antlr,它支持 C#。

            【讨论】:

              【解决方案9】:

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

              GPPG 可以找到 here 和 GPLEX here

              话虽如此,我同意,一个完整的 LEX/YACC 解决方案可能对您的问题来说是多余的。我建议使用 IronPython 生成一组绑定:它可以轻松地与 .NET 代码交互,非程序员似乎发现基本语法相当可用,如果你选择使用它,它会给你很大的灵活性/功能。

              【讨论】:

              【解决方案10】:

              Gardens Point Parser Generator here 为 C# 提供 Yacc/Bison 功能。可以下载here。提供了一个使用 GPPG 的有用示例here

              【讨论】:

              • 就目前而言,它是有问题的——它将noassoc 转换为right(所以简而言之,它接受根据语法应该不正确的输入)。
              【解决方案11】:

              仅作记录,在 C# 中为 C# 实现词法分析器和 LALR 解析器:

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

              它的使用应该类似于 Lex/Yacc,但是这些工具 (NLT) 不是生成器!因此,忘记速度。

              【讨论】:

                【解决方案12】:

                Jison 最近备受关注。它是 javascript 的 Bison 端口。由于它非常简单,我将 jison 解析/词法分析模板移植到 php,现在移植到 C#。它仍然很新,但如果你有机会,可以在这里看看:https://github.com/robertleeplummerjr/jison/tree/master/ports/csharp/Jison

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-02-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多