+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2008 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// ANTLRUtil.java\r
-// Since: Nov 4, 2008 9:51:27 AM\r
-//\r
-// $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/antlr/ANTLRUtil.java $\r
-// $Author: leo $\r
-//--------------------------------------\r
-package org.xerial.util.antlr;\r
-\r
-import java.io.IOException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Properties;\r
-import java.util.TreeMap;\r
-\r
-import org.antlr.runtime.Token;\r
-import org.antlr.runtime.tree.Tree;\r
-import org.xerial.core.XerialError;\r
-import org.xerial.core.XerialErrorCode;\r
-import org.xerial.util.FileResource;\r
-import org.xerial.util.StringUtil;\r
-import org.xerial.util.log.Logger;\r
-\r
-public class ANTLRUtil {\r
- private static Logger _logger = Logger.getLogger(ANTLRUtil.class);\r
-\r
- public static String toVisibleString(String text) {\r
- text = text.replaceAll("\n", "\\\\n");\r
- text = text.replaceAll("\r", "\\\\r");\r
- text = text.replaceAll("\t", "\\\\t");\r
- return String.format("\"%s\"", text);\r
- }\r
-\r
- /**\r
- * Generates a string representation of the parse tree.\r
- * \r
- * @param t\r
- * parse tree\r
- * @param parserTokenNames\r
- * pass the ANTLR Parser.tokenNames\r
- * @return a string representation of the parse tree\r
- */\r
- public static String parseTree(Tree t, String[] parserTokenNames) {\r
- StringBuilder sb = new StringBuilder();\r
- parseTree(sb, t, 0, parserTokenNames);\r
- return sb.toString();\r
- }\r
-\r
- private static void parseTree(StringBuilder sb, Tree t, int depth, String[] parserTokenNames) {\r
- if (t == null)\r
- return;\r
-\r
- // input node itself\r
- for (int i = 0; i < depth; i++) {\r
- sb.append(" ");\r
- }\r
- String tokenName = parserTokenNames[t.getType()];\r
- sb.append("[");\r
- sb.append(tokenName);\r
- sb.append("]\t");\r
- if (t.getText() != null && !t.getText().equals(tokenName))\r
- sb.append(toVisibleString(t.getText()));\r
- sb.append(StringUtil.newline());\r
-\r
- // child nodes\r
- for (int i = 0; i < t.getChildCount(); i++) {\r
- parseTree(sb, t.getChild(i), depth + 1, parserTokenNames);\r
- }\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- public static Map<Integer, String> getTokenTable(Class< ? > packageBaseClass,\r
- String tokenFileName) {\r
- Properties p = new Properties();\r
- TreeMap<Integer, String> tokenTable = new TreeMap<Integer, String>();\r
-\r
- URL wikiTokenFileURL = FileResource.find(packageBaseClass, tokenFileName);\r
- try {\r
- if (wikiTokenFileURL != null)\r
- p.load(wikiTokenFileURL.openStream());\r
- }\r
- catch (IOException e) {\r
- throw new XerialError(XerialErrorCode.IO_EXCEPTION, e);\r
- }\r
-\r
- for (Iterator it = p.keySet().iterator(); it.hasNext();) {\r
- String tokenName = (String) it.next();\r
- try {\r
- int tokenType = Integer.parseInt(p.get(tokenName).toString());\r
- tokenTable.put(tokenType, tokenName);\r
- }\r
- catch (NumberFormatException e) {\r
- _logger.warn(e);\r
- }\r
-\r
- }\r
-\r
- return tokenTable;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- public static List<String> prettyPrintTokenList(List tokenList, Map<Integer, String> tokenTable) {\r
- ArrayList<String> result = new ArrayList<String>();\r
- for (Iterator it = tokenList.iterator(); it.hasNext();) {\r
- Token t = (Token) it.next();\r
- result.add(prettyPrint(t, tokenTable));\r
- }\r
- return result;\r
- }\r
-\r
- public static String prettyPrint(Token t, Map<Integer, String> tokenTable) {\r
-\r
- int charStart = t.getCharPositionInLine();\r
- int charEnd = charStart + t.getText().length();\r
- return String.format("[%2d[%2d,%2d)] %12s: %s", t.getLine(), charStart, charEnd, tokenTable\r
- .get(t.getType()), ANTLRUtil.toVisibleString(t.getText()));\r
- }\r
-\r
-}\r