【发布时间】:2017-08-31 17:37:04
【问题描述】:
我正在用我自己的函数编写一个非常简单的脚本工具。
无论有无参数,我都可以很好地调用方法。我的主要问题是解析用户输入的参数。 我需要自己硬核解析器还是有更好的方法?
示例代码
public class FunctionList
{
public void MyMethod(string x)
{
MessageBox.Show(x);
}
}
public void Test()
{
Type type = typeof(FunctionList);
MethodInfo method = type.GetMethod(debugBox.Text);
FunctionList c = new FunctionList();
method.Invoke(c, new object[] { "lorem ipsum" });
}
TextBox 中的用户输入示例:
MyMethod(Hello World)
Sleep(500)
MyMethod(Waited 500 ms)
Sum(5, 4)
我还想添加条件和循环,但我认为这需要调用方法以外的东西。
我想出的解析器示例:
public void Test()
{
Type type = typeof(FunctionList);
MethodInfo method = type.GetMethod(helper.GetUntilOrEmpty(debugBox.Text, "(")); //gets all text until first ( which translates to the function name
FunctionList c = new FunctionList();
//Handles one argument, gets the text between ( )
int pFrom = debugBox.Text.IndexOf("(") + "(".Length;
int pTo = debugBox.Text.LastIndexOf(")");
string result = debugBox.Text.Substring(pFrom, pTo - pFrom);
//pass params
method.Invoke(c, new object[] { result });
}
【问题讨论】:
-
它被称为Roslyn
-
当你需要解析时,你需要一个解析器。如果我不想使用 Roslyn,我会使用 NCalc。您可以轻松地使其调用您提供的 .NET 方法。但是在谷歌上搜索“.net expression evaluator”会发现很多选择,其中大多数至少物有所值。
-
@你的编辑:你有你的脚本语言的规范吗?带有双引号作为分隔符的字符串和可能的分隔符转义序列是您需要解析的唯一类型的参数吗?或者你可以只使用 C#,那么有很多动态代码执行选项,可以调用主机程序集。我曾经用 ANTLR 做过一次,但现在没有必要了,我们可以使用几个开源脚本引擎。
-
@dlatikay 我只会处理字符串和int,函数最多需要3个参数
-
你可以用一个简单的解析器来做到这一点。但并非没有。如果您只是将其作为概念验证或学习或娱乐,请考虑您可以在字符串文字中使用括号和逗号,而无需为参数列表使用简单的
String.Split。可能你也不能没有在字符串中转义引号的语法。这很快就会变得复杂。