Re: Code generation architecture question

2008-11-14 Thread Aaron Brady
On Nov 13, 7:16 pm, Alex_Gaynor [EMAIL PROTECTED] wrote:
 I'm trying to figure out what the best architecture for doing code
 generation would be.  I have a set of ASTs that define a program, so
 what should I do to for code generation.  As I see it the 2 choices
 are to have the ASTs have a generate code method that returns the
 correct code for themselves, or to have a seperate class that
 generates code for a given AST.  The problem with the first is that it
 isn't very flexible if I want to generate code for a new language/
 platform, as well as the fact that it is very tightly coupled.
 However the issue with the other approach is that I can't think of a
 good way to write it without have a ton of if isinstance() calls.  Any
 thoughts on what the best appraoch would be?

I think you are seeking the Visitor Pattern.

class A:
  def meth( self, visitor ):
visitor.visit_classA( self )

class B:
  def meth( self, visitor ):
visitor.visit_classB( self )

class Visitor:
  def visit_classA( self, objinst ):
#handle classA
  def visit_classB( self, objinst ):
#handle classB

then A().meth( v ) gets around to getting v.visit_classA called.  The
code is moderately repetitive.  I believe the Transformer class in the
'ast' module uses the visitor pattern, possibly called NodeWalker or
something.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Code generation architecture question

2008-11-14 Thread Alex_Gaynor
On Nov 14, 3:04 am, Aaron Brady [EMAIL PROTECTED] wrote:
 On Nov 13, 7:16 pm, Alex_Gaynor [EMAIL PROTECTED] wrote:

  I'm trying to figure out what the best architecture for doing code
  generation would be.  I have a set of ASTs that define a program, so
  what should I do to for code generation.  As I see it the 2 choices
  are to have the ASTs have a generate code method that returns the
  correct code for themselves, or to have a seperate class that
  generates code for a given AST.  The problem with the first is that it
  isn't very flexible if I want to generate code for a new language/
  platform, as well as the fact that it is very tightly coupled.
  However the issue with the other approach is that I can't think of a
  good way to write it without have a ton of if isinstance() calls.  Any
  thoughts on what the best appraoch would be?

 I think you are seeking the Visitor Pattern.

 class A:
   def meth( self, visitor ):
     visitor.visit_classA( self )

 class B:
   def meth( self, visitor ):
     visitor.visit_classB( self )

 class Visitor:
   def visit_classA( self, objinst ):
     #handle classA
   def visit_classB( self, objinst ):
     #handle classB

 then A().meth( v ) gets around to getting v.visit_classA called.  The
 code is moderately repetitive.  I believe the Transformer class in the
 'ast' module uses the visitor pattern, possibly called NodeWalker or
 something.

Ah this is great, the Visitor class knows how to transform everything
into code, and each AST knows which method it is on the Visitor,
thanks a ton!
--
http://mail.python.org/mailman/listinfo/python-list


Code generation architecture question

2008-11-13 Thread Alex_Gaynor
I'm trying to figure out what the best architecture for doing code
generation would be.  I have a set of ASTs that define a program, so
what should I do to for code generation.  As I see it the 2 choices
are to have the ASTs have a generate code method that returns the
correct code for themselves, or to have a seperate class that
generates code for a given AST.  The problem with the first is that it
isn't very flexible if I want to generate code for a new language/
platform, as well as the fact that it is very tightly coupled.
However the issue with the other approach is that I can't think of a
good way to write it without have a ton of if isinstance() calls.  Any
thoughts on what the best appraoch would be?
--
http://mail.python.org/mailman/listinfo/python-list