如何实现一个迷你语言?

Posted

技术标签:

【中文标题】如何实现一个迷你语言?【英文标题】:How to implement a mini language? 【发布时间】:2016-07-14 17:30:01 【问题描述】:

环境

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 转换器访问传感器、阀门等外部设备,这对我的目的至关重要,因此不清楚这是与上述链接的重复问题。

【问题讨论】:

我认为您不需要为此在 C# 中实现迷你语言。我看到您需要一个系统,您可以在其中接受用户输入并在此基础上执行一组操作。如果用户还需要告诉“如何”执行操作,这也可以在不复杂的情况下执行。例如:您可以将委托作为方法中的参数,并且该委托可以从外部传递。 您正在寻找的似乎是使您的应用程序可编写脚本。请参阅here 和here(您可以使用您最喜欢的搜索引擎找到更多信息)。 至于您的编辑,您向脚本公开什么样的界面并不重要——这完全取决于您。该脚本只是调用您的方法。 .Net 可以直接与 VBScript/JScript 集成,你可以在运行时将一个类传递给脚本的上下文,允许用户调用任何你喜欢的方法,Example。 【参考方案1】:

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

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

这里有几个我用过的库,可以让您在 c# 中定义语法。

https://github.com/picoe/Eto.Parse https://irony.codeplex.com/

Irony 非常好(我在各种项目中都使用过它)但是有一段时间没有维护了。

Eto.Parse 是较新的。它还内置了解析器,允许您通过解析 BNF 创建语法。这非常酷

【讨论】:

借助面向堆栈的计算,无需语法、无需解析器即可编写强大的语言。在程序员给出的示例中,用户将键入“3 open-valve”,然后将其拆分为“3”和“open-valve”。当软件读取“3”时,看到它没有匹配后,它会尝试将其转换为 int,并将其放入堆栈。然后当它读取“open-valve”时,它将 3 从堆栈中弹出,并调用 open_valve(3)。没有语法,没有解析器。只是线性阅读。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于如何实现一个迷你语言?的主要内容,如果未能解决你的问题,请参考以下文章

想安装一个迷你linux,只要有基本的命令行操作就可以,不需要图形介面,请问如何实现?

迷你版Vue--学习如何造一个Vue轮子

如何使用 React js 绘制简单的迷你图?

高热度网2020年最新8款迷你世界手机黑科技辅助软件免费下载

Koa源码解析,带你实现一个迷你版的Koa

14 UE4蓝图:制作门的蓝图类