/* * Created on Jun 2, 2006 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu * (jactr.org) This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the License, * or (at your option) any later version. This library is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. You should have * received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ package org.jactr.io.antlr3.serialization; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.net.URL; import org.antlr.runtime.CommonToken; import org.antlr.runtime.tree.CommonTree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.io.antlr3.misc.DetailedCommonTree; import org.jactr.io.antlr3.misc.DetailedCommonTreeAdaptor; public class Serializer { /** * logger definition */ static public final Log LOGGER = LogFactory .getLog(Serializer.class); static private DetailedCommonTreeAdaptor _adaptor = new DetailedCommonTreeAdaptor(); static public void write(CommonTree tree, DataOutput output) throws IOException { output.writeInt(tree.getType()); output.writeUTF(tree.getText()); // we ignore the token CommonToken token = (CommonToken) tree.getToken(); output.writeInt(token.getType()); output.writeUTF(token.getText()); output.writeInt(token.getStartIndex()); output.writeInt(token.getStopIndex()); output.writeInt(token.getLine()); output.writeInt(token.getCharPositionInLine()); output.writeInt(tree.getTokenStartIndex()); output.writeInt(tree.getTokenStopIndex()); int start = -1; int end = -1; String url = ""; if (tree instanceof DetailedCommonTree) { start = ((DetailedCommonTree) tree).getStartOffset(); end = ((DetailedCommonTree) tree).getStopOffset(); if (((DetailedCommonTree) tree).getSource() != null) url = ((DetailedCommonTree) tree).getSource().toString(); } output.writeInt(start); output.writeInt(end); output.writeUTF(url); // children output.writeInt(tree.getChildCount()); for (int i = 0; i < tree.getChildCount(); i++) write((CommonTree) tree.getChild(i), output); } static public CommonTree read(DataInput input) throws IOException { int nodeType = input.readInt(); String nodeText = input.readUTF(); int tokenType = input.readInt(); String tokenText = input.readUTF(); int tokenStart = input.readInt(); int tokenStop = input.readInt(); int tokenLine = input.readInt(); int tokenLineOffset = input.readInt(); CommonToken token = new CommonToken(tokenType, tokenText); token.setStartIndex(tokenStart); token.setStopIndex(tokenStop); token.setLine(tokenLine); token.setCharPositionInLine(tokenLineOffset); DetailedCommonTree node = (DetailedCommonTree) _adaptor.create(nodeType, token, nodeText); node.setTokenStartIndex(input.readInt()); node.setTokenStopIndex(input.readInt()); node.setStartOffset(input.readInt()); node.setEndOffset(input.readInt()); String url = input.readUTF(); if (url.length() != 0) try { node.setSource(new URL(url)); } catch (Exception e) { } int children = input.readInt(); for (int i = 0; i < children; i++) node.addChild(read(input)); return node; } }