/*
* Copyright (c) 2003- michael lawley and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation
* which accompanies this distribution, and is available by writing to
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Contributors:
* michael lawley
*
*
*/
package tefkat.model.parser;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import antlr.TokenStreamHiddenTokenFilter;
import antlr.RecognitionException;
import antlr.TokenStreamException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import tefkat.model.TRule;
import tefkat.model.Transformation;
/**
* @author lawley
*
*/
public abstract class Main {
private static ResourceSet resourceSet = new ResourceSetImpl();
public static void main(String[] args) {
tefkat.model.impl.TefkatPackageImpl.init();
if (args.length > 0) {
for (int i = 0; i < args.length; i++) {
try {
System.out.println("Loading: " + args[i]);
InputStream stream = new FileInputStream(args[i]);
parseStream(stream, args[i], true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
} else {
parseStream(System.in, "<terminal>", false);
}
}
private static void parseStream(InputStream stream, String name, boolean dumpXMI) {
TefkatLexer lexer = new TefkatLexer(stream);
// use nonstandard token object
lexer.setTokenObjectClass("antlr.CommonHiddenStreamToken");
// create the filter
TokenStreamHiddenTokenFilter filter = new TokenStreamHiddenTokenFilter(lexer);
// hide not discard
//filter.hide(TefkatParser.COMMENT);
filter.hide(TefkatParser.WS);
TefkatParser parser = new TefkatParser(filter);
try {
URI uri = URI.createURI(name + ".tefkat");
Resource resource = resourceSet.createResource(uri);
System.err.println("Enter transformation:");
parser.setResource(resource);
Transformation t = parser.transformation();
System.err.println(" " + t);
System.err.println("vars");
printList("\t", t.getVars());
// System.err.println("tracking");
// printList("\t", t.getTracking());
System.err.println("patterns");
printList("\t", t.getPatternDefn());
System.err.println("rules");
printList("\t", t.getTRule());
System.err.println("OK!");
if (dumpXMI) {
dumpXMI(name + ".tefkat", t);
}
} catch (RecognitionException e) {
e.printStackTrace();
} catch (TokenStreamException e) {
e.printStackTrace();
}
}
private static void printList(String prefix, List list) {
Iterator itr = list.iterator();
while (itr.hasNext()) {
Object o = itr.next();
System.err.println(prefix + o);
if (o instanceof TRule) {
TRule tr = (TRule) o;
printList(prefix + "ex" + prefix, tr.getExtended());
printList(prefix + "su" + prefix, tr.getSuperseded());
}
}
}
private static void dumpXMI(String url, Transformation t) {
try {
System.out.println("Dumping XMI to " + url);
URI uri = URI.createFileURI(url);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put("*", new org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl());
// TODO - fix resource management
Resource resource = resourceSet.createResource(uri);
resource.getContents().add(t);
resource.save(Collections.EMPTY_MAP);
} catch (Exception e) {
e.printStackTrace();
}
}
}