如何实现迷你语言?

环境

  • Windows 8.1 64位
  • Microsoft Visual Studio
  • C#

我想做什么

在C#中实现一个迷你语言

我在公司的工作是制作一个自动评估公司产品性能的软件。 评估包括打开阀门,流动化学品,从传感器获取信号,计算某些值等等……

问题是当用户想要改变程序和参数时,例如反应时间有多长,打开阀门的顺序,反应管道是否被清除,程序员必须每次都更改源代码并构建另一个软件用户需要它。

所以我试图在C#中实现一种迷你语言。 用户可以使用易于理解的语言组织测量过程。 用户将代码写入txt文件,我的软件读取它,解析每行代码,提取命令和参数,调用软件中的相应方法。

例如,用户编写一行代码,如open_valve(3) ,我的软件读取代码并调用内部方法send_commands_to_ADconverter(VALVE, 3) ,它通过连接到计算机的A / D转换器将适当的命令发送到目标阀门。 这是我的观念。

但是,由于缺乏编程技巧,我不知道从哪里开始。 什么技术可用? 实现目标的关键词是什么? 我怎样才能实现这个目标? 任何帮助,将不胜感激。 谢谢。

编辑1

c# – 为.NET应用程序添加脚本function – Stack Overflow并不是指通过A / D转换器访问外部设备,如传感器,阀门,这对我的目的至关重要,因此不清楚这是上述链接的重复问题。

为了创建一种语言,你需要某种“解析器”。 您需要定义“语法”。 通过语法解析“progam”将产生一个结构,然后您可以在代码中调用实现语言每个function的方法。

你在这里有一个很大的学习曲线:)很多奇怪的东西,比如EBNF。 你可能会看到许多像Gold和ANTLR这样的东西的引用。 这些function非常强大,但涉及“编译器编译器”之类的内容,并增加了一系列复杂性,这些复杂性可能令人困惑,并且需要在构建管道中执行额外的步骤。

这里有一些我用过的库,允许你在c#中定义语法。

反讽非常好(我已将它用于各种项目),但一段时间没有保持。

Eto.Parse是最近的。 它还内置了解析器,允许您通过解析BNF来创建Grammer。 这很酷

如果我理解,您的目标是解析用户编写的语法并根据他输入的内容做出决定。 我建议你使用正则表达式来匹配和拆分用户输入。

有几种脚本语言可以直接从C#运行。

由于您的用户似乎没有编程知识,因此使用像VBScript这样的详细语言可能会有所帮助。

要运行VBScript,您可以使用脚本控件。 有关示例,请参阅此问题: 使用Microsoft Scripting Control评估“If”表达式(通过c#)

IIRC脚本控件必须作为32位应用程序运行。

嗯,最简单的选择是使用你已经拥有的东西 – C#。

您可以动态编译C#代码,使用新编译器Roslyn非常简单和便宜。 然后,您需要做的就是定义您的界面,以便它易于用户使用,并将该代码放在您可以从代码中调用的方法中。 这使您可以轻松支持C#的所有各种开发工具,包括Visual Studio / VS Code。 在最简单的forms中,您需要做的就是让您的“脚本”实现一些基类,它具有您希望用户拥有的所有方法 – 当然有更好的方法,但这个方法非常简单,听起来像是你的’寻找。

当然,只有您可以信任您的用户才有意义。 在C#中安全地使用沙盒代码要复杂得多(虽然肯定是可能的),而且使用一些现成的脚本解决方案可能会更好。