Yep, but all of the main IronPython nodes will show up as an extension node so you'll want to override VisitExtension instead of VisitBinary. VisitBinary is for simple binary operations such as adding two primitive values and doesn't include dynamic binary operations.
From: ironpython-users-bounces+dinov=microsoft....@python.org [mailto:ironpython-users-bounces+dinov=microsoft....@python.org] On Behalf Of Tuomas Utrecht Sent: Thursday, March 01, 2012 4:01 PM To: ironpython-users@python.org Subject: Re: [Ironpython-users] Modifying ASTs when embedding IronPython Ok, I'm going to read up on this, but to confirm, I'd need something like the following (from reading http://stackoverflow.com/questions/7944521/interrupt-interpreted-user-code-in-silverlight)? public class ExpressionRewriter : ExpressionVisitor { protected override Expression VisitBinary(BinaryExpression node) { ... } } ExpressionVisitor comes from System.Linq.Expressions? I see BinaryExpression in both System.Linq.Expressions and IronPython.Compiler.Ast. I don't see that I can override the above unless I use the Linq one. I will look into Ipy's code further, but I thought I'd pose these questions. Thank you for your guidance. Le 1 mars 2012 16:58, Dino Viehland <di...@microsoft.com<mailto:di...@microsoft.com>> a écrit : The ASTs are generally immutable so to re-write you'll create a copy of the AST and any parent nodes. The ExpressionVisitor class makes this easy in that you can override VisitExtension method and re-write any Python nodes you care about there. You return a modified node somewhere within the tree and then the rest of the tree will be re-written for you and you get it back out after the visitor completes. Overall I'd say you might be able to make this work, but you might also hit a wall and need to tweak Ipy a little bit so you can actually compile the re-written code in a useful way. I'm thinking you might start running into internal APIs when you start trying to create a ScriptCode or compile it, but I'm not 100% certain. From: ironpython-users-bounces+dinov=exchange.microsoft....@python.org<mailto:exchange.microsoft....@python.org> [mailto:ironpython-users-bounces+dinov<mailto:ironpython-users-bounces%2Bdinov>=exchange.microsoft....@python.org<mailto:exchange.microsoft....@python.org>] On Behalf Of Tuomas Utrecht Sent: Thursday, March 01, 2012 12:32 PM To: ironpython-users@python.org<mailto:ironpython-users@python.org> Subject: [Ironpython-users] Modifying ASTs when embedding IronPython 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!
_______________________________________________ Ironpython-users mailing list Ironpython-users@python.org http://mail.python.org/mailman/listinfo/ironpython-users