Skip to content
Snippets Groups Projects
Commit 83f59c0a authored by René Schöne's avatar René Schöne
Browse files

Clean-up, document and rename some attributes.

parent d7192852
No related branches found
No related tags found
1 merge request!4Clean-up, document and rename some attributes.
Pipeline #4587 failed
...@@ -4,8 +4,10 @@ import java.util.*; ...@@ -4,8 +4,10 @@ import java.util.*;
aspect TypeAnalysis { aspect TypeAnalysis {
public abstract TypeUse Component.getTypeUse(); public abstract TypeUse Component.getTypeUse();
//--- lookupType ---
syn TypeDecl TypeUse.decl() = lookupType(getID()); syn TypeDecl TypeUse.decl() = lookupType(getID());
inh TypeDecl TypeUse.lookupType(String name); inh TypeDecl TypeUse.lookupType(String name);
inh TypeDecl TypeDecl.lookupType(String name);
eq Program.getChild().lookupType(String name) { eq Program.getChild().lookupType(String name) {
for (TypeDecl td : getTypeDecls()) { for (TypeDecl td : getTypeDecls()) {
if (td.getID().equals(name)) { if (td.getID().equals(name)) {
...@@ -14,54 +16,56 @@ aspect TypeAnalysis { ...@@ -14,54 +16,56 @@ aspect TypeAnalysis {
} }
return null; return null;
} }
syn boolean TypeDecl.isAlreadyDeclared()
= lookupType(getID()) != this;
inh TypeDecl TypeDecl.lookupType(String name);
syn TypeDecl TypeDecl.mostGeneralSuperType() { //--- isAlreadyDeclared ---
if (!hasSuper()) { syn boolean TypeDecl.isAlreadyDeclared() = lookupType(getID()) != this;
return this;
} else {
return getSuper().decl().mostGeneralSuperType();
}
}
} }
aspect ComponentAnalysis { aspect ComponentAnalysis {
syn boolean Component.isTargetOfDirectedRelation() = false; //--- isTargetOfDirectedRelation ---
eq RelationComponent.isTargetOfDirectedRelation() = isTargetOfRightDirection() | isTargetOfLeftDirection(); inh boolean Component.isTargetOfDirectedRelation();
inh boolean RelationComponent.isTargetOfRightDirection(); eq Relation.getRight().isTargetOfDirectedRelation() = getDirection() instanceof RightDirection;
eq Relation.getRight().isTargetOfRightDirection() eq Program.getChild().isTargetOfDirectedRelation() = false;
= getDirection() instanceof RightDirection;
eq Program.getChild().isTargetOfRightDirection() = false;
inh boolean RelationComponent.isTargetOfLeftDirection();
eq Relation.getLeft().isTargetOfLeftDirection()
= getDirection() instanceof LeftDirection;
eq Program.getChild().isTargetOfLeftDirection() = false;
//--- name ---
syn String Component.name() = getID(); syn String Component.name() = getID();
//--- toTypeDecl ---
/** @return enclosing type */
syn TypeDecl Component.toTypeDecl() = enclosingTypeDecl(); syn TypeDecl Component.toTypeDecl() = enclosingTypeDecl();
/** @return type of nonterminal relation role is defined for */
eq RelationComponent.toTypeDecl() = getTypeUse().decl(); eq RelationComponent.toTypeDecl() = getTypeUse().decl();
//--- enclosingTypeDecl ---
inh TypeDecl Component.enclosingTypeDecl(); inh TypeDecl Component.enclosingTypeDecl();
eq TypeDecl.getChild().enclosingTypeDecl() = this; eq TypeDecl.getChild().enclosingTypeDecl() = this;
eq Program.getChild().enclosingTypeDecl() = null; eq Program.getChild().enclosingTypeDecl() = null;
//--- otherSide ---
inh RelationComponent RelationComponent.otherSide(); inh RelationComponent RelationComponent.otherSide();
eq Relation.getLeft().otherSide() = getRight(); eq Relation.getLeft().otherSide() = getRight();
eq Relation.getRight().otherSide() = getLeft(); eq Relation.getRight().otherSide() = getLeft();
eq Program.getChild().otherSide() = null; eq Program.getChild().otherSide() = null;
//--- ofTypeDecl ---
syn TypeDecl RelationComponent.ofTypeDecl() = otherSide().toTypeDecl(); syn TypeDecl RelationComponent.ofTypeDecl() = otherSide().toTypeDecl();
syn boolean Component.isAlreadyDeclared() //--- isAlreadyDeclared ---
= !isTargetOfDirectedRelation() /**
&& toTypeDecl() != null * Check, if role with the same name is already declared on the same nonterminal
&& lookupComponent(toTypeDecl(), name()) != this; */
inh Component Component.lookupComponent(TypeDecl td, String name); syn boolean RelationComponent.isAlreadyDeclared()
eq Program.getChild().lookupComponent(TypeDecl td, String name) = !isTargetOfDirectedRelation() /* if unnamed in relation, there is no role name, so no error */
= lookupComponentSyn(td, name); && toTypeDecl() != null /* nonterminal type of role is defined */
syn Component Program.lookupComponentSyn(TypeDecl td, String name) { && findComponent(toTypeDecl(), name()) != this; /* there is another role defined previously with the same name */
//--- findComponent ---
/** Search for either a component on the RHS of the given type with the given name,
* or a relation part for the given type and a role with the given name */
inh Component Component.findComponent(TypeDecl td, String name);
eq Program.getChild().findComponent(TypeDecl td, String name)
= findComponentSyn(td, name);
syn Component Program.findComponentSyn(TypeDecl td, String name) {
for (Component c: td.getComponents()) { for (Component c: td.getComponents()) {
if (c.name().equals(name)) { if (c.name().equals(name)) {
return c; return c;
...@@ -69,30 +73,34 @@ aspect ComponentAnalysis { ...@@ -69,30 +73,34 @@ aspect ComponentAnalysis {
} }
for (Relation r : getRelations()) { for (Relation r : getRelations()) {
Component c = r.getLeft().lookup(td, name); if (r.getLeft().matches(td, name))
if (c != null) return c; return r.getLeft();
c = r.getRight().lookup(td, name); if (r.getRight().matches(td, name))
if (c != null) return c; return r.getRight();
} }
return null; return null;
} }
//--- isInvalidRedefinition ---
/**
* Check, if a component with the same name is already declared in some supertype
*/
syn boolean Component.isInvalidRedefinition() { syn boolean Component.isInvalidRedefinition() {
if (toTypeDecl() == null) return false;
TypeDecl td = toTypeDecl(); TypeDecl td = toTypeDecl();
if (td == null) return false;
while (td.hasSuper() && td.getSuper().decl() != null) { while (td.hasSuper() && td.getSuper().decl() != null) {
td = td.getSuper().decl(); td = td.getSuper().decl();
Component c = lookupComponent(td, getID()); // find a matching component on the RHS of the (current) super type
if (c != null && isTargetOfDirectedRelation()) return true; Component c = findComponent(td, getID());
if (c != null && !this.isEqual(c)) return true; if (c != null && !this.isEqual(c)) return true;
} }
return false; return false;
} }
//--- isEqual ---
syn boolean Component.isEqual(Component c) = this.getClass() == c.getClass() && getTypeUse().isEqual(c.getTypeUse()); syn boolean Component.isEqual(Component c) = this.getClass() == c.getClass() && getTypeUse().isEqual(c.getTypeUse());
syn boolean TypeUse.isEqual(TypeUse u); syn boolean TypeUse.isEqual(TypeUse u);
...@@ -108,12 +116,14 @@ aspect ComponentAnalysis { ...@@ -108,12 +116,14 @@ aspect ComponentAnalysis {
return true; return true;
} }
syn RelationComponent RelationComponent.lookup(TypeDecl td, String name) //--- matches ---
= !isTargetOfDirectedRelation() && toTypeDecl() == td && name().equals(name) /**
? this * @return true, if the component has both type and role, its type matches the given typeDecl and its name matches the given name
: null; */
syn boolean RelationComponent.matches(TypeDecl td, String name)
= !isTargetOfDirectedRelation() && toTypeDecl() == td && name().equals(name);
//--- relationComponents ---
coll Set<RelationComponent> TypeDecl.relationComponents() coll Set<RelationComponent> TypeDecl.relationComponents()
[new HashSet<RelationComponent>()] [new HashSet<RelationComponent>()]
root Program; root Program;
...@@ -122,6 +132,7 @@ aspect ComponentAnalysis { ...@@ -122,6 +132,7 @@ aspect ComponentAnalysis {
to TypeDecl.relationComponents() to TypeDecl.relationComponents()
for toTypeDecl(); for toTypeDecl();
//--- relationComponentsTransitive ---
syn Collection<RelationComponent> TypeDecl.relationComponentsTransitive() { syn Collection<RelationComponent> TypeDecl.relationComponentsTransitive() {
ArrayList<RelationComponent> list = new ArrayList<>(); ArrayList<RelationComponent> list = new ArrayList<>();
if (hasSuper() && getSuper().decl() != null) { if (hasSuper() && getSuper().decl() != null) {
...@@ -131,6 +142,7 @@ aspect ComponentAnalysis { ...@@ -131,6 +142,7 @@ aspect ComponentAnalysis {
return list; return list;
} }
//--- oneRelationComponents ---
syn Set<OneRelationComponent> TypeDecl.oneRelationComponents() { syn Set<OneRelationComponent> TypeDecl.oneRelationComponents() {
Set<OneRelationComponent> set = new HashSet<>(); Set<OneRelationComponent> set = new HashSet<>();
for (RelationComponent rc: relationComponents()) { for (RelationComponent rc: relationComponents()) {
...@@ -141,27 +153,33 @@ aspect ComponentAnalysis { ...@@ -141,27 +153,33 @@ aspect ComponentAnalysis {
return set; return set;
} }
//--- needUnresolvedClass ---
syn boolean TypeDecl.needUnresolvedClass() { syn boolean TypeDecl.needUnresolvedClass() {
// a TypeDecl needs an unresolved class, if it can appear in a relation // a TypeDecl needs an unresolved class, if it can appear in a relation
// TODO // TODO
return true; return true;
} }
//--- isList ---
syn boolean Component.isList() = false; syn boolean Component.isList() = false;
eq ListComponent.isList() = true; eq ListComponent.isList() = true;
//--- isOpt ---
syn boolean Component.isOpt() = false; syn boolean Component.isOpt() = false;
eq OptComponent.isOpt() = true; eq OptComponent.isOpt() = true;
//--- isNullable ---
syn boolean Component.isNullable() = false; syn boolean Component.isNullable() = false;
eq TokenComponent.isNullable() = !"float double int short long char byte boolean".contains(getTypeUse().getID()); eq TokenComponent.isNullable() = !"float double int short long char byte boolean".contains(getTypeUse().getID());
} }
aspect InstanceSupplier { aspect InstanceSupplier {
//--- program ---
inh Program TypeDecl.program(); inh Program TypeDecl.program();
eq Program.getTypeDecl(int i).program() = this; eq Program.getTypeDecl(int i).program() = this;
//--- subTypeDecls ---
syn Collection<TypeDecl> TypeDecl.subTypeDecls() { syn Collection<TypeDecl> TypeDecl.subTypeDecls() {
java.util.List<TypeDecl> subDecls = new ArrayList(); java.util.List<TypeDecl> subDecls = new ArrayList();
for (TypeDecl decl : program().getTypeDeclList()) { for (TypeDecl decl : program().getTypeDeclList()) {
...@@ -172,6 +190,7 @@ aspect InstanceSupplier { ...@@ -172,6 +190,7 @@ aspect InstanceSupplier {
return subDecls; return subDecls;
} }
//--- instantiableSubType ---
syn TypeDecl TypeDecl.instantiableSubType() { syn TypeDecl TypeDecl.instantiableSubType() {
if (getAbstract() == false) { if (getAbstract() == false) {
return this; return this;
...@@ -192,6 +211,7 @@ aspect InstanceSupplier { ...@@ -192,6 +211,7 @@ aspect InstanceSupplier {
} }
aspect Constructors { aspect Constructors {
//--- componentsTransitive ---
syn Collection<Component> TypeDecl.componentsTransitive() { syn Collection<Component> TypeDecl.componentsTransitive() {
ArrayList<Component> list = new ArrayList<>(); ArrayList<Component> list = new ArrayList<>();
if (hasSuper() && getSuper().decl() != null) { if (hasSuper() && getSuper().decl() != null) {
...@@ -205,6 +225,7 @@ aspect Constructors { ...@@ -205,6 +225,7 @@ aspect Constructors {
return list; return list;
} }
//--- needsConstructor ---
syn boolean TypeDecl.needsConstructor() { syn boolean TypeDecl.needsConstructor() {
if (componentsTransitive().isEmpty()) { if (componentsTransitive().isEmpty()) {
return false; return false;
...@@ -217,30 +238,37 @@ aspect Constructors { ...@@ -217,30 +238,37 @@ aspect Constructors {
&& getSuper().decl().needsConstructor(); && getSuper().decl().needsConstructor();
} }
//--- inConstructor ---
/** /**
* @return true, if the component should be added to the constructor (i.e., is not an NTA) * @return true, if the component should be added to the constructor (i.e., is not an NTA)
*/ */
syn boolean Component.inConstructor() = true; syn boolean Component.inConstructor() = true;
eq NTAComponent.inConstructor() = false; eq NTAComponent.inConstructor() = false;
eq NTAOptComponent.inConstructor() = false;
eq NTAListComponent.inConstructor() = false;
} }
aspect Utils { aspect Utils {
//--- isMany ---
syn boolean RelationComponent.isMany() = false; syn boolean RelationComponent.isMany() = false;
eq ManyRelationComponent.isMany() = true; eq ManyRelationComponent.isMany() = true;
//--- toString ---
public String SimpleTypeUse.toString() { public String SimpleTypeUse.toString() {
return getID(); return getID();
} }
public String ParameterizedTypeUse.toString() { public String ParameterizedTypeUse.toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(getID()).append("<"); sb.append(getID()).append("<");
int i = 0; boolean first = true;
for (TypeUse u: getTypeUses()) { for (TypeUse u: getTypeUses()) {
sb.append(u.toString()); if (first) {
if (++i < getNumTypeUse()) { first = false;
} else {
sb.append(", "); sb.append(", ");
} }
sb.append(u.toString());
} }
sb.append(">"); sb.append(">");
return sb.toString(); return sb.toString();
......
...@@ -222,9 +222,6 @@ aspect BackendDirectedAPI { ...@@ -222,9 +222,6 @@ aspect BackendDirectedAPI {
public void RightDirection.generateAPI(StringBuilder sb) { public void RightDirection.generateAPI(StringBuilder sb) {
relation().getLeft().generateDirectedAPI(sb); relation().getLeft().generateDirectedAPI(sb);
} }
public void LeftDirection.generateAPI(StringBuilder sb) {
relation().getRight().generateDirectedAPI(sb);
}
public abstract void RelationComponent.generateDirectedAPI(StringBuilder sb); public abstract void RelationComponent.generateDirectedAPI(StringBuilder sb);
public void OneRelationComponent.generateDirectedAPI(StringBuilder sb) { public void OneRelationComponent.generateDirectedAPI(StringBuilder sb) {
...@@ -913,9 +910,6 @@ aspect NameResolutionHelper { ...@@ -913,9 +910,6 @@ aspect NameResolutionHelper {
public void RightDirection.generateContextDependentNameResolution(StringBuilder sb) { public void RightDirection.generateContextDependentNameResolution(StringBuilder sb) {
relation().getLeft().generateContextDependentNameResolution(sb); relation().getLeft().generateContextDependentNameResolution(sb);
} }
public void LeftDirection.generateContextDependentNameResolution(StringBuilder sb) {
relation().getRight().generateContextDependentNameResolution(sb);
}
public void Bidirectional.generateContextDependentNameResolution(StringBuilder sb) { public void Bidirectional.generateContextDependentNameResolution(StringBuilder sb) {
relation().getLeft().generateContextDependentNameResolution(sb); relation().getLeft().generateContextDependentNameResolution(sb);
relation().getRight().generateContextDependentNameResolution(sb); relation().getRight().generateContextDependentNameResolution(sb);
...@@ -1479,9 +1473,6 @@ aspect PrettyPrint { ...@@ -1479,9 +1473,6 @@ aspect PrettyPrint {
public String RightDirection.prettyPrint() { public String RightDirection.prettyPrint() {
return "->"; return "->";
} }
public String LeftDirection.prettyPrint() {
return "<-";
}
public String Bidirectional.prettyPrint() { public String Bidirectional.prettyPrint() {
return "<->"; return "<->";
} }
......
...@@ -15,13 +15,13 @@ aspect Errors { ...@@ -15,13 +15,13 @@ aspect Errors {
when isAlreadyDeclared() when isAlreadyDeclared()
to Program.errors(); to Program.errors();
Component contributes error("Component '" + name() RelationComponent contributes error("Role '" + name()
+ "' is already declared for type '" + toTypeDecl() + "'") + "' is already declared for type '" + toTypeDecl() + "'")
when isAlreadyDeclared() when isAlreadyDeclared()
to Program.errors(); to Program.errors();
Component contributes error("Component '" + name() Component contributes error("Component '" + name()
+ "' is an invalid redefition for type '" + toTypeDecl() + "'") + "' is an invalid redefinition for type '" + toTypeDecl() + "'")
when isInvalidRedefinition() when isInvalidRedefinition()
to Program.errors(); to Program.errors();
......
...@@ -86,9 +86,15 @@ Relation relation = ...@@ -86,9 +86,15 @@ Relation relation =
RELATION relation_comp.l direction relation_comp.r SCOL RELATION relation_comp.l direction relation_comp.r SCOL
{: {:
Relation result = new Relation(); Relation result = new Relation();
if (direction instanceof LeftDirection) {
result.setLeft(r);
result.setDirection(new RightDirection());
result.setRight(l);
} else {
result.setLeft(l); result.setLeft(l);
result.setDirection(direction); result.setDirection(direction);
result.setRight(r); result.setRight(r);
}
return result; return result;
:} :}
; ;
......
...@@ -3,3 +3,4 @@ $FILENAME Line 5, column 5: Role name missing for type 'A' ...@@ -3,3 +3,4 @@ $FILENAME Line 5, column 5: Role name missing for type 'A'
$FILENAME Line 6, column 15: Role name missing for type 'B' $FILENAME Line 6, column 15: Role name missing for type 'B'
$FILENAME Line 7, column 12: The target of a directed relation cannot have a role name $FILENAME Line 7, column 12: The target of a directed relation cannot have a role name
$FILENAME Line 8, column 13: The target of a directed relation may only have multiplicity 1 $FILENAME Line 8, column 13: The target of a directed relation may only have multiplicity 1
$FILENAME Line 9, column 5: Role 'b2' is already declared for type 'A'
...@@ -6,3 +6,4 @@ rel A -> B; ...@@ -6,3 +6,4 @@ rel A -> B;
rel A.bs* <-> B*; rel A.bs* <-> B*;
rel A.b -> B.b; rel A.b -> B.b;
rel A.b2 -> B*; rel A.b2 -> B*;
rel A.b2 -> A;
...@@ -3,3 +3,4 @@ $FILENAME Line 5, column 10: Role name missing for type 'A' ...@@ -3,3 +3,4 @@ $FILENAME Line 5, column 10: Role name missing for type 'A'
$FILENAME Line 6, column 15: Role name missing for type 'B' $FILENAME Line 6, column 15: Role name missing for type 'B'
$FILENAME Line 7, column 5: The target of a directed relation cannot have a role name $FILENAME Line 7, column 5: The target of a directed relation cannot have a role name
$FILENAME Line 8, column 5: The target of a directed relation may only have multiplicity 1 $FILENAME Line 8, column 5: The target of a directed relation may only have multiplicity 1
$FILENAME Line 9, column 10: Role 'b2' is already declared for type 'A'
...@@ -6,3 +6,4 @@ rel B <- A; ...@@ -6,3 +6,4 @@ rel B <- A;
rel A.bs* <-> B*; rel A.bs* <-> B*;
rel B.b <- A.b; rel B.b <- A.b;
rel B* <- A.b2; rel B* <- A.b2;
rel A <- A.b2;
Errors: Errors:
$FILENAME Line 4, column 12: Component 'X' is an invalid redefition for type 'B3' $FILENAME Line 4, column 12: Component 'X' is an invalid redefinition for type 'B3'
$FILENAME Line 7, column 5: Component 'X' is an invalid redefition for type 'B2' $FILENAME Line 7, column 5: Component 'X' is an invalid redefinition for type 'B2'
...@@ -5,3 +5,4 @@ B3 : A ::= <X:String>; ...@@ -5,3 +5,4 @@ B3 : A ::= <X:String>;
X; X;
rel B2.X -> X; rel B2.X -> X;
rel X.X -> B2;
Errors: Errors:
$FILENAME Line 4, column 12: Component 'X' is an invalid redefition for type 'B3' $FILENAME Line 4, column 12: Component 'X' is an invalid redefinition for type 'B3'
$FILENAME Line 7, column 10: Component 'X' is an invalid redefition for type 'B2' $FILENAME Line 7, column 10: Component 'X' is an invalid redefinition for type 'B2'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment