如何实现迷你语言?

时间:2016-03-27 09:11:08

标签: c# windows

环境

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

我正在尝试做什么

在C#中实现迷你语言

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

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

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

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

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

编辑1

c# - Adding scripting functionality to .NET applications - Stack Overflow并不是指通过A / D转换器访问传感器,阀门等外部设备,这对我的目的至关重要,因此不清楚这是上述链接的重复问题。

4 个答案:

答案 0 :(得分:2)

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

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

以下是我使用的几个库,允许您在c#中定义语法。

反讽非常好(我已将它用于各种项目),但暂时没有维护。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

要运行VBScript,您可以使用脚本控制。有关示例,请参阅此问题:Use Microsoft Scripting Control to evaluate 'If' expressions (via c#)

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

答案 3 :(得分:1)

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

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

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