构建一个简单的解释器

时间:2008-11-02 07:38:01

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

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

解释器应支持基本的编程语言功能:

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

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

我在这个主题上发现的最佳/最实用的资源是Ron Ayoub在Code Project(Parsing Algebraic Expressions Using the Interpreter Pattern)上的条目 - 这是我问题缩小版的一个完美例子。

紫龙书似乎太多了,更实用了什么?

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

任何实用资源?

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

9 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

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

你应该检查一下:

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

答案 2 :(得分:2)

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

Walter Bright,数字火星

答案 3 :(得分:2)

我建议利用DLR来做到这一点,因为这正是它的设计目标。

Create Your Own Language ontop of the DLR

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

您是否考虑过使用IronPython?它易于从.NET使用,似乎满足您的所有要求。我知道python在科学编程中非常流行,所以你的用户可能已经熟悉它了。

答案 6 :(得分:0)

  

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

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

从这个意义上讲,我将介绍诺曼拉姆齐推荐的Lua。它作为高品质DSL的基础享有盛誉。一个记录良好且有用的DSL需要花费时间和精力,但从长远来看,可以节省每个人的时间,因为领域专家可以快速掌握并且需要最少的支持。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

Silk库刚刚发布到GitHub。它似乎满足了您的大部分要求。这是非常容易使用。只需注册要使用的功能,编写脚本,将其编译为字节码并执行即可。