[Python-checkins] python/nondist/sandbox/ast asdl_java.py,1.2,1.3

bckfnn@sourceforge.net bckfnn@sourceforge.net
2002年4月18日 11:57:32 -0700


Update of /cvsroot/python/python/nondist/sandbox/ast
In directory usw-pr-cvs1:/tmp/cvs-serv24279
Modified Files:
	asdl_java.py 
Log Message:
Added names instead of number for enums in toString().
Creates Visitor base classes.
Index: asdl_java.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/ast/asdl_java.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** asdl_java.py	16 Apr 2002 03:18:54 -0000	1.2
--- asdl_java.py	18 Apr 2002 18:57:30 -0000	1.3
***************
*** 52,57 ****
--- 52,59 ----
 def open(self, name):
 self.file = open("%s.java" % name, "wb")
+ print >> self.file, "// Autogenerated AST node"
 print >> self.file, 'package org.python.p2.ast;'
 print >> self.file, 'import org.python.p2.SimpleNode;'
+ print >> self.file
 
 def close(self):
***************
*** 128,131 ****
--- 130,140 ----
 self.emit("public static final int %s = %d;" % (type.name, i+1),
 depth + 1)
+ self.emit("", 0)
+ self.emit("public static final String[] %sTypeNames = new String[] {" % 
+ name, depth+1);
+ self.emit('"<undef>",', depth+2);
+ for type in sum.types:
+ self.emit('"%s",' % type.name, depth+2)
+ self.emit("};", depth+1)
 self.emit("}", depth)
 self.close()
***************
*** 174,197 ****
 
 def javaMethods(self, clsname, ctorname, fields, depth):
! # The java ctor
! self.emit("public %s(%s) {" % (ctorname,
! ", ".join([self.fieldDef(f) for f in fields])), depth)
! for f in fields:
! self.emit("this.%s = %s;" % (f.name, f.name), depth+1)
! self.emit("}", depth)
 
! # The toString() method
! self.emit("public String toString() {", depth)
! self.emit('StringBuffer sb = new StringBuffer("%s[");' % clsname,
! depth+1)
! for f in fields:
! self.emit('sb.append("%s=");' % f.name, depth+1);
 self.emit("sb.append(dumpThis(this.%s));" % f.name, depth+1)
! if f != fields[-1]:
! self.emit('sb.append(", ");', depth+1)
! self.emit('sb.append("]");', depth+1)
! self.emit("return sb.toString();", depth+1)
 self.emit("}", depth)
 
 
 def visitField(self, field, depth):
--- 183,237 ----
 
 def javaMethods(self, clsname, ctorname, fields, depth):
! # The java ctor
! self.emit("public %s(%s) {" % (ctorname,
! ", ".join([self.fieldDef(f) for f in fields])), depth)
! for f in fields:
! self.emit("this.%s = %s;" % (f.name, f.name), depth+1)
! self.emit("}", depth)
! self.emit("", 0);
 
! # The toString() method
! self.emit("public String toString() {", depth)
! self.emit('StringBuffer sb = new StringBuffer("%s[");' % clsname,
! depth+1)
! for f in fields:
! self.emit('sb.append("%s=");' % f.name, depth+1);
! if not self.bltinnames.has_key(str(f.type)) and f.typedef.simple:
! self.emit("sb.append(dumpThis(this.%s, %sType.%sTypeNames));" %
! (f.name, f.type, f.type), depth+1);
! else:
 self.emit("sb.append(dumpThis(this.%s));" % f.name, depth+1)
! if f != fields[-1]:
! self.emit('sb.append(", ");', depth+1)
! self.emit('sb.append("]");', depth+1)
! self.emit("return sb.toString();", depth+1)
! self.emit("}", depth)
! self.emit("", 0);
! 
! if clsname == ctorname:
! # The accept() method
! self.emit("public Object accept(Visitor visitor) throws Exception {", depth)
! self.emit('return visitor.visit%s(this);' % clsname, depth+1)
 self.emit("}", depth)
+ self.emit("", 0);
 
+ # The visitChildren() method
+ self.emit("public void traverse(Visitor visitor) throws Exception {", depth)
+ for f in fields:
+ if self.bltinnames.has_key(str(f.type)):
+ continue
+ if f.typedef.simple:
+ continue
+ if f.seq:
+ self.emit('for (int i = 0; i < %s.length; i++) {' % f.name,
+ depth+1);
+ self.emit('if (%s[i] != null)' % f.name, depth+2)
+ self.emit('%s[i].accept(visitor);' % f.name, depth+3)
+ self.emit('}', depth+1)
+ else:
+ self.emit('if (%s != null)' % f.name, depth+1)
+ self.emit('%s.accept(visitor);' % f.name, depth+2)
+ self.emit('}', depth)
+ self.emit("", 0);
 
 def visitField(self, field, depth):
***************
*** 215,218 ****
--- 255,306 ----
 
 
+ class VisitorVisitor(EmitVisitor):
+ def __init__(self):
+ EmitVisitor.__init__(self)
+ self.ctors = []
+ 
+ 
+ def visitModule(self, mod):
+ for dfn in mod.dfns:
+ self.visit(dfn)
+ self.open("Visitor")
+ self.emit('public interface Visitor {', 0)
+ for ctor in self.ctors:
+ self.emit("public Object visit%s(%s node) throws Exception;" % 
+ (ctor, ctor), 1)
+ self.emit('}', 0)
+ self.close()
+ 
+ self.open("VisitorBase")
+ self.emit('public abstract class VisitorBase implements Visitor {', 0)
+ for ctor in self.ctors:
+ self.emit("public Object visit%s(%s node) throws Exception {" % 
+ (ctor, ctor), 1)
+ self.emit("Object ret = unhandled_node(node);", 2)
+ self.emit("traverse(node);", 2)
+ self.emit("return ret;", 2)
+ self.emit('}', 1)
+ self.emit('', 0)
+ 
+ self.emit("abstract protected Object unhandled_node(SimpleNode node) throws Exception;", 1);
+ self.emit("abstract public void traverse(SimpleNode node) throws Exception;", 1);
+ self.emit('}', 0)
+ self.close()
+ 
+ def visitType(self, type, depth=1):
+ self.visit(type.value, type.name, depth)
+ 
+ def visitSum(self, sum, name, depth):
+ if not sum.simple:
+ for t in sum.types:
+ self.visit(t, name, depth)
+ 
+ def visitProduct(self, product, name, depth):
+ pass
+ 
+ def visitConstructor(self, cons, name, depth):
+ self.ctors.append(cons.name)
+ 
+ 
 
 class ChainOfVisitors:
***************
*** 231,234 ****
 sys.exit(1)
 c = ChainOfVisitors(AnalyzeVisitor(),
! JavaVisitor())
 c.visit(mod)
--- 319,323 ----
 sys.exit(1)
 c = ChainOfVisitors(AnalyzeVisitor(),
! JavaVisitor(),
! VisitorVisitor())
 c.visit(mod)

AltStyle によって変換されたページ (->オリジナル) /