[Ironpython-users] Modifying ASTs when embedding IronPython
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:
>>> 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
>>> 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 =
>>> var cc = new CompilerContext(s, new PythonCompilerOptions(),
>>> 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;
>>> 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
>> Ironpython-users mailing list
>> Ironpython-users at python.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Ironpython-users