[Ironpython-users] Modifying ASTs when embedding IronPython

Tuomas Utrecht tuomas.utrecht at gmail.com
Fri Mar 2 14:39:09 CET 2012


No, my case is taking Excel formula strings into a C# application,
redefining ^ to be ** and evaluating expressions in the context of a larger
Python module which may override built-in and third-party Excel functions.

Thank you for the information, though.

Le 2 mars 2012 00:00, Vernon Cole <vernondcole at gmail.com> a écrit :

> Err, ummm, ...
> Are you perhaps trying to reinvent Resolver 1 -- a spreadsheet written in
> Python? Maybe I misunderstand what you are trying to do, but you may want
> to look at it, unless you cannot use a commercial product.
> On Mar 1, 2012 7:58 PM, "Curt Hagenlocher" <curt at hagenlocher.org> wrote:
>
>> 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
>>>
>>>
>>
>> _______________________________________________
>> 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/20120302/e7429bd0/attachment.html>


More information about the Ironpython-users mailing list