.NET 3.5의 C#에서는 Expression
을 사용할 수 있습니다. 매개 변수화 된 표현식을 작성한 다음 위임자에게 컴파일 할 수 있습니다. 이것은 정확히 Finguistics의 수학적 측면에서 내가 한 것입니다. 나는 여전히 당신이 원한다면 내가 사용한 구문 분석 코드를 가지고있다 ...
내가 사용한 주된 트릭은 델리게이트 형식을 알려주기 위해서 입력 유형으로 배열을 사용했다. arr [0] , arr 1, arr [2] 등입니다. 이는 Func<decimal[], decimal>
(예 : decimal
의 배열을 취하고 decimal
을 반환)으로 컴파일 할 수 있음을 의미합니다.
Compile()
을 일단 호출하면 직접 코드를 작성한 것처럼 보입니다.
(하드 코딩 기능)이 방법을 사용
Expression
의 간단한 예로서
(편집)
아래 참조. 이미 작성한 파서는 입니다. 현재은 술어 검사기로 작동합니다. 즉 "? + (2 *? -?) = 22 +?" - 대신 결과를 반환하기 위해 변경하는 것은 어렵지 않을 것입니다 (예 : sin
/pow
/etc - 아마도 도우미 객체의 public 메소드에 직접 매핑하여 (Expression.Call
통해)).
using System;
using System.Linq.Expressions;
static class Program
{
static void Main()
{
var args = Expression.Parameter(typeof(float[]), "args");
var x = Expression.ArrayIndex(args, Expression.Constant(0));
var y = Expression.ArrayIndex(args, Expression.Constant(1));
var add = Expression.Add(x, y);
var lambda = Expression.Lambda<Func<float[], float>>(add, args);
Func<float[], float> func = lambda.Compile();
Console.WriteLine(func.Call(1, 2));
Console.WriteLine(func.Call(3, 4));
Console.WriteLine(func.Call(5, 6));
}
static T Call<T>(this Func<T[], T> func, params T[] args)
{ // just allows "params" usage...
return func(args);
}
}
표현식이 얼마나 복잡합니까? 함수 연산이 4 개로 제한되거나 매우 일반적입니까? – Richard
여러 매개 변수가있는 함수를 포함하여 상당히 복잡해질 수 있습니다. – Steve