この種の非常に単純なインタープリターを作成することは、特に式をFunctionName(Parameter, Parameter2 ...)
. 私はかつて一日のうちに似たようなことをしました。+ 演算子の代わりに CONCATENATE (Excel 風) と呼ばれる関数を使用して、単純にすることもできます。
1 つのアプローチは、サポートする各関数のクラスを含む単純な言語オブジェクト モデルを作成することです。次に例を示します。
public abstract class ScriptFunction
{
public abstract string Name { get; }
public abstract int ParameterCount { get; }
public abstract object Execute(params object[] parameters);
}
...次に、提供されたスクリプト文字列を調べ、括弧を区切り記号として使用して関数の名前とパラメーターを抽出し、呼び出す ScriptFunction を検索して、それに対して Execute を呼び出す再帰的な Eval 関数を記述します。
動的コンパイルに対するこのアプローチの利点は、コードが実行するようにプログラムしたことしか実行できないことを知っていることです。一方、式を C# コードにコンパイルしたものでは、ユーザーがアプリケーションの残りの部分に壊滅的なものを入力しませんでした。
より高度なアプローチについては、関数のマッチングとその引数のキャプチャに関する正規表現を参照してください。