[Ironpython-users] Modifying ASTs when embedding IronPython

Tuomas Utrecht tuomas.utrecht at gmail.com
Thu Mar 1 21:31:39 CET 2012


Hello,

I apologize if this has been answered elsewhere, but I am unable to find
anything up to date, or that covers my question in particular.

The short version is: Can I modify the AST of a parsed file before
compiling/executing in an embedded context? I want to allow simple,
Excel-like statements to be executed from a .NET application. One major
hitch is that Excel uses ^ for power whereas Python uses **. Ideally, I
would be able to catch calls to ^ and replace with ** at compile time.

If this is just not possible without rebuilding IronPython, do let me know.

I have gotten as far as the below, although the BinaryExpression node's
Operator is only gettable. I also am unsure how to take an AST and compile
it, or if that is even public/allowed.

    var engine = Python.CreateEngine();
    var s =
HostingHelpers.GetSourceUnit(engine.CreateScriptSourceFromString("3^4"));
    var cc = new CompilerContext(s, new PythonCompilerOptions(),
ErrorSink.Default);
    var p = Parser.CreateParser(cc, new PythonOptions());
    PythonAst ast = p.ParseFile(false);

    // I originally tried this with a PythonWalker, but this is more
succinct for the purpose of this example
    SuiteStatement body = (SuiteStatement)ast.Body;
    ExpressionStatement st = (ExpressionStatement)body.Statements[0];
    BinaryExpression exp = (BinaryExpression) st.Expression;
    //exp.Operator = PythonOperator.Power; // Were it only so easy...


Thanks for reading!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20120301/a1b214e7/attachment.html>


More information about the Ironpython-users mailing list