Дерево выражений от IronPython - PullRequest
2 голосов
/ 23 мая 2011

Я использую этот код для выполнения выражения Python с использованием IronPython.

    ScriptEngine engine = Python.CreateEngine();
    ScriptScope scope = engine.CreateScope();      
    scope.SetVariable("m", mobject);
    string code = "m.ID > 5 and m.ID < 10";
    ScriptSource source = 
engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression);
    source.Execute(scope);

Есть ли способ получить созданное дерево выражений в виде объекта c #, например, BlockExpression ?

1 Ответ

5 голосов
/ 23 мая 2011

Внутренние AST IronPython также являются деревьями выражений, поэтому вам просто нужно получить AST для своего кода, что вы можете сделать, используя класс IronPython.Compiler.Parser. Метод Parser.ParseFile возвращает экземпляр IronPython.Compiler.Ast.PythonAst, представляющий код.

Использование синтаксического анализатора немного сложно, но вы можете посмотреть на BuildAst метод модуля _ast для некоторых подсказок. По сути, это:

Parser parser = Parser.CreateParser(
    new CompilerContext(sourceUnit, opts, ThrowingErrorSink.Default),
    (PythonOptions)context.LanguageContext.Options);

PythonAst ast = parser.ParseFile(true);

ThrowingErrorSink также происходит из модуля _ast. Вы можете получить экземпляр SourceUnit, например, такой (c.f. compile встроенный ):

SourceUnit sourceUnit = context.LanguageContext.CreateSnippet(source, filename, SourceCodeKind.Statements);

Затем вам нужно пройти AST, чтобы получить из него полезную информацию, но они должны быть похожи (но не идентичны) деревьям выражений C #.

...