Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java')
-rw-r--r--plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java248
1 files changed, 119 insertions, 129 deletions
diff --git a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
index 0c68c6e..4a26476 100644
--- a/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
+++ b/plugins/org.eclipse.gmt.tcs.injector/src/org/eclipse/gmt/tcs/injector/ParserLauncher.java
@@ -1,129 +1,119 @@
-/**
- * Copyright (c) 2008 INRIA.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * INRIA - initial API and implementation
- *
- * $Id: ParserLauncher.java,v 1.3 2008/06/28 17:12:25 fjouault Exp $
- */
-package org.eclipse.gmt.tcs.injector;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.gmt.tcs.injector.TCSRuntime.RefSetting;
-import org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper;
-
-/**
- *
- * @author Mikaël Barbero
- * @author Frédéric Jouault
- *
- */
-public class ParserLauncher {
-
- private final static int DEFAULT_TAB_SIZE = 8;
-
- private List refSettings;
- private ParserWrapper parserWrapper;
-
- public Object parse(ModelAdapter target, InputStream in, Map arguments) {
- Object ret = null;
-
- refSettings = new ArrayList();
-
- int tabSize = arguments.get("tabSize") == null ? DEFAULT_TAB_SIZE : Integer.parseInt((String)arguments.get("tabSize"));
-
- String parserGeneratorClassName = (String)arguments.get("parserGenerator");
- if(parserGeneratorClassName != null) {
- try {
- parserWrapper = (ParserWrapper)Class.forName("org.eclipse.gmt.tcs.injector.wrappers." + parserGeneratorClassName + ".ParserWrapper", true, Thread.currentThread().getContextClassLoader()).newInstance();
- } catch (InstantiationException e) {
- throw new IllegalArgumentException("Unable to instanciate parser generator with name " + parserGeneratorClassName, e);
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException("Unable to access to parser generator with name " + parserGeneratorClassName, e);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Unable to locate parser generator with name " + parserGeneratorClassName, e);
- }
- } else {
- // default parser generator
- parserWrapper = new org.eclipse.gmt.tcs.injector.wrappers.antlr3.ParserWrapper();
- }
-
- String nameAndProductionRule = (String)arguments.get("name");
- String ss[] = nameAndProductionRule.split("-");
- String name = ss[0];
-
- String productionRule = "main";
- if(ss.length > 1) {
- productionRule = ss[1];
- }
-
- TCSRuntime runtime = new TCSRuntime(target, parserWrapper, refSettings, arguments);
- parserWrapper.setRuntime(runtime);
-
- try {
- ret = parserWrapper.parse(tabSize, name, productionRule, in, arguments);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-// if(runtime.getNbErrors() == 0) {
- // A RefSetting that can autoCreate an element should come before other
- // RefSettings that might refer to this element.
- Collections.sort(refSettings, new Comparator() {
- public int compare(Object o1, Object o2) {
- RefSetting rs1 = (RefSetting)o1;
- RefSetting rs2 = (RefSetting)o2;
- if(rs1.canAutoCreate() && !rs2.canAutoCreate())
- return -1; // autoCreate first
- else if(rs2.canAutoCreate() && !rs1.canAutoCreate())
- return 1; // autoCreate first
- else // both or none are autoCreate
- return 0; // don't care
- }
- });
-
- // A RefSetting that relies on imported contexts can only be executed after
- // the RefSetting importing the corresponding context (and this, recursively).
- // For now, we sort RefSettings so that all those that import a context
- // are executed first.
- // If a RefSetting that imports a context relies on imported contexts,
- // then this solution is not enough.
- // The concept of imported context should be defined cleanly first.
- Collections.sort(refSettings, new Comparator() {
- public int compare(Object o1, Object o2) {
- RefSetting rs1 = (RefSetting)o1;
- RefSetting rs2 = (RefSetting)o2;
- if(rs1.importContext && !rs2.importContext)
- return -1; // importContext first
- else if(rs2.importContext && !rs1.importContext)
- return 1; // importContext first
- else // both or none are importContext
- return 0; // don't care
- }
- });
-
- for(Iterator i = refSettings.iterator() ; i.hasNext() ; ) {
- RefSetting rs = (RefSetting)i.next();
- try {
- rs.doIt();
- } catch(Exception e) {
- System.out.println("Warning: one refSetting crashed:");
- e.printStackTrace(System.out);
- }
- }
-// }
-
- return ret;
- }
-}
+/**
+ * Copyright (c) 2008, 2014 INRIA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * INRIA - initial API and implementation
+ * Dennis Wagelaar
+ *
+ * $Id: ParserLauncher.java,v 1.1 2009/04/21 14:12:27 wpiers Exp $
+ */
+package org.eclipse.gmt.tcs.injector;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.gmt.tcs.injector.TCSRuntime.RefSetting;
+import org.eclipse.gmt.tcs.injector.wrappers.ParserWrapper;
+
+/**
+ *
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ * @author <a href="mailto:frederic.jouault@univ-nantes.fr">Frederic Jouault</a>
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public class ParserLauncher {
+
+ private final static int DEFAULT_TAB_SIZE = 8;
+
+ private List refSettings;
+ private ParserWrapper parserWrapper;
+
+ public Object parse(ModelAdapter target, Reader in, Map arguments) throws IOException {
+ Object ret = null;
+
+ refSettings = new ArrayList();
+
+ int tabSize = arguments.get("tabSize") == null ? DEFAULT_TAB_SIZE : Integer.parseInt((String)arguments.get("tabSize"));
+
+ String parserGeneratorClassName = (String)arguments.get("parserGenerator");
+ if(parserGeneratorClassName != null) {
+ try {
+ parserWrapper = (ParserWrapper)Class.forName("org.eclipse.gmt.tcs.injector.wrappers." + parserGeneratorClassName + ".ParserWrapper", true, Thread.currentThread().getContextClassLoader()).newInstance();
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("Unable to instanciate parser generator with name " + parserGeneratorClassName, e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Unable to access to parser generator with name " + parserGeneratorClassName, e);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Unable to locate parser generator with name " + parserGeneratorClassName, e);
+ }
+ } else {
+ // default parser generator
+ parserWrapper = new org.eclipse.gmt.tcs.injector.wrappers.antlr3.ParserWrapper();
+ }
+
+ String nameAndProductionRule = (String)arguments.get("name");
+ String ss[] = nameAndProductionRule.split("-");
+ String name = ss[0];
+
+ String productionRule = "main";
+ if(ss.length > 1) {
+ productionRule = ss[1];
+ }
+
+ TCSRuntime runtime = new TCSRuntime(target, parserWrapper, refSettings, arguments);
+ parserWrapper.setRuntime(runtime);
+
+ try {
+ ret = parserWrapper.parse(tabSize, name, productionRule, in, arguments);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+// if(runtime.getNbErrors() == 0) {
+ // A RefSetting that relies on imported contexts can only be executed after
+ // the RefSetting importing the corresponding context (and this, recursively).
+ // For now, we sort RefSettings so that all those that import a context
+ // are executed first.
+ // If a RefSetting that imports a context relies on imported contexts,
+ // then this solution is not enough.
+ // The concept of imported context should be defined cleanly first.
+ Collections.sort(refSettings, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ RefSetting rs1 = (RefSetting)o1;
+ RefSetting rs2 = (RefSetting)o2;
+ if(rs1.importContext && !rs2.importContext)
+ return -1; // importContext first
+ else if(rs2.importContext && !rs1.importContext)
+ return 1; // importContext first
+ else // both or none are importContext
+ return 0; // don't care
+ }
+ });
+
+ int nbCrashedRefSettings = 0;
+ for(Iterator i = refSettings.iterator() ; i.hasNext() ; ) {
+ RefSetting rs = (RefSetting)i.next();
+ try {
+ rs.doIt();
+ } catch(Exception e) {
+ nbCrashedRefSettings++;
+ }
+ }
+ if(nbCrashedRefSettings > 0)
+ //TODO: check crashes cause
+ throw new IOException("Warning: " + nbCrashedRefSettings + " refSetting crashed");
+// }
+
+ return ret;
+ }
+}

Back to the top