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

begin with concise grammar

- grammar kept as separate file to compare to old grammar
- parser should be complete
- navigation partly generated using abstract-type-navigation-pp
- working on Generation.jadd
parent 48684df4
No related branches found
No related tags found
2 merge requests!22Resolve "Feature: Add context-free connect",!21Resolve "Make grammar(s) more concise"
Pipeline #11969 failed
aspect NewStuff {
/** Tests if EndpointTarget is a TokenEndpointTarget.
* @return 'true' if this is a TokenEndpointTarget, otherwise 'false'
*/
syn boolean EndpointTarget.isTokenEndpointTarget() = false;
eq TokenEndpointTarget.isTokenEndpointTarget() = true;
/** Tests if EndpointTarget is a TypeEndpointTarget.
* @return 'true' if this is a TypeEndpointTarget, otherwise 'false'
*/
syn boolean EndpointTarget.isTypeEndpointTarget() = false;
eq TypeEndpointTarget.isTypeEndpointTarget() = true;
/** Tests if EndpointTarget is a UntypedEndpointTarget.
* @return 'true' if this is a UntypedEndpointTarget, otherwise 'false'
*/
syn boolean EndpointTarget.isUntypedEndpointTarget() = false;
eq UntypedEndpointTarget.isUntypedEndpointTarget() = true;
/** casts a EndpointTarget into a TokenEndpointTarget if possible.
* @return 'this' cast to a TokenEndpointTarget or 'null'
*/
syn TokenEndpointTarget EndpointTarget.asTokenEndpointTarget();
eq EndpointTarget.asTokenEndpointTarget() = null;
eq TokenEndpointTarget.asTokenEndpointTarget() = this;
/** casts a EndpointTarget into a TypeEndpointTarget if possible.
* @return 'this' cast to a TypeEndpointTarget or 'null'
*/
syn TypeEndpointTarget EndpointTarget.asTypeEndpointTarget();
eq EndpointTarget.asTypeEndpointTarget() = null;
eq TypeEndpointTarget.asTypeEndpointTarget() = this;
/** casts a EndpointTarget into a UntypedEndpointTarget if possible.
* @return 'this' cast to a UntypedEndpointTarget or 'null'
*/
syn UntypedEndpointTarget EndpointTarget.asUntypedEndpointTarget();
eq EndpointTarget.asUntypedEndpointTarget() = null;
eq UntypedEndpointTarget.asUntypedEndpointTarget() = this;
}
aspect RagConnectNavigation { aspect RagConnectNavigation {
// --- program --- // --- program ---
......
RagConnect ::= ConnectSpecificationFile* Program ;
abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ;
ConnectSpecificationFile : ConnectSpecification ::= <FileName> ;
EndpointDefinition ::= <AlwaysApply:boolean> <IndexBasedListAccess:boolean> <WithAdd:boolean> <Send:boolean> EndpointTarget ;
rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
abstract EndpointTarget ;
TokenEndpointTarget : EndpointTarget ;
rel TokenEndpointTarget.Token <-> TokenComponent.TokenEndpointTarget* ;
TypeEndpointTarget : EndpointTarget ;
rel TypeEndpointTarget.Type <-> TypeComponent.TypeEndpointTarget* ;
UntypedEndpointTarget : EndpointTarget ::= <TokenOrType> ; // only used by parser
// to be integrated:
//AttributeEndpointTarget : EndpointTarget ::= <Name> ;
//RelationEndpointTarget : EndpointTarget ;
//rel RelationEndpointTarget.Role <-> Role.RelationEndpointTarget* ;
DependencyDefinition ::= <ID>;
rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*;
rel DependencyDefinition.Target -> Component;
MappingDefinition ::= <ID> FromType:MappingDefinitionType <FromVariableName> ToType:MappingDefinitionType <Content> ;
abstract MappingDefinitionType ::= ;
JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
DefaultMappingDefinition : MappingDefinition ;
/* /*
Design considerations Design considerations
- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation - [OLD] InnerMappingDefinition needed for iteration attribute (first, last) - not possible with list-relation
- [NEW in 1.0.0] no complete intermediate structure, but instead single nodes where applicable
*/ */
aspect NewStuff {
syn nta JastAddList<MTypeComponent> RagConnect.getRootTypeComponentList() {
JastAddList<MTypeComponent> result = new JastAddList<>();
for (Component child : rootNode.getComponentList()) {
if (child.isTypeComponent()) {
result.add(child.asTypeComponent().toMustache());
}
}
return result;
}
aspect AttributesForMustache { inh boolean MTypeComponent.isFirst();
// --- EndpointDefinition --- eq RagConnect.getRootTypeComponentList(int i).isFirst() = i == 0;
syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
// --- MRagConnect ---
eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0;
syn String MRagConnect.closeMethod() = "ragconnectCloseConnections"; syn String RagConnect.closeMethod() = "ragconnectCloseConnections";
syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler"; syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler";
syn String MRagConnect.mqttHandlerField() = "_mqttHandler"; syn String RagConnect.mqttHandlerField() = "_mqttHandler";
syn String MRagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady"; syn String RagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady";
syn String MRagConnect.restHandlerAttribute() = "_restHandler"; syn String RagConnect.restHandlerAttribute() = "_restHandler";
syn String MRagConnect.restHandlerField() = "_restHandler"; syn String RagConnect.restHandlerField() = "_restHandler";
syn boolean MRagConnect.hasTreeListEndpoints() = !sendingTreeListEndpoints().isEmpty() || !receivingTreeListEndpoints().isEmpty(); syn boolean RagConnect.hasTreeListEndpoints() {
syn List<MTypeEndpointDefinition> MRagConnect.sendingTreeListEndpoints() { for (EndpointDefinition endpointDef : getEndpointDefinitionList()) {
List<MTypeEndpointDefinition> result = new ArrayList<>(); if (endpointDef.typeIsList()) {
for (var mEndpointDef : getTypeSendDefinitionList()) { return true;
if (mEndpointDef.typeIsList()) {
result.add(mEndpointDef);
} }
} }
return result; return false;
} }
syn List<MTypeEndpointDefinition> MRagConnect.receivingTreeListEndpoints() { syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() {
List<MTypeEndpointDefinition> result = new ArrayList<>(); Set<TypeDecl> result = new HashSet<>();
for (var mEndpointDef : getTypeReceiveDefinitionList()) { for (EndpointDefinition endpointDef : getEndpointDefinitionList()) {
if (mEndpointDef.typeIsList()) { if (endpointDef.typeIsList() && !endpointDef.getSend()) {
result.add(mEndpointDef); result.add(endpointDef.type().getTypeDecl());
} }
} }
return result; return result;
} }
syn List<TypeDecl> MRagConnect.typesForReceivingListEndpoints() {
return receivingTreeListEndpoints().stream() syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue();
.map(mEndpointDef -> mEndpointDef.type().getTypeDecl()) syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn();
.distinct() syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName();
.collect(java.util.stream.Collectors.toList()); syn String EndpointDefinition.parentTypeName() = toMustache().parentTypeName();
syn String EndpointDefinition.entityName() = toMustache().entityName();
syn String EndpointDefinition.updateMethod() = toMustache().updateMethod();
syn String EndpointDefinition.writeMethod() = toMustache().writeMethod();
syn String EndpointDefinition.getterMethod() = toMustache().getterMethod();
syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive";
syn String EndpointDefinition.connectParameterName() = "uriString";
syn String EndpointDefinition.connectMethod() = "connect" + entityName();
syn String EndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod();
syn boolean EndpointDefinition.isTypeEndpointDefinition() = endpointDef().isTypeEndpointDefinition();
syn String EndpointDefinition.disconnectMethod() {
// TODO unclear. rework, when lookup methods are done.
// if both (send and receive) are defined for an endpoint, ensure methods with different names
String extra;
if (endpointDef().isTokenEndpointDefinition()) {
extra = endpointDef().asTokenEndpointDefinition().lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
} else if (endpointDef().isTypeEndpointDefinition()) {
extra = endpointDef().asTypeEndpointDefinition().lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
} else {
extra = "";
}
return "disconnect" + extra + entityName();
}
// TODO potentially dangerous because asXEndpointDefinition can return null
syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken();
syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType();
syn String EndpointDefinition.tokenName() = token().getName();
syn String EndpointDefinition.typeName() = type().getName();
syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
} }
aspect OldStuff {
// --- EndpointDefinition ---
syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
// --- MEndpointDefinition --- // --- MEndpointDefinition ---
syn String MEndpointDefinition.preemptiveExpectedValue(); syn String MEndpointDefinition.preemptiveExpectedValue();
syn String MEndpointDefinition.preemptiveReturn(); syn String MEndpointDefinition.preemptiveReturn();
...@@ -58,38 +98,9 @@ aspect AttributesForMustache { ...@@ -58,38 +98,9 @@ aspect AttributesForMustache {
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName(); eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
syn String MEndpointDefinition.connectParameterName() = "uriString";
syn String MEndpointDefinition.connectMethod() = "connect" + entityName();
syn String MEndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod();
syn boolean MEndpointDefinition.isTypeEndpointDefinition() = endpointDef().isTypeEndpointDefinition();
syn String MEndpointDefinition.disconnectMethod() {
// if both (send and receive) are defined for an endpoint, ensure methods with different names
String extra;
if (endpointDef().isTokenEndpointDefinition()) {
extra = endpointDef().asTokenEndpointDefinition().lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
} else if (endpointDef().isTypeEndpointDefinition()) {
extra = endpointDef().asTypeEndpointDefinition().lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
} else {
extra = "";
} }
return "disconnect" + extra + entityName();
}
syn String MEndpointDefinition.uniqueSuffix();
eq MTokenSendDefinition.uniqueSuffix() = "Send";
eq MTokenReceiveDefinition.uniqueSuffix() = "Receive";
eq MTypeSendDefinition.uniqueSuffix() = "Send";
eq MTypeReceiveDefinition.uniqueSuffix() = "Receive";
// TODO potentially dangerous because asXEndpointDefinition can return null aspect AttributesForMustache {
syn TokenComponent MEndpointDefinition.token() = endpointDef().asTokenEndpointDefinition().getToken();
syn TypeComponent MEndpointDefinition.type() = endpointDef().asTypeEndpointDefinition().getType();
syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply();
syn boolean MEndpointDefinition.typeIsList() = endpointDef().typeIsList();
syn String MEndpointDefinition.tokenName() = token().getName();
syn String MEndpointDefinition.typeName() = type().getName();
syn String MEndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType(); syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName(); syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
...@@ -199,7 +210,6 @@ aspect AttributesForMustache { ...@@ -199,7 +210,6 @@ aspect AttributesForMustache {
// --- MTypeComponent --- // --- MTypeComponent ---
syn String MTypeComponent.name() = getTypeComponent().getName(); syn String MTypeComponent.name() = getTypeComponent().getName();
inh boolean MTypeComponent.isFirst();
// --- MTokenComponent --- // --- MTokenComponent ---
syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
......
...@@ -22,9 +22,19 @@ ConnectSpecificationFile connect_specification_file ...@@ -22,9 +22,19 @@ ConnectSpecificationFile connect_specification_file
private Iterable<String> makeMappingDefs(ArrayList<?> raw_mapping_defs) { private Iterable<String> makeMappingDefs(ArrayList<?> raw_mapping_defs) {
return () -> raw_mapping_defs.stream().map(raw -> ((Symbol) raw).value.toString()).iterator(); return () -> raw_mapping_defs.stream().map(raw -> ((Symbol) raw).value.toString()).iterator();
} }
private TokenEndpointDefinition enableAlwaysApply(TokenEndpointDefinition def) { // private TokenEndpointDefinition enableAlwaysApply(TokenEndpointDefinition def) {
def.setAlwaysApply(true); // def.setAlwaysApply(true);
return def; // return def;
// }
private EndpointDefinition createEndpointDefinition(
String type_name, String child_name, boolean send,
boolean indexBasedListAccess, boolean withAdd) {
EndpointDefinition result = new EndpointDefinition();
result.setSend(send);
result.setIndexedBasedListAccess(indexBasedListAccess);
result.setWithAdd(withAdd);
result.setTarget(new UntypedEndpointTarget(type_name + "." + child_name));
return result;
} }
:} ; :} ;
...@@ -45,44 +55,27 @@ EndpointDefinition endpoint_definition ...@@ -45,44 +55,27 @@ EndpointDefinition endpoint_definition
EndpointDefinition endpoint_definition_type EndpointDefinition endpoint_definition_type
= SEND ID.type_name DOT ID.child_name = SEND ID.type_name DOT ID.child_name
{: {:
SendUntypedEndpointDefinition result = new SendUntypedEndpointDefinition(); return createEndpointDefinition(type_name, child_name, true, false, false);
result.setTokenOrType(type_name + "." + child_name);
return result;
:}
| SEND INDEXED ID.type_name DOT ID.child_name
{:
SendUntypedEndpointDefinition result = new SendUntypedEndpointDefinition();
result.setTokenOrType(type_name + "." + child_name);
result.setIndexed(true);
return result;
:} :}
// | SEND INDEXED ID.type_name DOT ID.child_name
// {:
// return createEndpointDefinition(type_name, child_name, true, true, false);
// :}
| RECEIVE ID.type_name DOT ID.child_name | RECEIVE ID.type_name DOT ID.child_name
{: {:
ReceiveUntypedEndpointDefinition result = new ReceiveUntypedEndpointDefinition(); return createEndpointDefinition(type_name, child_name, false, false, false);
result.setTokenOrType(type_name + "." + child_name);
return result;
:} :}
| RECEIVE INDEXED ID.type_name DOT ID.child_name | RECEIVE INDEXED ID.type_name DOT ID.child_name
{: {:
ReceiveUntypedEndpointDefinition result = new ReceiveUntypedEndpointDefinition(); return createEndpointDefinition(type_name, child_name, false, true, false);
result.setTokenOrType(type_name + "." + child_name);
result.setIndexed(true);
return result;
:} :}
| RECEIVE WITH ADD ID.type_name DOT ID.child_name | RECEIVE WITH ADD ID.type_name DOT ID.child_name
{: {:
ReceiveUntypedEndpointDefinition result = new ReceiveUntypedEndpointDefinition(); return createEndpointDefinition(type_name, child_name, false, false, true);
result.setTokenOrType(type_name + "." + child_name);
result.setWithAdd(true);
return result;
:} :}
| RECEIVE INDEXED WITH ADD ID.type_name DOT ID.child_name | RECEIVE INDEXED WITH ADD ID.type_name DOT ID.child_name
{: {:
ReceiveUntypedEndpointDefinition result = new ReceiveUntypedEndpointDefinition(); return createEndpointDefinition(type_name, child_name, false, true, true);
result.setTokenOrType(type_name + "." + child_name);
result.setIndexed(true);
result.setWithAdd(true);
return result;
:} :}
; ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment