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