[Ironpython-users] Modifying ASTs when embedding IronPython

Curt Hagenlocher curt at hagenlocher.org
Fri Mar 2 03:58:12 CET 2012


I would argue that this is a bad idea. How Python-compatible do you want
this simple Excel-like language to be? If it's really just a small subset
of the full Python language, you may be better off writing a simple parser
that emits Python text as its back end and prevents the users from doing
anything more complicated. This should not be significantly more complex
than what you propose to do. If you really want to offer the full power of
the Python language, then you should consider whether you are doing your
users a disservice by teaching them a language that's almost the same as
Python, but different in just one minor and hard-to-debug respect.

On Thu, Mar 1, 2012 at 12:31 PM, Tuomas Utrecht <tuomas.utrecht at gmail.com>wrote:

> 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 at python.org
> http://mail.python.org/mailman/listinfo/ironpython-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20120301/bce51d1b/attachment.html>


More information about the Ironpython-users mailing list