【问题标题】:Constructing a simple interpreter构建一个简单的解释器
【发布时间】:2010-09-20 09:00:16
【问题描述】:

我正在启动一个需要实现轻量级解释器的项目。 解释器用于执行简单的科学算法。 此解释器将使用的编程语言应该很简单,因为它针对的是非软件开发人员(例如,数学家)。

解释器应该支持基本的编程语言特性:

  • 实数、变量、多维数组
  • 二进制(+、-、*、/、%)和布尔(==、!=、、=)运算
  • 循环(for、while)、条件表达式(if)
  • 功能

MathWorks MatLab 是我前进方向的一个很好的例子,只是简单得多。 解释器将用作演示算法的环境;简单的算法,例如求数据集/数组的平均值,或者稍微复杂一点的算法,例如 Gaussian eliminationRSA

我在该主题上找到的最佳/最实用的资源是 Ron Ayoub 在 Code Project (Parsing Algebraic Expressions Using the Interpreter Pattern) 上的条目 - 这是我的问题的缩小版本的完美示例。

紫龙书好像太多了,还有什么更实用的?

解释器将使用 C# 实现为 .NET 库。然而,任何平台的资源都是受欢迎的,因为这个问题的设计架构部分是最具挑战性的。

有什么实用的资源吗?

(请避免“这不是微不足道的”或“为什么要重新发明轮子”的回答)

【问题讨论】:

    标签: c# architecture compiler-construction programming-languages


    【解决方案1】:

    我会写在ANTLR。编写语法,让ANTLR生成一个C#解析器。您可以 ANTLR 请求解析树,并且解释器可能已经可以对解析树进行操作。也许您必须将解析树转换为更抽象的内部表示(尽管 ANTLR 已经允许在生成树时省略不相关的标点符号)。

    【讨论】:

      【解决方案2】:

      这听起来可能很奇怪,但 Game Scripting Mastery 是学习解析、编译和解释代码的绝佳资源。

      你真的应该检查一下:

      http://www.amazon.com/Scripting-Mastery-Premier-Press-Development/dp/1931841578

      【讨论】:

      • 优秀的书!书中描述的脚本语言在codeproject.com/KB/cs/Conscript.aspx 用 C# 实现
      • 有趣的是,我和 Alex Varanese 回到了很久以前,我们曾经在我们十几岁的时候在 irc 上聊天。有趣的是,他现在是一名作家。他是 x86 汇编的大师。
      【解决方案3】:

      一种方法是检查现有解释器的源代码。我用D编程语言写了一个javascript解释器,你可以从http://ftp.digitalmars.com/dmdscript.zip下载源代码

      沃尔特·布莱特,数字火星

      【讨论】:

        【解决方案4】:

        我建议利用 DLR 来执行此操作,因为这正是它的设计目的。

        Create Your Own Language ontop of the DLR

        【讨论】:

          【解决方案5】:

          Lua 被设计为可供非程序员使用的可扩展解释器。 (第一个用户是巴西石油地质学家,尽管从那时起user base has broadened considerably。)你可以使用 Lua 并轻松添加你的科学算法、可视化,你有什么。它设计精良,您可以继续手头的任务。

          当然,如果您真正想要的是构建自己的乐趣,那么其他建议是合理的。

          【讨论】:

            【解决方案6】:

            您是否考虑过使用IronPython?它很容易从 .NET 中使用,并且似乎可以满足您的所有要求。我知道 Python 在科学编程中相当流行,因此您的用户可能已经熟悉它。

            【讨论】:

              【解决方案7】:

              此解释器将使用的编程语言应该很简单,因为它针对的是非软件开发人员。

              我将插话你问题的这一部分。简单的语言并不是您真正想要交给非软件开发人员的。精简的语言需要程序员付出更多的努力。您真正想要的是一种设计良好且实施良好的领域特定语言 (DSL)。

              从这个意义上说,我将支持 Norman Ramsey 对 Lua 的建议。它作为高质量 DSL 的基础而享有盛誉。一个有据可查且有用的 DSL 需要时间和精力,但从长远来看,当领域专家可以快速上手并需要最少的支持时,它将为每个人节省时间。

              【讨论】:

                【解决方案8】:

                我很惊讶还没有人提到xtext。它以Eclipse pluginIntelliJ plugin 的形式提供。它不仅提供像 ANTLR 这样的解析器,还提供 DSL 所需的整个管道(包括解析器、链接器、类型检查器、编译器)。您可以在 Github 上查看它的源代码,以了解解释器/编译器的工作原理。

                【讨论】:

                  【解决方案9】:

                  Silk 库刚刚发布到 GitHub。它似乎完成了你所要求的大部分工作。这是非常容易使用。只需注册您想要提供给脚本的函数,将脚本编译为字节码并执行。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-21
                    • 2017-10-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多