package java_cup.runtime; import java.util.LinkedList; import java.util.List; import java.util.Stack; public class SyntaxTreeTransform { private static class ChainRemover extends SyntaxTreeDFS.AbstractVisitor{ public XMLElement root(){ return stack.pop(); } private Stack<XMLElement> stack = new Stack<XMLElement>(); @Override public void defaultPost(XMLElement arg0, List<XMLElement> arg1) { int n = arg1.size(); if (n>1){ LinkedList<XMLElement> elems = new LinkedList<>(); while (n-->0) elems.addFirst(stack.pop()); XMLElement ne = new XMLElement.NonTerminal(arg0.getTagname(),0,elems.toArray(new XMLElement[0])); stack.push(ne); return; } //if (n==1){} if (n==0) stack.push(arg0); } @Override public void defaultPre(XMLElement arg0, List<XMLElement> arg1) {} } public static XMLElement removeUnaryChains(XMLElement elem) { ChainRemover cr = new ChainRemover(); SyntaxTreeDFS.dfs(elem, cr); return cr.root(); } }