Thanks for the reply Dino.

Leaving some kind of API exposed to the Python parser would be
appreciated, rather than making it private.

What I would like to do in this case, is discover what variable names a
Python expression uses.

I know how to do this for a Python AST (name nodes that are the first
child of an atom node). I don't even need to modify the AST - I just
want to pull the names out.

 From what you said, I *think* that using Parser.CreateParser sounds the
closest.

With the help you provided, I got as far as the following code:

import clr
clr.AddReference('IronPython')
clr.AddReference('Microsoft.Scripting')

from IronPython import PythonEngineOptions
from IronPython.Hosting import PythonEngine
from IronPython.Compiler import Parser
from Microsoft.Scripting import CompilerContext, SourceCodeUnit

expression = "3 * 3"
pe = PythonEngine.CurrentEngine

s = SourceCodeUnit(pe, expression)
c = CompilerContext(s)
p = Parser.CreateParser(c, PythonEngineOptions())

e = p.ParseExpression()

This gets me a BinaryExpression object, which has interesting properties
like 'Left', 'Right', 'Start' and 'End' and a Walk method that takes a
PythonWalker. (Presumably BinaryExpression is a node type - the root
node of this particular expression.)

I can find Microsoft.Scripting.Ast.Walker (which has multiple overloads
of Walk for different node types). I assume the PythonWalker is a
subclass of this.

Can I use the expression object to inspect its nodes without creating a
walker?

Thanks for the help. :-)

Michael

Dino Viehland wrote:
> I don't know if you figured this out yet but here goes...
>
> Our Parser class is still public (I'm not sure if this will change or not) 
> but you can do (IronPython.Compiler.)Parser.CreateParser.  That takes a 
> CompilerContext class which is going to point the parser at a SourceUnit that 
> we are currently parsing.
>
> >From there you can call ParseFileInput and it'll parse the file and return 
> >you the IronPython AST.  The interesting part might be if you actually want 
> >to compile that code later on :).  In that case you might want to look at 
> >PythonScriptCompiler to see the rest of the process - it's really just one 
> >call to PythonScriptCompiler.BindAndTransform which also seems to be public 
> >(again, I'm not sure if that'll change or not).
>
> Alternately if you just want a way to paramterize some user code you might 
> want to look at ScriptCompiler.ParseCodeDom.  This allows you to provide a 
> limited CodeDom tree (we support CodeMemberMethod, and snippet statement / 
> expressions and that's it) which you could create from some user input.  The 
> nice thing about that is it won't be Python specific (although I'm guessing 
> that's not a problem for you :) ).
>
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Michael Foord
> Sent: Wednesday, August 08, 2007 3:50 PM
> To: Discussion of IronPython
> Subject: [IronPython] Dear Lazy Web - IronPython 2 Parser
>
> Hello all,
>
> Sorry for being lazy, but...
>
> What is the easiest way of  building an AST from IronPython 2 code? I
> would like an AST that I can modify and then flatten again in
> Silverlight.... It needn't be a Python AST, an IronPython one is fine. I
> only need access to 'name' nodes... I wish to change some of the names
> and turn the AST back into code before exec'ing.
>
> :-)
>
> Thanks
>
>
> Michael
> http://www.ironpython.info/
> _______________________________________________
> Users mailing list
> Users@lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> _______________________________________________
> Users mailing list
> Users@lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>   


_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to