Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构造一个简单的解释器_C#_Architecture_Compiler Construction_Programming Languages - Fatal编程技术网

C# 构造一个简单的解释器

C# 构造一个简单的解释器,c#,architecture,compiler-construction,programming-languages,C#,Architecture,Compiler Construction,Programming Languages,我正在启动一个项目,需要实现一个轻量级的解释器。 解释器用于执行简单的科学算法。 这个解释器将使用的编程语言应该很简单,因为它面向的是非软件开发人员(例如数学家) 解释器应支持基本编程语言功能: 实数、变量、多维数组 二进制(+,-,*,/,%)和布尔(=,!=,=)运算 循环(for、while)、条件表达式(if) 功能 这是我前进方向的一个很好的例子,只是简单得多。 解释器将用作演示算法的环境;简单的算法,如查找数据集/数组的平均值,或稍微复杂一些的算法,如或 我在这个主题上找到的最好

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

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

  • 实数、变量、多维数组
  • 二进制(+,-,*,/,%)和布尔(=,!=,=)运算
  • 循环(for、while)、条件表达式(if)
  • 功能
这是我前进方向的一个很好的例子,只是简单得多。 解释器将用作演示算法的环境;简单的算法,如查找数据集/数组的平均值,或稍微复杂一些的算法,如或

我在这个主题上找到的最好/最实用的资源是Ron Ayoub关于代码项目()的条目——这是我的问题缩小版的一个完美例子

紫龙书似乎太多了,还有更实用的吗

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

有实用的资源吗


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

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

这听起来可能有些奇怪,但掌握游戏脚本是学习解析、编译和解释代码的一个很好的资源

你应该好好看看:


一种方法是检查现有解释器的源代码。我已经用D编程语言编写了一个javascript解释器,您可以从


Walter Bright,Digital Mars

我建议利用DLR来实现这一点,因为这正是它的设计目的

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

被设计为可扩展的解释器,供非程序员使用。(最早的用户是巴西石油地质学家,尽管从那时起就没有了。)你可以使用Lua,轻松添加你的科学算法、可视化,以及你拥有的东西。它的设计非常出色,你可以继续完成手头的任务

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

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

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


从这个意义上说,我将支持诺曼·拉姆齐对卢阿的建议。它作为高质量DSL的基地享有良好的声誉。一个记录良好且有用的DSL需要花费时间和精力,但从长远来看,当领域专家能够快速提高速度并需要最少的支持时,它将为每个人节省时间。

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

该库刚刚发布到Github。它似乎做了你要求的大部分事情。它很容易使用。只需注册您想要为脚本提供的函数,将脚本编译成字节码并执行即可。

这本书太棒了!书中描述的脚本语言是用C语言实现的,有趣的是,Alex Varanese和我很早以前就开始讨论irc了,我们年轻时经常在irc上聊天。很有趣,他现在是作家了。他是x86汇编的大师。