来自 IronPython 的表达式树



我用这段代码用IronPython执行一个python表达式。

    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

IronPython 的内部 AST 也恰好是表达式树,所以你只需要获取代码的 AST,你可以使用 IronPython.Compiler.Parser 类来完成。 Parser.ParseFile 方法将返回一个表示代码的IronPython.Compiler.Ast.PythonAst实例。

使用解析器有点棘手,但您可以查看 _ast 模块的BuildAst方法以获取一些提示。基本上,它是:

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# 表达式树相似(但不完全相同)。

相关内容

  • 没有找到相关文章

最新更新