10

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

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

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

MathWorks MatLab是我前进的一个很好的例子,只是简单得多。解释器将用作演示算法的环境;简单的算法,例如查找数据集/数组的平均值,或者稍微复杂的算法,例如高斯消除RSA

我在该主题上找到的最佳/最实用的资源是 Ron Ayoub 的代码项目条目(使用解释器模式解析代数表达式)——这是我的问题的缩小版本的完美示例。

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

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

有什么实用资源吗?

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

4

9 回答 9

10

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

于 2008-11-02T07:47:56.503 回答
3

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

你真的应该检查一下:

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

于 2008-11-02T07:50:40.850 回答
2

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

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

于 2008-11-04T06:24:24.160 回答
2

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

在 DLR 之上创建您自己的语言

于 2008-11-04T06:31:47.857 回答
2

Lua被设计为非程序员使用的可扩展解释器。(第一批用户是巴西石油地质学家,尽管从那时起用户群已经大大扩大。)您可以使用 Lua 并轻松添加您的科学算法、可视化等。它设计精良,您可以继续手头的任务。

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

于 2008-12-12T06:39:57.943 回答
1

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

于 2008-11-04T06:38:25.363 回答
0

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

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

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

于 2012-05-26T00:11:14.333 回答
0

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

于 2017-05-18T16:13:51.560 回答
0

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

于 2019-05-28T22:27:06.743 回答