C# 表达式编辑器/解析器/计算器

C# 表达式编辑器/解析器/计算器,c#,parsing,expression,editor,evaluator,C#,Parsing,Expression,Editor,Evaluator,我正在尝试一个C#项目,我希望允许用户通过在编辑器中键入代码来动态运行代码。 考虑到这一点,我想写一些脚本编辑器、解析器和求值器,但想先和其他人核实一下,以防我只是在重新发明轮子 所以,我的想法是/曾经是 编写一个语法突出显示的编辑器,我可以将代码写入其中, 包括自定义关键字的使用 向编辑器添加逻辑,以便它能够格式化 基于编辑器中文本的内容 对输入的文本采取“行动”的方式 例如,如果我输入以下内容 if (Shape.IsACube()) { // Do some cube stuff }

我正在尝试一个C#项目,我希望允许用户通过在编辑器中键入代码来动态运行代码。 考虑到这一点,我想写一些脚本编辑器、解析器和求值器,但想先和其他人核实一下,以防我只是在重新发明轮子

所以,我的想法是/曾经是

  • 编写一个语法突出显示的编辑器,我可以将代码写入其中, 包括自定义关键字的使用
  • 向编辑器添加逻辑,以便它能够格式化 基于编辑器中文本的内容
  • 对输入的文本采取“行动”的方式
  • 例如,如果我输入以下内容

    if (Shape.IsACube())
    {
      // Do some cube stuff
    }
    else if (Shape.Area(height, length, width) > 40)
    {
      // Do some large area stuff
    }
    
    …然后我希望能够动态运行该代码,就像它是应用程序的一部分一样


    我希望所有这些都有意义。有什么想法吗?

    你想用哪种语法来表达你的语法?你自己的还是C#? 如果你只想在运行时编译一些C代码,你可以使用类似于CodeDOM的东西。高亮显示可以通过C#语法高亮显示来实现

    如果您想在终端/非终端上使用自己的语法,您应该使用语法生成器,如ANTLR4。通过这种方式,您将了解大多数编译器/解释器的工作原理


    主要思想是编写Lexer(负责输入的标记化)和Parser(实际上就是语法规则列表,换句话说就是“productions”)。它将为您提供完整的AST,您可以从中评估/突出显示文本。许多语言语法已经用编写,包括C#语法(甚至还有ANTLR4本身)。因此,您可以根据需要选择一些语法并对其进行修改。

    您希望使用哪种语法作为语法?您自己的或C#?由于我们无法在本主题中添加更多答案,我将添加它作为注释。创建编译器是一项非常艰巨的工作,我建议您尝试一些免费的库,如()或我的PRO库(),它们几乎支持所有内容。嗨,eocron,感谢您的宝贵意见。我可能想使用的语法是我自己的,但我越想它,大部分可能是C#。如果可能的话,我可能还需要一次一行地完成代码,比如调试会话,尽管我知道这需要更多的工作,而不是直接编译代码。因此,我建议您使用ANTLR4。您可以在存储库中找到C#语法,并根据需要进行修改。ANTLR4 Basicali,只创建解析器/词法器类,它不编译它们,只生成它们。像WCF工具一样,为服务生成代理类。不过,一步到位有点棘手。你需要一些高级的运行时编译器,你可以看看Roslyn编译器,尽管我不确定它是否能够单步执行一些C#字符串。