From 6f38942e31412cb45399fcc6206c057c07444ab5 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sun, 19 Aug 2012 11:29:03 -0500 Subject: [PATCH] Add overload of Trees.toStringTree that takes a list of rule names instead of a Recognizer instance --- .../org/antlr/v4/runtime/tree/TraceTree.java | 2 +- .../src/org/antlr/v4/runtime/tree/Trees.java | 42 +++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/TraceTree.java b/runtime/Java/src/org/antlr/v4/runtime/tree/TraceTree.java index fd216a18e..2c52ba4f2 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/TraceTree.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/TraceTree.java @@ -99,6 +99,6 @@ public class TraceTree implements Tree { @Override public String toStringTree() { - return Trees.toStringTree(this, null); + return Trees.toStringTree(this); } } diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java b/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java index 3c03af150..7d017a5fc 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java @@ -32,6 +32,7 @@ package org.antlr.v4.runtime.tree; import org.antlr.v4.runtime.Parser; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.NotNull; +import org.antlr.v4.runtime.misc.Nullable; import org.antlr.v4.runtime.misc.Utils; import org.antlr.v4.runtime.tree.gui.TreePostScriptGenerator; @@ -39,6 +40,7 @@ import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -75,31 +77,55 @@ public class Trees { writePS(t, recog, fileName, "Helvetica", 11); } - /** Print out a whole tree in LISP form. getNodeText is used on the + /** Print out a whole tree in LISP form. {@link #getNodeText} is used on the * node payloads to get the text for the nodes. Detect * parse trees and extract data appropriately. */ - public static String toStringTree(Tree t, Parser recog) { - String s = Utils.escapeWhitespace(getNodeText(t, recog), false); + public static String toStringTree(@NotNull Tree t) { + return toStringTree(t, (List)null); + } + + /** Print out a whole tree in LISP form. {@link #getNodeText} is used on the + * node payloads to get the text for the nodes. Detect + * parse trees and extract data appropriately. + */ + public static String toStringTree(@NotNull Tree t, @Nullable Parser recog) { + String[] ruleNames = recog != null ? recog.getRuleNames() : null; + List ruleNamesList = ruleNames != null ? Arrays.asList(ruleNames) : null; + return toStringTree(t, ruleNamesList); + } + + /** Print out a whole tree in LISP form. {@link #getNodeText} is used on the + * node payloads to get the text for the nodes. Detect + * parse trees and extract data appropriately. + */ + public static String toStringTree(@NotNull Tree t, @Nullable List ruleNames) { + String s = Utils.escapeWhitespace(getNodeText(t, ruleNames), false); if ( t.getChildCount()==0 ) return s; StringBuilder buf = new StringBuilder(); buf.append("("); - s = Utils.escapeWhitespace(getNodeText(t, recog), false); + s = Utils.escapeWhitespace(getNodeText(t, ruleNames), false); buf.append(s); buf.append(' '); for (int i = 0; i0 ) buf.append(' '); - buf.append(toStringTree(t.getChild(i), recog)); + buf.append(toStringTree(t.getChild(i), ruleNames)); } buf.append(")"); return buf.toString(); } - public static String getNodeText(Tree t, Parser recog) { - if ( recog!=null ) { + public static String getNodeText(@NotNull Tree t, @Nullable Parser recog) { + String[] ruleNames = recog != null ? recog.getRuleNames() : null; + List ruleNamesList = ruleNames != null ? Arrays.asList(ruleNames) : null; + return getNodeText(t, ruleNamesList); + } + + public static String getNodeText(@NotNull Tree t, @Nullable List ruleNames) { + if ( ruleNames!=null ) { if ( t instanceof RuleNode ) { int ruleIndex = ((RuleNode)t).getRuleContext().getRuleIndex(); - String ruleName = recog.getRuleNames()[ruleIndex]; + String ruleName = ruleNames.get(ruleIndex); return ruleName; } else if ( t instanceof ErrorNode) {