C # Лучший способ для выполнения интерпретатора

#c# #scripting #interpreter

#c# #сценарии #интерпретатор

Вопрос:

Я пишу язык сценариев, я сделал лексер и синтаксический анализатор, и я хочу динамически выполнять в памяти.

Допустим, у меня есть что-то вроде

 function Hello(World)
{
    Print(world);
}
var world = "World";
var boolean = true;
if(boolean == true)
{
    Print("True is True");
}
else
{
    Print("False is True");
}
Hello(world);
  

какой был бы лучший способ выполнить этот фрагмент, который я пробовал

1) Генерация кода операции (я не смог заставить оператор if работать или что-либо другое, кроме функции печати) 2) RunSharp, я не могу выполнять функции, потому что я могу это сделать, я понятия не имею, как.

Если бы кто-нибудь мог указать мне правильное направление!

Небольшой код поможет связать ресурс (а не что-то вроде IronPython), также было бы неплохо

Комментарии:

1. 1) Генерация кода операции: преобразуйте дерево выражений вашим анализатором для анализа вашего языка. Объект выражения msdn.microsoft.com/library/bb356138.aspx . Компиляция дерева объектов выражения:msdn.microsoft.com/library/bb345362.aspx . Вы создали свой languegeprovider с его помощью.

2. спасибо, я проверю это Редактировать: Спасибо! похоже, это соответствует моим потребностям, просто слишком экономит время просмотра, возможно ли выполнять функции, а затем разрешать их вызов, я не мог понять, как с помощью кодов операций или runsharp

Ответ №1:

ваш язык сценариев, такой как JavaScript, если он динамически компилируется в памяти.

пример:

 //csc sample.cs -r:Microsoft.JScript.dll
using System;
using System.CodeDom.Compiler;
using Microsoft.JScript;

class Sample {
    static public void Main(){
        string[] source = new string[] {
@"import System;
class JsProgram {
    function Print(mes){
        Console.WriteLine(mes);
    }
    function Hello(world){
        Print(world);
    }
    function proc(){
        var world = ""World"";
        var bool = true;
        if(bool == true){
            Print(""True is True"");
        }
        else{
            Print(""False is True"");
        }
        Hello(world);
    }
}"
        };
        var compiler = new JScriptCodeProvider();
        var opt      = new CompilerParameters();
        opt.ReferencedAssemblies.Add("System.dll");
        opt.GenerateExecutable = false;
        opt.GenerateInMemory = true;
        var result = compiler.CompileAssemblyFromSource(opt, source);
        if(result.Errors.Count > 0){
            Console.WriteLine("Compile Error");
            return;
        }
        var js = result.CompiledAssembly;
        dynamic jsProg = js.CreateInstance("JsProgram");
        jsProg.proc();
/*
True is True
World
*/
    }
}
  

Ответ №2:

сгенерируйте исходный код c # и скомпилируйте его 🙂 http://support.microsoft.com/kb/304655

Комментарии:

1. Если я не могу сделать это так, как это делают профессионалы, мне, возможно, придется сделать это так: P

2. я бы сделал это таким образом, вы выиграете от всех оптимизаций компилятора, и вы сможете отлаживать сгенерированный код на c # вместо il asm 😉

Ответ №3:

Если я правильно вас понимаю, вы хотите скомпилировать и запустить код во время выполнения? тогда вы могли бы попробовать http://www.csscript.net/index.html , это пример на той же странице, на которую дана ссылка.