Skip to content
Snippets Groups Projects
Commit 08a8406d authored by Johannes Mey's avatar Johannes Mey
Browse files

initial commit of relast model generator (and some fixes and improvements)

parent a42fa93f
No related branches found
No related tags found
No related merge requests found
Showing
with 938 additions and 489 deletions
......@@ -81,6 +81,8 @@ task preprocess(type: JavaExec) {
args = [
"libs/relast.jar",
"./src/main/jastadd/ecore.relast",
"./src/main/jastadd/grammar/Grammar.relast",
"./src/main/jastadd/grammar/EcoreToGrammar.relast",
"--listClass=ArrayList",
"--jastAddList=JastAddList",
"--useJastAddNames",
......@@ -89,8 +91,14 @@ task preprocess(type: JavaExec) {
"--grammarName=./src/gen/jastadd/ecore"
]
inputs.files file("./src/main/jastadd/ecore.relast"), file("./libs/relast.jar")
outputs.files file("./src/gen/jastadd/ecore.ast"), file("./src/gen/jastadd/ecore.jadd"), file("./src/gen/jastadd/ecoreRefResolver.jadd"), file('./src/gen/jastadd/ecoreResolverStubs.jrag')
inputs.files file("./src/main/jastadd/ecore.relast"),
file("./src/main/jastadd/grammar/Grammar.relast"),
file("./src/main/jastadd/grammar/EcoreToGrammar.relast"),
file("./libs/relast.jar")
outputs.files file("./src/gen/jastadd/ecore.ast"),
file("./src/gen/jastadd/ecore.jadd"),
file("./src/gen/jastadd/ecoreRefResolver.jadd"),
file('./src/gen/jastadd/ecoreResolverStubs.jrag')
}
task jastadd2(type: JavaExec) {
......@@ -104,7 +112,7 @@ task jastadd2(type: JavaExec) {
"--visitCheck=false",
"--package=de.tudresden.inf.st.e2j.jastadd.model",
"--o=src/gen/java"
] + fileTree("./src/main/jastadd/").matching {exclude "*.relast"} + file("./src/gen/jastadd/ecore.ast") + file("./src/gen/jastadd/ecore.jadd") + file("./src/gen/jastadd/ecoreRefResolver.jadd") + file('./src/gen/jastadd/ecoreResolverStubs.jrag')
] + fileTree("./src/main/jastadd/").matching {exclude "**/*.relast"} + file("./src/gen/jastadd/ecore.ast") + file("./src/gen/jastadd/ecore.jadd") + file("./src/gen/jastadd/ecoreRefResolver.jadd") + file('./src/gen/jastadd/ecoreResolverStubs.jrag')
doFirst {
delete fileTree('src/gen/java/')
......@@ -117,7 +125,7 @@ task jastadd2(type: JavaExec) {
clean.doFirst {
delete "./src/gen/jastadd/ecore.ast"
delete "./src/gen/jastadd/v.jadd"
delete "./src/gen/jastadd/ecore.jadd"
delete "./src/gen/jastadd/ecoreRefResolver.jadd"
delete "./src/gen/jastadd/ecoreResolverStubs.jrag"
}
......
#Fri Nov 22 19:02:26 CET 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-all.zip
aspect EcoreAPI {
// EClassifier : ENamedElement ::= <InstanceClass:Class> <DefaultValue:Object>;
// EEnumLiteral : ENamedElement ::= <Instance:Enumerator>;
// EReference : EStructuralFeature ::= <Container:boolean>;
// EStructuralFeature : ETypedElement ::= <DefaultValue:Object> ;
// abstract ETypedElement : ENamedElement ::= <Many:boolean> <Required:boolean>;
/**
* abstract ETypedElement : ENamedElement ::= <Many:boolean>;
*/
syn boolean ETypedElement.many() = getUpperBound() < 0 || getUpperBound() > 1;
/**
* abstract ETypedElement : ENamedElement ::= <Required:boolean>;
*/
syn boolean ETypedElement.required() = getLowerBound() != 1;
/**
* rel EAttribute.EAttributeType -> EDataType;
*/
syn EDataType EAttribute.eAttributeType() = getEType().asEDataType();
// rel EClass.EAllAttributes* -> EAttribute;
// rel EClass.EAllReferences* -> EReference;
/**
* rel EClass.EReferences* -> EReference;
*/
syn java.util.List<EReference> EClass.eReferences() {
java.util.List<EReference> result = new java.util.ArrayList<>();
for (EStructuralFeature feature : getEStructuralFeatures()) {
if (feature.isEReference()) {
result.add(feature.asEReference());
}
}
return result;
}
/**
* rel EClass.EAttributes* -> EAttribute;
*/
syn java.util.List<EAttribute> EClass.eAttributes() {
java.util.List<EAttribute> result = new java.util.ArrayList<>();
for (EStructuralFeature feature : getEStructuralFeatures()) {
if (feature.isEAttribute()) {
result.add(feature.asEAttribute());
}
}
return result;
}
/**
* rel EClass.EAllSuperTypes* -> EClass;
*/
syn java.util.List<EClass> EClass.eAllSuperTypes() {
java.util.List<EClass> result = new java.util.ArrayList<>();
for (EClass superType : getESuperTypeList()) {
result.add(superType);
result.addAll(superType.eAllSuperTypes());
}
return result;
}
// rel EClass.EAttributes* -> EAttribute;
// rel EClass.EAllStructuralFeatures* -> EStructuralFeature;
// rel EClass.EAllContainments* -> EReference;
//
// rel EClass.EAllOperations* -> EOperation;
// rel EClass.EAllGenericSuperTypes* -> EGenericType;
// rel EClass.EIDAttribute -> EAttribute;
// rel EReference.EReferenceType -> EClass;
// rel EFactory.EPackage <-> EPackage.EFactoryInstance;
// rel EGenericType.ERawType -> EClassifier;
// inheritance helper attributes
syn boolean EStructuralFeature.isEReference() = false;
eq EReference.isEReference() = true;
syn EReference EStructuralFeature.asEReference() = null;
eq EReference.asEReference() = this;
syn boolean EStructuralFeature.isEAttribute() = false;
eq EAttribute.isEAttribute() = true;
syn EAttribute EStructuralFeature.asEAttribute() = null;
eq EAttribute.asEAttribute() = this;
syn boolean EClassifier.isEDataType() = false;
eq EDataType.isEDataType() = true;
syn EDataType EClassifier.asEDataType() = null;
eq EDataType.asEDataType() = this;
// containment navigation
inh EClass EStructuralFeature.eContainingClass();
eq EClass.getEStructuralFeature().eContainingClass() = this;
}
......@@ -10,7 +10,7 @@ aspect XMIPathResolution {
return (EReference) resolve(id);
}
refine RefResolverStubs eq EClass.resolveESuperTypesByToken(String id, int position) {
refine RefResolverStubs eq EClass.resolveESuperTypeByToken(String id, int position) {
return (EClass) resolve(id);
}
......@@ -18,7 +18,7 @@ aspect XMIPathResolution {
return (EClassifier) resolve(id);
}
refine RefResolverStubs eq EOperation.resolveEExceptionsByToken(String id, int position) {
refine RefResolverStubs eq EOperation.resolveEExceptionByToken(String id, int position) {
return (EClassifier) resolve(id);
}
......
......@@ -109,10 +109,10 @@ aspect XMIWriter {
if (getInterface() == true) {
b.append(" interface=\"true\"");
}
if (!getESuperTypesList().isEmpty()) {
if (!getESuperTypeList().isEmpty()) {
b.append(" eSuperTypes=\"");
boolean first = true;
for (EClass eSuperType : getESuperTypesList()) {
for (EClass eSuperType : getESuperTypeList()) {
if (first) {
first = false;
} else {
......@@ -315,7 +315,7 @@ aspect XMIWriter {
b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EOperation
for (EClassifier eException : getEExceptionsList()) {
for (EClassifier eException : getEExceptionList()) {
b.append(" eExceptions=\"").append(eException.xmiReference()).append("\"");
}
if (numContainedChildren() == 0) {
......
......@@ -30,10 +30,10 @@ ETypeParameter : ENamedElement ::= EBound:EGenericType*;
EGenericType ::= [EUpperBound:EGenericType] [ELowerBound:EGenericType] ETypeArgument:EGenericType*;
rel ETypedElement.EType? -> EClassifier;
rel EOperation.EExceptions* -> EClassifier;
rel EClass.ESuperTypes* -> EClass;
rel EOperation.EException* -> EClassifier;
rel EClass.ESuperType* -> EClass;
rel EReference.EOpposite? -> EReference;
rel EAnnotation.References* -> EObject;
rel EAnnotation.Reference* -> EObject;
rel EGenericType.ETypeParameter? -> ETypeParameter;
rel EGenericType.EClassifier? -> EClassifier;
......
aspect EcoreToGrammar {
/**
* transform the name of the ecore reference into a name that generates a nice API for JastAdd
*/
syn String EReference.grammarName() {
String name = getName();
if (name == null || name.isEmpty()) {
return "";
}
if (name.compareToIgnoreCase(getEType().getName()) == 0) {
logger().warn("The grammar name of reference '{}.{}' was removed, because it was the same (ignoring case) as the name of its type '{}'.", eContainingClass().getName(), getName(), getEType().getName());
return "";
}
// upper case it
name = name.substring(0, 1).toUpperCase() + name.substring(1);
// remove plural s
if (many() && name.endsWith("s")) {
if (name.compareToIgnoreCase(getEType().getName().concat("s")) == 0) {
logger().warn("The grammar name of reference '{}.{}' was removed, because it was the same (ignoring case) as the name of its type '{}' (plus a plural 's').", eContainingClass().getName(), getName(), getEType().getName());
return "";
}
logger().warn("The \"s\" at the end of the name of reference '{}.{}' was removed, because it is believed to be a plural 's'", eContainingClass().getName(), getName());
name = name.substring(0,name.length()-1);
}
return name;
}
/**
* transform the name of the ecore attribute into a name that generates a nice API for JastAdd
*/
syn String EAttribute.grammarName() {
String name = getName();
if (name == null || name.isEmpty()) {
return "";
}
// upper case it
name = name.substring(0, 1).toUpperCase() + name.substring(1);
return name;
}
syn lazy Grammar EPackage.getGrammar() {
Grammar grammar = new Grammar();
grammar.setEPackage(this);
java.util.Map<EClass, TypeDecl> eClassToTypeDecl = new java.util.LinkedHashMap<>();
for (EClass eClass : classes()) {
eClassToTypeDecl.put(eClass, new TypeDecl());
}
for (EClass eClass : classes()) {
TypeDecl typeDecl = eClassToTypeDecl.get(eClass);
typeDecl.setName(eClass.getName());
// supertypes
if (eClass.getESuperTypeList().size() > 1) {
throw new RuntimeException("Multiple inheritance is not possible in JastAdd");
} else if (eClass.getESuperTypeList().size() == 1) {
typeDecl.setSuperType(eClassToTypeDecl.get(eClass.getESuperTypeList().get(0)));
}
// abstract
typeDecl.setAbstract(eClass.getAbstract());
// add contained children
for (EReference containmentReference : eClass.containmentReferences()) {
TypeComponent component;
// is this a normal, list, or opt component?
if (containmentReference.many()) {
component = new ListComponent();
} else {
if (containmentReference.required()) {
component = new NormalComponent();
} else {
component = new OptComponent();
}
}
if (eClassToTypeDecl.containsKey(containmentReference.getEType())) {
component.setTypeDecl(eClassToTypeDecl.get(containmentReference.getEType()));
} else {
EClassifier eType = containmentReference.getEType();
throw new RuntimeException("EClassifier " + (eType == null ? "null" : eType.getName()) + " not found in classifier map");
}
component.setName(containmentReference.grammarName());
component.setNTA(containmentReference.getDerived());
typeDecl.addComponent(component);
}
// add terminal children
for (EAttribute attribute : eClass.eAttributes()) {
if (!attribute.getDerived()) {
typeDecl.addComponent(attribute.getComponent());
}
}
grammar.addTypeDecl(typeDecl);
}
// add the relations
for (EClass eClass : classes()) {
for (EStructuralFeature eStructuralFeature : eClass.getEStructuralFeatureList()) {
if (eStructuralFeature.isEReference()) {
EReference eReference = eStructuralFeature.asEReference();
if (!eReference.getContainment() && !eReference.getDerived() && !(eReference.hasEOpposite() && !eReference.getEOpposite().getContainment())) {
if (eReference.hasEOpposite() && !eReference.getEOpposite().getDerived()) {
// bidirectional relation
// only add the bidirectional relation once
if (this.hashCode() < eReference.getEOpposite().hashCode()) {
BidirectionalRelation relation = new BidirectionalRelation();
NavigableRole left;
// is this a normal, list, or opt role?
if (eReference.many()) {
left = new ListRole();
} else {
if (eReference.required()) {
left = new NormalRole();
} else {
left = new OptRole();
}
}
left.setName(eReference.grammarName());
if (eClassToTypeDecl.containsKey(eClass)) {
left.setType(eClassToTypeDecl.get(eClass));
} else {
EClassifier eType = eClass;
throw new RuntimeException("EClassifier " + (eType == null ? "null" : eType.getName()) + " not found in classifier map.");
}
relation.setLeft(left);
NavigableRole right;
// is this a normal, list, or opt role?
if (eReference.getEOpposite().many()) {
right = new ListRole();
} else {
if (eReference.getEOpposite().required()) {
right = new NormalRole();
} else {
right = new OptRole();
}
}
right.setName(eReference.getEOpposite().grammarName());
if (eClassToTypeDecl.containsKey(eReference.getEType())) {
right.setType(eClassToTypeDecl.get(eReference.getEType()));
} else {
EClassifier eType = eReference.getEType();
throw new RuntimeException("EClassifier " + (eType == null ? "null" : eType.getName()) + " not found in classifier map.");
}
relation.setRight(right);
grammar.addRelation(relation);
}
} else {
DirectedRelation relation = new DirectedRelation();
NavigableRole source;
// is this a normal, list, or opt role?
if (eReference.many()) {
source = new ListRole();
} else {
if (eReference.required()) {
source = new NormalRole();
} else {
source = new OptRole();
}
}
source.setName(eReference.grammarName());
if (eClassToTypeDecl.containsKey(eClass)) {
source.setType(eClassToTypeDecl.get(eClass));
} else {
EClassifier eType = eClass;
throw new RuntimeException("EClassifier " + (eType == null ? "null" : eType.getName()) + " not found in classifier map.");
}
relation.setSource(source);
UnnamedRole target = new UnnamedRole();
if (eClassToTypeDecl.containsKey(eReference.getEType())) {
target.setType(eClassToTypeDecl.get(eReference.getEType()));
} else {
EClassifier eType = eReference.getEType();
throw new RuntimeException("EClassifier " + (eType == null ? "null" : eType.getName()) + " not found in classifier map.");
}
relation.setTarget(target);
grammar.addRelation(relation);
}
}
}
}
}
return grammar;
}
// the implementation below does not work since its circular!
// syn lazy Grammar EPackage.getGrammar() {
//
// Grammar grammar = new Grammar();
//
// for (EClass eClass : classes()) {
// grammar.addTypeDecl(eClass.getTypeDecl());
// }
//
// return grammar;
// }
// syn lazy TypeDecl EClass.getTypeDecl() {
// TypeDecl typeDecl = new TypeDecl();
//
// typeDecl.setName(this.getName());
//
// // add contained children
// for (EReference containmentReference : containmentReferences()) {
// typeDecl.addComponent(containmentReference.getComponent());
// }
//
// // add terminal children
// for (EAttribute attribute: eAttributes()) {
// typeDecl.addComponent(attribute.getComponent());
// }
//
// return typeDecl;
// }
syn java.util.List<EReference> EClass.containmentReferences() {
java.util.List<EReference> result = new java.util.ArrayList<>();
for (EReference eReference : eReferences()) {
if (eReference.getContainment()) {
result.add(eReference);
}
}
return result;
}
// syn lazy TypeComponent EReference.getComponent() {
//
// TypeComponent component;
// // is this a normal, list, or opt component?
// if (many()) {
// component = new ListComponent();
// } else {
// if (required()) {
// component = new NormalComponent();
// } else {
// component = new OptComponent();
// }
// }
//
// component.setTypeDecl(eContainingClass().getTypeDecl());
// component.setName(getName());
// component.setNTA(getDerived());
//
// return component;
// }
syn lazy TokenComponent EAttribute.getComponent() {
TokenComponent component = new TokenComponent();
component.setName(grammarName());
String instanceClassName = eAttributeType().getInstanceClassName();
if (instanceClassName.length() == 0) {
instanceClassName = eAttributeType().getName();
}
JavaTypeUse typeUse = new SimpleJavaTypeUse();
typeUse.setName(instanceClassName);
if (many()) {
// wrap type in collection
boolean unique = getUnique();
boolean ordered = getOrdered();
ParameterizedJavaTypeUse collectionTypeUse = new ParameterizedJavaTypeUse();
if (!unique && !ordered) {
// Collection
collectionTypeUse.setName("java.util.Collection");
} else if (!unique && ordered) {
// List
collectionTypeUse.setName("java.util.List");
} else if (unique && !ordered) {
// TODO find correct data structure
collectionTypeUse.setName("java.util.List");
} else /* if (unique && ordered) */{
// Set
collectionTypeUse.setName("java.util.Set");
}
collectionTypeUse.addJavaTypeUse(typeUse);
component.setJavaTypeUse(collectionTypeUse);
} else {
component.setJavaTypeUse(typeUse);
}
return component;
}
coll java.util.Collection<EClass> EPackage.classes() [new java.util.ArrayList<>()] with add root EPackage;
EClass contributes this to EPackage.classes();
}
rel Grammar.EPackage -> EPackage;
Grammar ::= TypeDecl* Relation*;
TypeDecl ::= <Name> <Abstract:boolean> Component*;
rel TypeDecl.SuperType? <-> TypeDecl.SubType*;
abstract Component ::= <Name> <NTA:boolean>;
abstract TypeComponent : Component;
rel TypeComponent.TypeDecl <-> TypeDecl.PotentialParent*;
NormalComponent : TypeComponent;
ListComponent : TypeComponent;
OptComponent : TypeComponent;
TokenComponent : Component ::= JavaTypeUse;
abstract JavaTypeUse ::= <Name>;
SimpleJavaTypeUse : JavaTypeUse;
ParameterizedJavaTypeUse : JavaTypeUse ::= JavaTypeUse*;
abstract Relation ;
// rel Source.Name -> Target;
// rel Target <- Source.Name;
DirectedRelation : Relation ::= Source:NavigableRole Target:UnnamedRole ;
// rel Left.LeftName <-> Right.RightName;
BidirectionalRelation : Relation ::= Left:NavigableRole Right:NavigableRole ;
abstract Role;
abstract NavigableRole : Role ::= <Name>;
NormalRole : NavigableRole;
ListRole : NavigableRole;
OptRole : NavigableRole;
UnnamedRole : Role ;
rel Role.Type <-> TypeDecl.Role*;
aspect GrammarPrinting {
public void Grammar.print(StringBuilder b) {
b.append("// grammar for ecore package ").append(getEPackage().getName()).append("\n\n");
for (TypeDecl typeDecl : getTypeDeclList()) {
typeDecl.print(b);
}
b.append("\n");
for (Relation relation : getRelationList()) {
relation.print(b);
}
}
public void TypeDecl.print(StringBuilder b) {
if (getAbstract()) {
b.append("abstract ");
}
b.append(getName()).append(" ");
if (hasSuperType()) {
b.append(": ").append(getSuperType().getName()).append(" ");
}
b.append("::=");
for (Component component : getComponentList()) {
b.append(" ");
component.print(b);
}
b.append(";\n");
}
public abstract void Component.print(StringBuilder b);
public void NormalComponent.print(StringBuilder b) {
if (getNTA()) {
b.append("/");
}
if (!getName().equals("")) {
b.append(getName()).append(":");
}
b.append(getTypeDecl().getName());
if (getNTA()) {
b.append("/");
}
}
public void ListComponent.print(StringBuilder b) {
if (getNTA()) {
b.append("/");
}
if (!getName().equals("")) {
b.append(getName()).append(":");
}
b.append(getTypeDecl().getName()).append("*");
if (getNTA()) {
b.append("/");
}
}
public void OptComponent.print(StringBuilder b) {
if (getNTA()) {
b.append("/");
}
b.append("[");
if (!getName().equals("")) {
b.append(getName()).append(":");
}
b.append(getTypeDecl().getName()).append("]");
if (getNTA()) {
b.append("/");
}
}
public void TokenComponent.print(StringBuilder b) {
if (getNTA()) {
b.append("/");
}
b.append("<");
if (!getName().equals("")) {
b.append(getName()).append(":");
}
getJavaTypeUse().print(b);
b.append(">");
if (getNTA()) {
b.append("/");
}
}
abstract public void JavaTypeUse.print(StringBuilder b);
public void SimpleJavaTypeUse.print(StringBuilder b) {
b.append(getName());
}
public void ParameterizedJavaTypeUse.print(StringBuilder b) {
b.append("<");
boolean first = true;
for (JavaTypeUse javaTypeUse : getJavaTypeUseList()) {
if (first) {
first = false;
} else {
b.append(", ");
}
javaTypeUse.print(b);
}
b.append(">");
}
abstract public void Relation.print(StringBuilder b);
public void DirectedRelation.print(StringBuilder b) {
b.append("rel ");
getSource().print(b);
b.append(" -> ");
getTarget().print(b);
b.append(";\n");
}
public void BidirectionalRelation.print(StringBuilder b) {
b.append("rel ");
getLeft().print(b);
b.append(" <-> ");
getRight().print(b);
b.append(";\n");
}
abstract public void Role.print(StringBuilder b);
public void NormalRole.print(StringBuilder b) {
b.append(getType().getName()).append(".").append(getName());
}
public void ListRole.print(StringBuilder b) {
b.append(getType().getName()).append(".").append(getName()).append("*");
}
public void OptRole.print(StringBuilder b) {
b.append(getType().getName()).append(".").append(getName()).append("?");
}
public void UnnamedRole.print(StringBuilder b) {
b.append(getType().getName());
}
}
......@@ -275,7 +275,7 @@ public class EcoreParser {
break;
case "eSuperTypes":
for (String superType : attribute.getValue().split(" ")) {
eClass.addESuperTypes(EClass.createRefDirection(superType));
eClass.addESuperType(EClass.createRefDirection(superType));
}
break;
default:
......@@ -854,7 +854,7 @@ public class EcoreParser {
// from EOperation
case "eExceptions":
for (String eException : attribute.getValue().split(" ")) {
eOperation.addEExceptions(EClassifier.createRefDirection(eException));
eOperation.addEException(EClassifier.createRefDirection(eException));
}
break;
default:
......
package de.tudresden.inf.st.e2j;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class AbstractTest {
protected static void deleteFolder(String folder) throws IOException {
Path directory = Paths.get(folder);
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
}
package de.tudresden.inf.st.e2j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Stream;
public class EcoreFileProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
try (InputStream stream = this.getClass().getResourceAsStream("/ecore/zoo")) {
return new BufferedReader(new InputStreamReader(stream))
.lines()
.filter(fileName -> fileName.endsWith(".ecore"))
.map(Arguments::of);
} catch (IOException e) {
Assertions.fail(e);
}
// no stream if something fails
return Stream.empty();
}
}
package de.tudresden.inf.st.e2j;
import de.tudresden.inf.st.e2j.jastadd.model.EObject;
import de.tudresden.inf.st.e2j.jastadd.model.EPackage;
import de.tudresden.inf.st.e2j.jastadd.model.Grammar;
import de.tudresden.inf.st.e2j.parser.EcoreParser;
import de.tudresden.inf.st.e2j.parser.XMIParseException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
class TransformationTest extends AbstractTest {
private static Logger logger = LogManager.getLogger(TransformationTest.class);
@BeforeAll
static void setUpDirectories() throws IOException {
deleteFolder("src/gen/resources/grammar/zoo/");
deleteFolder("src/gen/resources/grammar/");
// if the required directories do not exist, create them
Files.createDirectories(Paths.get("src/gen/resources/grammar/zoo"));
}
@ParameterizedTest
@ArgumentsSource(EcoreFileProvider.class)
void transformEcore(String fileName) {
logger.info("transforming file src/test/resources/ecore/zoo/{}", fileName);
List<EObject> ePackages = null;
EcoreParser parser = new EcoreParser();
try (InputStream stream = this.getClass().getResourceAsStream("/ecore/zoo/" + fileName)) {
Assertions.assertNotNull(stream, "unable to load resource '" + fileName + "'");
ePackages = parser.parse(stream);
} catch (IOException | XMIParseException e) {
Assertions.fail(e);
}
Assertions.assertNotNull(ePackages);
Assertions.assertTrue(ePackages.size() > 0, "there should be at least one ePackage in an ecore model");
StringBuilder b = new StringBuilder();
for (EObject eObject : ePackages) {
Assertions.assertTrue(eObject instanceof EPackage);
Grammar grammar = ((EPackage) eObject).getGrammar();
grammar.print(b);
b.append("\n\n");
}
fileName = fileName.replaceFirst("\\.ecore$", ".relast");
logger.info("writing grammar to {}", fileName);
try (PrintWriter out = new PrintWriter("src/gen/resources/grammar/zoo/" + fileName, StandardCharsets.UTF_8.name())) {
out.print(b.toString());
} catch (FileNotFoundException | UnsupportedEncodingException e) {
Assertions.fail("unable to write output file", e);
}
}
/**
* transforms an ecore model into a relAST grammar
*
* @param sourceFile the source file (relative to src/test/resources)
* @param targetFile the target file, relative to the project base directory
*/
private void transformFile(String sourceFile, String targetFile) {
EObject ePackage = null;
EcoreParser parser = new EcoreParser();
try (InputStream stream = this.getClass().getResourceAsStream(sourceFile)) {
Assertions.assertNotNull(stream, "unable to load resource '" + sourceFile + "'");
ePackage = parser.parse(stream).get(0);
} catch (IOException | XMIParseException e) {
Assertions.fail(e);
}
Assertions.assertNotNull(ePackage);
Assertions.assertTrue(ePackage instanceof EPackage);
Grammar g = ((EPackage) ePackage).getGrammar();
StringBuilder b = new StringBuilder();
g.print(b);
try (PrintWriter out = new PrintWriter(targetFile)) {
out.print(b.toString());
} catch (FileNotFoundException e) {
Assertions.fail("unable to write output file", e);
}
}
@Test
void transformTrain() {
transformFile("/ecore/Train.ecore", "src/gen/resources/grammar/Train.relast");
}
@Test
void transformBigraph() {
transformFile("/ecore/bigraph.ecore", "src/gen/resources/grammar/bigraph.relast");
}
@Test
void transformEcore() {
transformFile("/ecore/ecore.ecore", "src/gen/resources/grammar/ecore.relast");
}
}
package de.tudresden.inf.st.e2j.parser;
import de.tudresden.inf.st.e2j.AbstractTest;
import de.tudresden.inf.st.e2j.EcoreFileProvider;
import de.tudresden.inf.st.e2j.jastadd.model.EObject;
import de.tudresden.inf.st.e2j.jastadd.model.EPackage;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.stream.Stream;
import java.nio.file.Files;
import java.nio.file.Paths;
class ParserTest {
class ParserTest extends AbstractTest {
private static Logger logger = LogManager.getLogger(ParserTest.class);
@BeforeAll
static void setUpDirectories() throws IOException {
deleteFolder("src/gen/resources/ecore/zoo/");
deleteFolder("src/gen/resources/ecore/");
// if the required directories do not exist, create them
Files.createDirectories(Paths.get("src/gen/resources/ecore/zoo"));
}
@ParameterizedTest
@ArgumentsSource(EcoreFileProvider.class)
void parseEcore(String fileName) {
......@@ -49,7 +59,7 @@ class ParserTest {
logger.info("writing {} packages", p.getPackageList().size());
p.writeXMI(b, "ISO-8859-1");
try (PrintWriter out = new PrintWriter("src/test/resources/ecore/zoo-gen/" + fileName, StandardCharsets.ISO_8859_1.name())) {
try (PrintWriter out = new PrintWriter("src/gen/resources/ecore/zoo/" + fileName, StandardCharsets.ISO_8859_1.name())) {
out.print(b.toString());
} catch (FileNotFoundException | UnsupportedEncodingException e) {
Assertions.fail("unable to write output file", e);
......@@ -83,7 +93,7 @@ class ParserTest {
p.writeXMI(b);
try (PrintWriter out = new PrintWriter("bigraph_out.ecore")) {
try (PrintWriter out = new PrintWriter("src/gen/resources/ecore/bigraph.ecore")) {
out.print(b.toString());
} catch (FileNotFoundException e) {
Assertions.fail("unable to write output file", e);
......@@ -118,7 +128,7 @@ class ParserTest {
p.writeXMI(b);
try (PrintWriter out = new PrintWriter("ecore_out.ecore")) {
try (PrintWriter out = new PrintWriter("src/gen/resources/ecore/ecore.ecore")) {
out.print(b.toString());
} catch (FileNotFoundException e) {
Assertions.fail("unable to write output file", e);
......@@ -127,23 +137,4 @@ class ParserTest {
System.out.println(b.toString());
}
public static class EcoreFileProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
try (InputStream stream = this.getClass().getResourceAsStream("/ecore/zoo")) {
return new BufferedReader(new InputStreamReader(stream))
.lines()
.filter(fileName -> fileName.endsWith(".ecore"))
.map(Arguments::of);
} catch (IOException e) {
Assertions.fail(e);
}
// no stream if something fails
return Stream.empty();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="railway" nsURI="http://www.semanticweb.org/ontologies/2015/trainbenchmark"
nsPrefix="railway">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="bundleManifest" value="false"/>
<details key="modelDirectory" value="trainbenchmark-format-emf-model/build/xcore/main"/>
<details key="complianceLevel" value="8.0"/>
<details key="basePackage" value="hu.bme.mit.trainbenchmark"/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="RailwayElement" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="RailwayContainer">
<eStructuralFeatures xsi:type="ecore:EReference" name="routes" upperBound="-1"
eType="#//Route" containment="true" resolveProxies="false"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="regions" upperBound="-1"
eType="#//Region" containment="true" resolveProxies="false"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Region" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="sensors" upperBound="-1"
eType="#//Sensor" containment="true" resolveProxies="false"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1"
eType="#//TrackElement" containment="true" resolveProxies="false"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Route" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="active" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="follows" upperBound="-1"
eType="#//SwitchPosition" containment="true" resolveProxies="false" eOpposite="#//SwitchPosition/route"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="requires" lowerBound="2"
upperBound="-1" eType="#//Sensor"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="entry" eType="#//Semaphore"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="exit" eType="#//Semaphore"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Sensor" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="monitors" upperBound="-1"
eType="#//TrackElement" eOpposite="#//TrackElement/monitoredBy"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="TrackElement" abstract="true" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="monitoredBy" upperBound="-1"
eType="#//Sensor" eOpposite="#//Sensor/monitors"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="connectsTo" upperBound="-1"
eType="#//TrackElement"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Segment" eSuperTypes="#//TrackElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="length" unique="false"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="semaphores" upperBound="-1"
eType="#//Semaphore" containment="true" resolveProxies="false"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Switch" eSuperTypes="#//TrackElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="currentPosition" unique="false"
eType="#//Position"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="positions" upperBound="-1"
eType="#//SwitchPosition" eOpposite="#//SwitchPosition/target"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SwitchPosition" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="position" unique="false"
eType="#//Position"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="route" eType="#//Route"
eOpposite="#//Route/follows"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//Switch"
eOpposite="#//Switch/positions"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Semaphore" eSuperTypes="#//RailwayElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="signal" unique="false"
eType="#//Signal"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Position">
<eLiterals name="FAILURE"/>
<eLiterals name="STRAIGHT" value="1"/>
<eLiterals name="DIVERGING" value="2"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Signal">
<eLiterals name="FAILURE"/>
<eLiterals name="STOP" value="1"/>
<eLiterals name="GO" value="2"/>
</eClassifiers>
</ecore:EPackage>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
<ecore:EPackage name="ACG">
<eClassifiers xsi:type="ecore:EClass" name="LocatedElement" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="location" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="commentsBefore" unique="false" upperBound="-1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="commentsAfter" unique="false" upperBound="-1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ACG" eSuperTypes="/0/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="metamodel" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="startsWith" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1" eType="/0/ACGElement" containment="true" eOpposite="/0/ACGElement/acg"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ACGElement" abstract="true" eSuperTypes="/0/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="acg" ordered="false" lowerBound="1" eType="/0/ACG" eOpposite="/0/ACG/elements"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Function" eSuperTypes="/0/ACGElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="context" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1" eType="/0/Parameter" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="body" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Attribute" eSuperTypes="/0/ACGElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="context" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="body" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="/0/VariableDecl"/>
<eClassifiers xsi:type="ecore:EClass" name="Node" abstract="true" eSuperTypes="/0/ACGElement /0/StatementBlock">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="element" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" ordered="false" unique="false" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="guard" ordered="false" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ASMNode" eSuperTypes="/0/Node">
<eStructuralFeatures xsi:type="ecore:EReference" name="name" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="CodeNode" eSuperTypes="/0/Node"/>
<eClassifiers xsi:type="ecore:EClass" name="SimpleNode" eSuperTypes="/0/Node"/>
<eClassifiers xsi:type="ecore:EClass" name="StatementBlock" abstract="true" eSuperTypes="/0/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="statements" upperBound="-1" eType="/0/Statement" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Statement" abstract="true" eSuperTypes="/0/LocatedElement"/>
<eClassifiers xsi:type="ecore:EClass" name="CompoundStat" abstract="true" eSuperTypes="/0/Statement /0/StatementBlock"/>
<eClassifiers xsi:type="ecore:EClass" name="ForEachStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="iterator" ordered="false" lowerBound="1" eType="/0/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="collection" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OnceStat" eSuperTypes="/0/CompoundStat"/>
<eClassifiers xsi:type="ecore:EClass" name="VariableStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="definition" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="name" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OperationStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="context" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="name" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ConditionalStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseStatements" upperBound="-1" eType="/0/Statement" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="LetStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false" lowerBound="1" eType="/0/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="AnalyzeStat" eSuperTypes="/0/CompoundStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="target" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" ordered="false" unique="false" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ReportStat" eSuperTypes="/0/Statement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="severity" ordered="false" unique="false" lowerBound="1" eType="/0/Severity"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="Severity">
<eLiterals name="critic" value="1"/>
<eLiterals name="error" value="2"/>
<eLiterals name="warning" value="3"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="FieldStat" eSuperTypes="/0/Statement">
<eStructuralFeatures xsi:type="ecore:EReference" name="name" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ParamStat" eSuperTypes="/0/Statement">
<eStructuralFeatures xsi:type="ecore:EReference" name="name" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="EmitStat" abstract="true" eSuperTypes="/0/Statement"/>
<eClassifiers xsi:type="ecore:EClass" name="LabelStat" eSuperTypes="/0/EmitStat">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="id" ordered="false" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NewStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="DupStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="DupX1Stat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PopStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="SwapStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="IterateStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="EndIterateStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="GetAsmStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="FindMEStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PushTStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PushFStat" eSuperTypes="/0/EmitStat"/>
<eClassifiers xsi:type="ecore:EClass" name="EmitWithOperandStat" abstract="true" eSuperTypes="/0/EmitStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="operand" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="PushStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PushIStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PushDStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="LoadStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="StoreStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="CallStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="PCallStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="SuperCallStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="GetStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="SetStat" eSuperTypes="/0/EmitWithOperandStat"/>
<eClassifiers xsi:type="ecore:EClass" name="EmitWithLabelRefStat" abstract="true" eSuperTypes="/0/EmitStat">
<eStructuralFeatures xsi:type="ecore:EReference" name="label" ordered="false" lowerBound="1" eType="/0/LabelStat"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="IfStat" eSuperTypes="/0/EmitWithLabelRefStat"/>
<eClassifiers xsi:type="ecore:EClass" name="GotoStat" eSuperTypes="/0/EmitWithLabelRefStat"/>
<eClassifiers xsi:type="ecore:EClass" name="VariableDecl" eSuperTypes="/0/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Expression" abstract="true" eSuperTypes="/0/LocatedElement"/>
<eClassifiers xsi:type="ecore:EClass" name="VariableExp" eSuperTypes="/0/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false" lowerBound="1" eType="/0/VariableDecl"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SelfExp" eSuperTypes="/0/Expression"/>
<eClassifiers xsi:type="ecore:EClass" name="LastExp" eSuperTypes="/0/Expression"/>
<eClassifiers xsi:type="ecore:EClass" name="IfExp" eSuperTypes="/0/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="thenExp" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseExp" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="IsAExp" eSuperTypes="/0/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="source" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="LetExp" eSuperTypes="/0/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false" lowerBound="1" eType="/0/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="in" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="PropertyCallExp" abstract="true" eSuperTypes="/0/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="source" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NavigationExp" eSuperTypes="/0/PropertyCallExp"/>
<eClassifiers xsi:type="ecore:EClass" name="IteratorExp" eSuperTypes="/0/PropertyCallExp">
<eStructuralFeatures xsi:type="ecore:EReference" name="iterator" ordered="false" lowerBound="1" eType="/0/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="body" ordered="false" lowerBound="1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OperationCallExp" eSuperTypes="/0/PropertyCallExp">
<eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OperatorCallExp" eSuperTypes="/0/OperationCallExp"/>
<eClassifiers xsi:type="ecore:EClass" name="LiteralExp" abstract="true" eSuperTypes="/0/Expression"/>
<eClassifiers xsi:type="ecore:EClass" name="OclUndefinedExp" eSuperTypes="/0/LiteralExp"/>
<eClassifiers xsi:type="ecore:EClass" name="CollectionExp" abstract="true" eSuperTypes="/0/LiteralExp">
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1" eType="/0/Expression" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SequenceExp" eSuperTypes="/0/CollectionExp"/>
<eClassifiers xsi:type="ecore:EClass" name="BooleanExp" eSuperTypes="/0/LiteralExp">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/1/Boolean"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="IntegerExp" eSuperTypes="/0/LiteralExp">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/1/Integer"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="StringExp" eSuperTypes="/0/LiteralExp">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
</ecore:EPackage>
<ecore:EPackage name="PrimitiveTypes">
<eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
<eClassifiers xsi:type="ecore:EDataType" name="Integer"/>
<eClassifiers xsi:type="ecore:EDataType" name="String"/>
</ecore:EPackage>
</xmi:XMI>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
<ecore:EPackage name="ACME">
<eClassifiers xsi:type="ecore:EClass" name="ACMEFile">
<eStructuralFeatures xsi:type="ecore:EReference" name="entries" ordered="false" upperBound="-1" eType="/0/ACMEEntry" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ACMEEntry" abstract="true"/>
<eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="representations" upperBound="-1" eType="/0/Representation" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1" eType="/0/Property" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Type" eSuperTypes="/0/Element"/>
<eClassifiers xsi:type="ecore:EClass" name="System" eSuperTypes="/0/Element /0/ACMEEntry">
<eStructuralFeatures xsi:type="ecore:EReference" name="componentDeclaration" upperBound="-1" eType="/0/ComponentInstance" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="connectorDeclaration" upperBound="-1" eType="/0/Connector" containment="true" eOpposite="/0/Connector/system"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="attachments" upperBound="-1" eType="/0/Link" containment="true" eOpposite="/0/Link/systemAttachment"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="bindings" upperBound="-1" eType="/0/Link" containment="true" eOpposite="/0/Link/systemBinding"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Representation">
<eStructuralFeatures xsi:type="ecore:EReference" name="systems" upperBound="-1" eType="/0/System" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Component" abstract="true" eSuperTypes="/0/Element">
<eStructuralFeatures xsi:type="ecore:EReference" name="ports" upperBound="-1" eType="/0/Port" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ComponentInstance" eSuperTypes="/0/Component">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="instanceOf" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ComponentType" eSuperTypes="/0/Component /0/ACMEEntry">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="extend" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Port" eSuperTypes="/0/Element"/>
<eClassifiers xsi:type="ecore:EClass" name="Connector" eSuperTypes="/0/Element">
<eStructuralFeatures xsi:type="ecore:EReference" name="roles" upperBound="-1" eType="/0/Role" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="system" ordered="false" lowerBound="1" eType="/0/System" eOpposite="/0/System/connectorDeclaration"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Role" eSuperTypes="/0/Element"/>
<eClassifiers xsi:type="ecore:EClass" name="Property">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="val" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Link" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="systemBinding" ordered="false" lowerBound="1" eType="/0/System" eOpposite="/0/System/bindings"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="systemAttachment" ordered="false" lowerBound="1" eType="/0/System" eOpposite="/0/System/attachments"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Attachment" eSuperTypes="/0/Link">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="comp" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="port" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="con" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="role" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Binding" eSuperTypes="/0/Link">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="compSrc" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="portSrc" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="compDest" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="portDest" ordered="false" unique="false" lowerBound="1" eType="/1/String"/>
</eClassifiers>
</ecore:EPackage>
<ecore:EPackage name="PrimitiveTypes">
<eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
<eClassifiers xsi:type="ecore:EDataType" name="Integer"/>
<eClassifiers xsi:type="ecore:EDataType" name="String"/>
</ecore:EPackage>
</xmi:XMI>
<?xml version="1.0" encoding="ISO-8859-1"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="ADELFE">
<eClassifiers xsi:type="ecore:EClass" name="Classifier"/>
<eClassifiers xsi:type="ecore:EClass" name="Environnement" eSuperTypes="#//Classifier">
<eStructuralFeatures xsi:type="ecore:EReference" name="element" ordered="false" lowerBound="1" eType="#//Element" containment="true" eOpposite="#//Element/environnement"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Element" eSuperTypes="#//Classifier">
<eStructuralFeatures xsi:type="ecore:EReference" name="environnement" ordered="false" lowerBound="1" eType="#//Environnement" eOpposite="#//Environnement/element"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="action" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/elementA"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="perception" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/elementP"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="CooperativeAgent">
<eStructuralFeatures xsi:type="ecore:EReference" name="elementA" ordered="false" lowerBound="1" eType="#//Element" eOpposite="#//Element/action"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elementP" ordered="false" lowerBound="1" eType="#//Element" eOpposite="#//Element/perception"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="representation" ordered="false" lowerBound="1" upperBound="-1" eType="#//Representation" containment="true" eOpposite="#//Representation/cooperativeAgentR"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="skill" ordered="false" lowerBound="1" upperBound="-1" eType="#//Skill" containment="true" eOpposite="#//Skill/cooperativeAgentS"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="aptitude" ordered="false" upperBound="-1" eType="#//Aptitude" containment="true" eOpposite="#//Aptitude/cooperativeAgentA"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="characteristic" ordered="false" upperBound="-1" eType="#//Characteristic" containment="true" eOpposite="#//Characteristic/cooperativeAgentCha"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="communication" ordered="false" upperBound="-1" eType="#//Communication" containment="true" eOpposite="#//Communication/cooperativeAgentCom"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="observes" ordered="false" lowerBound="1" upperBound="-1" eType="#//CooperationRules"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Representation">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperativeAgentR" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/representation"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="element" ordered="false" lowerBound="1" eType="#//Element"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Skill">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperativeAgentS" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/skill"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Aptitude">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperativeAgentA" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/aptitude"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Characteristic">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperativeAgentCha" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/characteristic"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Communication">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperativeAgentCom" ordered="false" lowerBound="1" eType="#//CooperativeAgent" eOpposite="#//CooperativeAgent/communication"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="aip" ordered="false" upperBound="-1" eType="#//AIP"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="AIP"/>
<eClassifiers xsi:type="ecore:EClass" name="CooperationRules">
<eStructuralFeatures xsi:type="ecore:EReference" name="detects" ordered="false" lowerBound="1" upperBound="-1" eType="#//NCS" eOpposite="#//NCS/cooperationRules"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NCS">
<eStructuralFeatures xsi:type="ecore:EReference" name="cooperationRules" ordered="false" lowerBound="1" eType="#//CooperationRules" eOpposite="#//CooperationRules/detects"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Incomprehension" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Ambiguity" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Incompetence" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Unproductiveness" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Concurrency" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Conflict" eSuperTypes="#//NCS"/>
<eClassifiers xsi:type="ecore:EClass" name="Uselessness" eSuperTypes="#//NCS"/>
</ecore:EPackage>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
<ecore:EPackage name="PrimitiveTypes">
<eClassifiers xsi:type="ecore:EDataType" name="String"/>
<eClassifiers xsi:type="ecore:EDataType" name="Integer"/>
<eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
</ecore:EPackage>
<ecore:EPackage name="ASM">
<eClassifiers xsi:type="ecore:EClass" name="LocatedElement" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="location" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="XAsmFile" abstract="true" eSuperTypes="/1/LocatedElement"/>
<eClassifiers xsi:type="ecore:EClass" name="XAsmSpec" eSuperTypes="/1/XAsmFile">
<eStructuralFeatures xsi:type="ecore:EReference" name="Asm" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Asm" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Asm" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="signature" ordered="false" lowerBound="1" eType="/1/Signature" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="returnType" ordered="false" unique="false" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="metaInformation" ordered="false" lowerBound="1" eType="/1/MetaInformation" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="body" ordered="false" lowerBound="1" eType="/1/Body" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Signature" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="isMain" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="arguments" ordered="false" upperBound="-1" eType="/1/Argument" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Argument" eSuperTypes="/1/VariableDecl">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Body" eSuperTypes="/1/XAsmFile">
<eStructuralFeatures xsi:type="ecore:EReference" name="declarations" upperBound="-1" eType="/1/Declaration" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="initialization" ordered="false" eType="/1/Initialization" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rules" ordered="false" upperBound="-1" eType="/1/Rule" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="MetaInformation" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="usedAsIn" ordered="false" upperBound="-1" eType="/1/Signature" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="usedAs" ordered="false" unique="false" lowerBound="1" eType="/2/AsmType"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="accessUpdateFunctions" ordered="false" upperBound="-1" eType="/1/AccessUpdateFunction" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="AccessUpdateFunction" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" ordered="false" unique="false" lowerBound="1" eType="/2/AccessUpdateType"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="functions" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Function" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Declaration" abstract="true" eSuperTypes="/1/LocatedElement"/>
<eClassifiers xsi:type="ecore:EClass" name="Function" eSuperTypes="/1/Declaration /1/ElementDecl">
<eStructuralFeatures xsi:type="ecore:EReference" name="parameters" ordered="false" upperBound="-1" eType="/1/Parameter" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="returnType" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="initTerm" ordered="false" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="isExternal" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="type" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Universe" eSuperTypes="/1/Declaration">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="contents" ordered="false" unique="false" upperBound="-1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="superUniverses" ordered="false" upperBound="-1" eType="/1/Universe"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Initialization" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="rules" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Term" abstract="true" eSuperTypes="/1/LocatedElement"/>
<eClassifiers xsi:type="ecore:EClass" name="Constant" abstract="true" eSuperTypes="/1/Term"/>
<eClassifiers xsi:type="ecore:EClass" name="FunctionOrVariableTerm" eSuperTypes="/1/Term">
<eStructuralFeatures xsi:type="ecore:EReference" name="declaration" ordered="false" lowerBound="1" eType="/1/ElementDecl"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="terms" ordered="false" upperBound="-1" eType="/1/Term" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OperatorTerm" eSuperTypes="/1/Term">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="opName" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="leftExp" ordered="false" lowerBound="1" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rightExp" ordered="false" eType="/1/Term" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="BooleanConstant" eSuperTypes="/1/Constant">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="IntegerConstant" eSuperTypes="/1/Constant">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/Integer"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="StringConstant" eSuperTypes="/1/Constant">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="UndefConstant" eSuperTypes="/1/Constant"/>
<eClassifiers xsi:type="ecore:EClass" name="Rule" abstract="true" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="inSequence" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SkipRule" eSuperTypes="/1/Rule"/>
<eClassifiers xsi:type="ecore:EClass" name="AsmInvocation" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="asmName" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="arguments" ordered="false" upperBound="-1" eType="/1/Term" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="UpdateRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="function" ordered="false" lowerBound="1" eType="/1/FunctionOrVariableTerm" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="updateTerm" ordered="false" lowerBound="1" eType="/1/Term" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ChooseRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="chooseId" ordered="false" lowerBound="1" eType="/1/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="inSet" ordered="false" eType="/1/Universe" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="guard" ordered="false" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ifChoosenRules" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ifNotChoosenRule" ordered="false" eType="/1/Rule" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="DoForallRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="id" ordered="false" lowerBound="1" eType="/1/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="inSet" ordered="false" eType="/1/Universe" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" ordered="false" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="doRule" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ConditionalRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" ordered="false" lowerBound="1" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="thenRule" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseRule" ordered="false" eType="/1/Rule" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseIfRule" ordered="false" eType="/1/ElseIf" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ElseIf" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" ordered="false" lowerBound="1" eType="/1/Term" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="thenRule" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseRule" ordered="false" eType="/1/Rule" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="elseIfRule" ordered="false" eType="/1/ElseIf" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ExtendRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="extensions" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Extension" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rules" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Rule" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ElementDecl" abstract="true" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="VariableDecl" eSuperTypes="/1/ElementDecl"/>
<eClassifiers xsi:type="ecore:EClass" name="Extension" eSuperTypes="/1/LocatedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="elements" ordered="false" lowerBound="1" upperBound="-1" eType="/1/VariableDecl" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="universe" ordered="false" lowerBound="1" eType="/1/Universe" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ReturnRule" eSuperTypes="/1/Rule">
<eStructuralFeatures xsi:type="ecore:EReference" name="term" ordered="false" lowerBound="1" eType="/1/Term" containment="true"/>
</eClassifiers>
</ecore:EPackage>
<ecore:EPackage name="Enum">
<eClassifiers xsi:type="ecore:EEnum" name="AccessUpdateType">
<eLiterals name="access" value="1"/>
<eLiterals name="update" value="2"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="AsmType">
<eLiterals name="function" value="1"/>
<eLiterals name="subasm" value="2"/>
</eClassifiers>
</ecore:EPackage>
</xmi:XMI>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment