/* * NonLeaf.java 1.0 * * This subclass of symbol represents (at least) terminal symbols returned * by the scanner and placed on the parse stack. At present, this * class does nothing more than its super class. * * Jun 11, 1997 * * @see io.devnulllabs.openjava.ptree.ParseTree * @see io.devnulllabs.openjava.ptree.ParseTreeObject * @version 1.0 last updated: Jun 11, 1997 * @author Michiaki Tatsubori */ package io.devnulllabs.openjava.ptree; import io.devnulllabs.openjava.ptree.util.ParseTreeVisitor; import io.devnulllabs.openjava.tools.DebugOut; /** * The NonLeaf class presents for node of parse tree. * * @see io.devnulllabs.openjava.ptree.ParseTree * @see io.devnulllabs.openjava.ptree.Leaf */ public abstract class NonLeaf extends ParseTreeObject implements ParseTree { private String comment = ""; protected final void replaceChildWith( ParseTree dist, ParseTree replacement) throws ParseTreeException { DebugOut.println( "NonLeaf.replaceChildWith() " + dist + " with " + replacement); for (int i = 0; i < contents.length; ++i) { if (contents[i] == dist) { contents[i] = replacement; ((ParseTreeObject) replacement).setParent(this); return; } } throw new ParseTreeException( "no replacing target " + dist + " for " + replacement + " in the source code : " + toString()); } /** contents is the array of the elements of this nonleaf-node. */ private Object[] contents = null; /** * Allocates a new non-leaf(cons-cell), where the first element has * null and the second element has null. * */ public NonLeaf() { contents = new Object[0]; } /** * Makes a new copy (another object) of this nonleaf-node recursively. * The objects contained by this object will also be copied. * * @return the copy of this nonleaf-node as a ptree-node. */ public ParseTree makeRecursiveCopy() { NonLeaf result = (NonLeaf) makeCopy(); Object newc[] = new Object[contents.length]; for (int i = 0; i < contents.length; ++i) { if (contents[i] instanceof ParseTree) { ParseTree src = (ParseTree) contents[i]; newc[i] = (ParseTree) src.makeRecursiveCopy(); } else if (contents[i] instanceof String[]) { String[] srcary = (String[]) contents[i]; String[] destary = new String[srcary.length]; System.arraycopy(srcary, 0, destary, 0, srcary.length); newc[i] = destary; } else if (contents[i] instanceof TypeName[]) { TypeName[] srcary = (TypeName[]) contents[i]; TypeName[] destary = new TypeName[srcary.length]; for (int j = 0; j < srcary.length; ++j) { destary[j] = (TypeName) srcary[j].makeRecursiveCopy(); } newc[i] = destary; } else if (contents[i] instanceof VariableDeclarator[]) { VariableDeclarator[] srcary = (VariableDeclarator[]) contents[i]; VariableDeclarator[] destary = new VariableDeclarator[srcary.length]; for (int j = 0; j < srcary.length; ++j) { //VariableDe destary[j] = (VariableDeclarator) srcary[j].makeRecursiveCopy(); } newc[i] = destary; } else if (contents[i] instanceof Object[]) { System.err.println( "makeRecursiveCopy() not supported in " + getClass()); newc[i] = contents[i]; } else { newc[i] = contents[i]; } } result.set(newc); return result; } /** * Tests if this nonleaf-node's value equals to the specified * ptree-node's. * * @return true if two values are same. */ public boolean equals(ParseTree p) { if (p == null || getClass() != p.getClass()) return false; if (this == p) return true; NonLeaf nlp = (NonLeaf) p; int len = this.getLength(); if (len != nlp.getLength()) return false; System.err.println("equals() not supported in " + getClass().getName()); for (int i = 0; i < len; i++) { /*if(! equal( this.elementAt( i ), nlp.elementAt( i ) )) return false; */ } return true; } /** * Makes this ptree a list presenting for * [ p ] * * @param p list's element */ protected void set(Object[] ptrees) { contents = ptrees; for (int i = 0; i < contents.length; ++i) { if (contents[i] instanceof ParseTreeObject) { ((ParseTreeObject) contents[i]).setParent(this); } } } /** * Makes this ptree a list presenting for * [ p ] * * @param p list's element */ protected void set(Object p) { set(new Object[] { p }); } /** * Makes this ptree a list presenting for * [ p0 p1 ] * * @param p0 list's element * @param p1 list's element */ protected void set(Object p0, Object p1) { set(new Object[] { p0, p1 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element */ protected void set(Object p0, Object p1, Object p2) { set(new Object[] { p0, p1, p2 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 p3 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element * @param p3 list's element */ protected void set(Object p0, Object p1, Object p2, Object p3) { set(new Object[] { p0, p1, p2, p3 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 p3 p4 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element * @param p3 list's element * @param p4 list's element */ protected void set(Object p0, Object p1, Object p2, Object p3, Object p4) { set(new Object[] { p0, p1, p2, p3, p4 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 p3 p4 p5 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element * @param p3 list's element * @param p4 list's element */ protected void set( Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { set(new Object[] { p0, p1, p2, p3, p4, p5 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 p3 p4 p5 p6 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element * @param p3 list's element * @param p4 list's element * @param p5 list's element * @param p6 list's element */ protected void set( Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { set(new Object[] { p0, p1, p2, p3, p4, p5, p6 }); } /** * Makes this ptree a list presenting for * [ p0 p1 p2 p3 p4 p5 p6 p7 ] * * @param p0 list's element * @param p1 list's element * @param p2 list's element * @param p3 list's element * @param p4 list's element * @param p5 list's element * @param p6 list's element * @param p7 list's element */ protected void set( Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7) { set(new Object[] { p0, p1, p2, p3, p4, p5, p6, p7 }); } /** * Returns the specified element at the specified point of this * nonleaf-node. * * @param i index * @return the ptree object at the specified point */ protected Object elementAt(int i) { Object ret = null; try { ret = contents[i]; } catch (ArrayIndexOutOfBoundsException ex) { System.out.println(ex); //throw new NonLeafException( ex.toString() ); } return ret; } /** * Sets the specified element at the specified point of this * nonleaf-node. * * @param p ptree object to set * @param i index */ protected void setElementAt(Object p, int i) { try { contents[i] = p; if (contents[i] instanceof ParseTreeObject) { ((ParseTreeObject) contents[i]).setParent(this); } } catch (ArrayIndexOutOfBoundsException ex) { System.out.println(ex); //throw new NonLeafException( ex.toString() ); } } /** * Gets the contents of this nonleaf-node. * * @return contents */ public Object[] getContents() { /***********/ return contents; } /** * getLength() returns the length of this nonleaf-node * * @return the length of the list */ protected int getLength() { return contents.length; } /** * Sets the comment of javadoc format which explains this declaration. * * @param comment the Comment object to set */ public void setComment(String comment) { this.comment = comment; } /** * Obtains the comment of javadoc format which explains this declaration. * * @return the string of the comment */ public String getComment() { return this.comment; } /** * Accepts a ParseTreeVisitor object as the role of a * Visitor in the Visitor pattern, as the role of an Element in the * Visitor pattern.

* * This invoke an appropriate visit() method on each * child ParseTree object with this visitor. * * @param visitor a visitor **/ public void childrenAccept(ParseTreeVisitor visitor) throws ParseTreeException { if (contents == null) return; for (int i = 0; i < contents.length; ++i) { if (contents[i] instanceof ParseTree) { ParseTree ptree = (ParseTree) contents[i]; ptree.accept(visitor); } } } }