/**
* <copyright>
* </copyright>
*
*
*/
package org.emftext.term.propositional.expression.resource.expression.util;
/**
* This class provides basic infrastructure to interpret models. To implement
* concrete interpreters, subclass this abstract interpreter and override the
* interprete_* methods. The interpretation can be customized by binding the two
* type parameters (ResultType, ContextType). The former is returned by all
* interprete_* methods, while the latter is passed from method to method while
* traversing the model. The concrete traversal strategy can also be exchanged.
* One can use a static traversal strategy by pushing all objects to interpret on
* the interpretation stack (using addObjectToInterprete()) before calling
* interprete(). Alternatively, the traversal strategy can be dynamic by pushing
* objects on the interpretation stack during interpretation.
*/
public class AbstractExpressionInterpreter<ResultType, ContextType> {
private java.util.Stack<org.eclipse.emf.ecore.EObject> interpretationStack = new java.util.Stack<org.eclipse.emf.ecore.EObject>();
private java.util.List<org.emftext.term.propositional.expression.resource.expression.IExpressionInterpreterListener> listeners = new java.util.ArrayList<org.emftext.term.propositional.expression.resource.expression.IExpressionInterpreterListener>();
private org.eclipse.emf.ecore.EObject nextObjectToInterprete;
private Object currentContext;
public ResultType interprete(ContextType context) {
ResultType result = null;
org.eclipse.emf.ecore.EObject next = null;
currentContext = context;
while (!interpretationStack.empty()) {
try {
next = interpretationStack.pop();
} catch (java.util.EmptyStackException ese) {
// this can happen when the interpreter was terminated between the call to empty()
// and pop()
break;
}
nextObjectToInterprete = next;
notifyListeners(next);
result = interprete(next, context);
if (!continueInterpretation(context, result)) {
break;
}
}
currentContext = null;
return result;
}
/**
* Override this method to stop the overall interpretation depending on the result
* of the interpretation of a single model elements.
*/
public boolean continueInterpretation(ContextType context, ResultType result) {
return true;
}
public ResultType interprete(org.eclipse.emf.ecore.EObject object, ContextType context) {
ResultType result = null;
if (object instanceof org.emftext.term.propositional.expression.And) {
result = interprete_org_emftext_term_propositional_expression_And((org.emftext.term.propositional.expression.And) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.Or) {
result = interprete_org_emftext_term_propositional_expression_Or((org.emftext.term.propositional.expression.Or) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.Not) {
result = interprete_org_emftext_term_propositional_expression_Not((org.emftext.term.propositional.expression.Not) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.FeatureRef) {
result = interprete_org_emftext_term_propositional_expression_FeatureRef((org.emftext.term.propositional.expression.FeatureRef) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.Nested) {
result = interprete_org_emftext_term_propositional_expression_Nested((org.emftext.term.propositional.expression.Nested) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.BinaryOperator) {
result = interprete_org_emftext_term_propositional_expression_BinaryOperator((org.emftext.term.propositional.expression.BinaryOperator) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.UnaryOperator) {
result = interprete_org_emftext_term_propositional_expression_UnaryOperator((org.emftext.term.propositional.expression.UnaryOperator) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.Term) {
result = interprete_org_emftext_term_propositional_expression_Term((org.emftext.term.propositional.expression.Term) object, context);
}
if (result != null) {
return result;
}
if (object instanceof org.emftext.term.propositional.expression.Constraint) {
result = interprete_org_emftext_term_propositional_expression_Constraint((org.emftext.term.propositional.expression.Constraint) object, context);
}
if (result != null) {
return result;
}
return result;
}
public ResultType interprete_org_emftext_term_propositional_expression_Term(org.emftext.term.propositional.expression.Term term, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_And(org.emftext.term.propositional.expression.And and, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_Or(org.emftext.term.propositional.expression.Or or, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_Not(org.emftext.term.propositional.expression.Not not, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_FeatureRef(org.emftext.term.propositional.expression.FeatureRef featureRef, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_Nested(org.emftext.term.propositional.expression.Nested nested, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_BinaryOperator(org.emftext.term.propositional.expression.BinaryOperator binaryOperator, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_UnaryOperator(org.emftext.term.propositional.expression.UnaryOperator unaryOperator, ContextType context) {
return null;
}
public ResultType interprete_org_emftext_term_propositional_expression_Constraint(org.emftext.term.propositional.expression.Constraint constraint, ContextType context) {
return null;
}
private void notifyListeners(org.eclipse.emf.ecore.EObject element) {
for (org.emftext.term.propositional.expression.resource.expression.IExpressionInterpreterListener listener : listeners) {
listener.handleInterpreteObject(element);
}
}
/**
* Adds the given object to the interpretation stack. Attention: Objects that are
* added first, are interpret last.
*/
public void addObjectToInterprete(org.eclipse.emf.ecore.EObject object) {
interpretationStack.push(object);
}
/**
* Adds the given collection of objects to the interpretation stack. Attention:
* Collections that are added first, are interpret last.
*/
public void addObjectsToInterprete(java.util.Collection<? extends org.eclipse.emf.ecore.EObject> objects) {
for (org.eclipse.emf.ecore.EObject object : objects) {
addObjectToInterprete(object);
}
}
/**
* Adds the given collection of objects in reverse order to the interpretation
* stack.
*/
public void addObjectsToInterpreteInReverseOrder(java.util.Collection<? extends org.eclipse.emf.ecore.EObject> objects) {
java.util.List<org.eclipse.emf.ecore.EObject> reverse = new java.util.ArrayList<org.eclipse.emf.ecore.EObject>(objects.size());
reverse.addAll(objects);
java.util.Collections.reverse(reverse);
addObjectsToInterprete(reverse);
}
/**
* Adds the given object and all its children to the interpretation stack such
* that they are interpret in top down order.
*/
public void addObjectTreeToInterpreteTopDown(org.eclipse.emf.ecore.EObject root) {
java.util.List<org.eclipse.emf.ecore.EObject> objects = new java.util.ArrayList<org.eclipse.emf.ecore.EObject>();
objects.add(root);
java.util.Iterator<org.eclipse.emf.ecore.EObject> it = root.eAllContents();
while (it.hasNext()) {
org.eclipse.emf.ecore.EObject eObject = (org.eclipse.emf.ecore.EObject) it.next();
objects.add(eObject);
}
addObjectsToInterpreteInReverseOrder(objects);
}
public void addListener(org.emftext.term.propositional.expression.resource.expression.IExpressionInterpreterListener newListener) {
listeners.add(newListener);
}
public boolean removeListener(org.emftext.term.propositional.expression.resource.expression.IExpressionInterpreterListener listener) {
return listeners.remove(listener);
}
public org.eclipse.emf.ecore.EObject getNextObjectToInterprete() {
return nextObjectToInterprete;
}
public java.util.Stack<org.eclipse.emf.ecore.EObject> getInterpretationStack() {
return interpretationStack;
}
public void terminate() {
interpretationStack.clear();
}
public Object getCurrentContext() {
return currentContext;
}
}