2017-06-22 160 views
0

对于一个项目,我要求我的用户能够提供一个简单的函数作为字符串,并且我希望能够从我的程序中对其进行评估。 假设函数签名总是为int f(int a, int b)可用于C#的基本脚本语言

我想使它成为我的用户可以提供用基本语言编写的f的实现。 例如:

return a*b; 

if(a ==1) return b else return 3 

而在我的计划,我希望能够分析用户输入功能,使之从我的C#代码真正的调用函数。我只需要基本的功能,如基本的数学原理和条件(甚至不是循环)。

是否存在一个基本的“语言”,它允许我解释定义为输入的这些函数并将它们转换为可调用的代码? 例如,我认为使用Lua这个矫枉过正?

理想情况下,我想要一些开源代码,只需最少的代码库,而且广为人知的是质量很好。这样的事情存在吗?理想情况下,它也应该有几种语言的实现,如C#和Java。 我知道编写我自己的解析器的诱惑力很高,但我觉得我的问题必须有一个开箱即用的解决方案

+0

使用JavaScript,我的首选JavaScript引擎jint https://github.com/sebastienros/jint – pm100

回答

1

如果您只需要数学函数,您可以只需要一个字符串评估它在数据表中然后返回结果。

using System.Data; 

//string mathExp = "3 * (2+4)" 
public string ShiestyEval(string mathExp) 
{ 
    DataTable dt = new DataTable(); 
    var v = dt.Compute(mathExp,""); 
    return v; 
} 

为了得到它是从你的应用程序调用,您需要提供他们可以EVAL有方法的接口,或者如果你想要做一些见不得人的黑客和产生,虽然伊尔组件,并加载它,你可以,这是你想如何使用有点含糊其

您还可以检出JSharp

+0

我不知道C#中有这样的内置事物,但我并不感到惊讶。不过,我认为这不会有条件。 理想情况下,我需要一些更正式定义的东西,以便它可以移植并在其他语言中使用 – lezebulon

+0

对不起,我看到编辑前的原始文章 –

+0

是啊这是一个阴暗的eval破解,当有人问我时为面试问题做一个调解,我只是想看看最简单的方法 –

0

我不认为有一个简单的方法来做到这一点。但是有一些易于使用的解决方案。我真的很喜欢Irony有很多乐趣。但有点遗弃。您可以使用ANTLR,但这个并不简单。您可能可以使用Roslyn Api来完成您想要的一切。我不知道有多好沙箱的你需要,但你可以使用C# scripts 这将允许你做这样的事情

ScriptState state = CSharpScript.Run("int Times(int x) { return x * x; }"); 
var fn = state.CreateDelegate>("Times"); 
var value = fn(5); 
Console.Write(value);