/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableCC. * * See the file "LICENSE" for copyright information and the * * terms and conditions for copying, distribution and * * modification of SableCC. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package org.sablecc.sablecc; import org.sablecc.sablecc.analysis.*; import org.sablecc.sablecc.node.*; public class PrettyPrinter extends DepthFirstAdapter { public static String production_INDENT = " "; public static String prod_transform_INDENT = " "; public static String alternative_INDENT = " "; public static String alt_transform_INDENT = " "; @Override public void caseAProductions(AProductions node) { System.err.println("Productions \n"); AProd[] prods = (AProd[]) node.getProds().toArray(new AProd[0]); for (int i = 0; i < prods.length; i++) { prods[i].apply(this); } } @Override public void caseAProd(AProd node) { System.err.print(production_INDENT + node.getId().getText()); String hasProdTransform = "="; if (node.getArrow() == null) { hasProdTransform = ""; System.err.println(" = "); } System.err.println(); AElem[] elems = (AElem[]) node.getProdTransform().toArray(new AElem[0]); //if(node.getArrow() != null) if (elems.length > 0) { System.err.print(prod_transform_INDENT + "{-> "); for (int i = 0; i < elems.length; i++) { //System.err.print(elems[i] + " "); elems[i].apply(this); System.err.print(" "); } System.err.println(" } " + hasProdTransform); } Object[] alts = (Object[]) node.getAlts().toArray(); for (int i = 0; i < alts.length - 1; i++) { ((PAlt) alts[i]).apply(this); System.err.println(" |"); } ((PAlt) alts[alts.length - 1]).apply(this); System.err.println("\n" + alternative_INDENT + ";\n"); } @Override public void caseAAlt(AAlt node) { System.err.print("\n" + alternative_INDENT); if (node.getAltName() != null) { System.err.print("{" + node.getAltName().getText() + "} "); } AElem[] listElems = (AElem[]) node.getElems().toArray(new AElem[0]); for (int i = 0; i < listElems.length; i++) { //System.err.print(listElems[i]); listElems[i].apply(this); System.err.print(" "); } if (node.getAltTransform() != null) { node.getAltTransform().apply(this); } } @Override public void caseAAltTransform(AAltTransform node) { System.err.print("\n" + alt_transform_INDENT + "{-> "); Object[] terms = (Object[]) node.getTerms().toArray(); for (int i = 0; i < terms.length; i++) { ((PTerm) terms[i]).apply(this); System.err.print(" "); } System.err.print(" } "); } @Override public void caseAProdName(AProdName node) { System.err.print(node.getId().getText()); if (node.getProdNameTail() != null) { System.err.print("." + node.getProdNameTail().getText()); } } @Override public void caseANewTerm(ANewTerm node) { System.err.print("New "); node.getProdName().apply(this); System.err.print(" ("); Object[] params = node.getParams().toArray(); if (params.length > 0) { for (int i = 0; i < params.length - 1; i++) { ((PTerm) params[i]).apply(this); System.err.print(", "); } ((PTerm) params[params.length - 1]).apply(this); } System.err.print(" )"); } @Override public void caseAListTerm(AListTerm node) { System.err.print("[ "); Object[] list_terms = node.getListTerms().toArray(); for (int i = 0; i < list_terms.length; i++) { ((PListTerm) list_terms[i]).apply(this); } System.err.print(" ]"); } @Override public void caseASimpleTerm(ASimpleTerm node) { if (node.getSpecifier() != null) { if (node.getSpecifier() instanceof ATokenSpecifier) { System.err.print("T."); } else { System.err.print("P."); } } System.err.print(node.getId().getText()); if (node.getSimpleTermTail() != null) { System.err.print("." + node.getSimpleTermTail().getText()); } System.err.print(" "); } @Override public void caseANullTerm(ANullTerm node) { System.err.print("Null "); } @Override public void caseANewListTerm(ANewListTerm node) { System.err.print("New "); node.getProdName().apply(this); System.err.print(" ("); Object[] params = node.getParams().toArray(); if (params.length > 0) { for (int i = 0; i < params.length - 1; i++) { ((PTerm) params[i]).apply(this); System.err.print(", "); } ((PTerm) params[params.length - 1]).apply(this); } System.err.print(" )"); } @Override public void caseASimpleListTerm(ASimpleListTerm node) { if (node.getSpecifier() != null) { if (node.getSpecifier() instanceof ATokenSpecifier) { System.err.print("T."); } else { System.err.print("P."); } } System.err.print(node.getId().getText()); if (node.getSimpleTermTail() != null) { System.err.print("." + node.getSimpleTermTail().getText()); } System.err.print(" "); } @Override public void caseAAst(AAst node) { System.err.print("Abstract Syntax Tree\n"); AAstProd[] prods = (AAstProd[]) node.getProds().toArray(new AAstProd[0]); for (int i = 0; i < prods.length; i++) { prods[i].apply(this); } } @Override public void caseAAstProd(AAstProd node) { System.err.println(production_INDENT + node.getId().getText() + " ="); AAstAlt[] alts = (AAstAlt[]) node.getAlts().toArray(new AAstAlt[0]); for (int i = 0; i < alts.length - 1; i++) { alts[i].apply(this); System.err.println("| "); } alts[alts.length - 1].apply(this); System.err.println("\n" + alternative_INDENT + ";\n"); } @Override public void caseAAstAlt(AAstAlt node) { System.err.print(alternative_INDENT); if (node.getAltName() != null) { System.err.print("{" + node.getAltName().getText() + "} "); } AElem[] listElems = (AElem[]) node.getElems().toArray(new AElem[0]); for (int i = 0; i < listElems.length; i++) { //System.err.print(listElems[i]); listElems[i].apply(this); System.err.print(" "); } } @Override public void caseAElem(AElem node) { if (node.getElemName() != null) { System.err.print("[" + node.getElemName().getText() + "]: "); } if (node.getSpecifier() != null) { if (node.getSpecifier() instanceof ATokenSpecifier) { System.err.print("T."); } else { System.err.print("P."); } } System.err.print(node.getId().getText()); if (node.getUnOp() != null) { node.getUnOp().apply(new DepthFirstAdapter() { @Override public void caseAStarUnOp(AStarUnOp node) { System.err.print("*"); } @Override public void caseAQMarkUnOp(AQMarkUnOp node) { System.err.print("?"); } @Override public void caseAPlusUnOp(APlusUnOp node) { System.err.print("+"); } } ); } } }