Loading plugins/Prototypes/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext +152 −70 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ import "http://www.etsi.org/spec/TDL/1.3.1/configurations" as extendedconfigurat Package returns tdl::Package: {tdl::Package} PrefixFragment? 'Package' name=EString BEGIN Loading @@ -32,8 +33,7 @@ PackageableElement returns tdl::PackageableElement: | StructuredDataType | StructuredDataInstance | CollectionDataType | CollectionDataInstance | ProcedureSignature //TODO:fix problems with ambiguity // | Action_Impl | Function | Action_Impl | Function | PredefinedFunction // | Time | ComponentType | GateType Loading Loading @@ -77,12 +77,6 @@ Annotation returns tdl::Annotation: (':' value=EString)? ; AtAnnotation returns tdl::Annotation: '@'key=[tdl::AnnotationType|EString] ('(' value=EString ')')? ; AnnotationType returns tdl::AnnotationType: {tdl::AnnotationType} 'AnnotationType' Loading Loading @@ -157,7 +151,7 @@ StructuredDataType returns tdl::StructuredDataType: {tdl::StructuredDataType} //TODO: add to all other elements? //TODO: extract to packageable element? PrefixFragment PrefixFragment? 'Type' name=EString extension=Extension? Loading @@ -175,7 +169,7 @@ Member returns tdl::Member: ; StructuredDataInstance returns tdl::StructuredDataInstance: PrefixFragment PrefixFragment? dataType=[tdl::DataType|EString] name=EString (unassignedMember=UnassignedMemberTreatment)? Loading @@ -197,16 +191,17 @@ MemberAssignment returns tdl::MemberAssignment: // currently: a bit of reinvention CollectionDataType returns tdl::CollectionDataType: PrefixFragment PrefixFragment? 'Collection' name=EString 'of' itemType=[tdl::DataType|EString] ; CollectionDataInstance returns tdl::CollectionDataInstance: PrefixFragment //TODO: angle brackets? PrefixFragment? //TODO: keep angle brackets? '['dataType=[tdl::DataType|EString]']' //alternatively dataType 'collection' name? name=EString (BEGIN item+=StaticDataUse* Loading @@ -214,7 +209,7 @@ CollectionDataInstance returns tdl::CollectionDataInstance: ; ProcedureSignature returns tdl::ProcedureSignature: PrefixFragment PrefixFragment? 'Signature' name=EString '(' parameter+=ProcedureParameter ( "," parameter+=ProcedureParameter)* ')' Loading @@ -235,6 +230,7 @@ Parameter returns tdl::Parameter: Member | FormalParameter | ProcedureParameter; FormalParameter returns tdl::FormalParameter: PrefixFragment? dataType=[tdl::DataType|EString] name=EString //TODO: fix fragments Loading @@ -242,7 +238,7 @@ FormalParameter returns tdl::FormalParameter: ; Variable returns tdl::Variable: PrefixFragment PrefixFragment? dataType=[tdl::DataType|EString] 'variable' name=EString Loading @@ -254,18 +250,18 @@ Action returns tdl::Action: Action_Impl returns tdl::Action: {tdl::Action} PrefixFragment PrefixFragment? 'Action' name=EString (formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)*)? ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')? (':' body=EString)? ; Function returns tdl::Function: PrefixFragment PrefixFragment? 'Function' name=EString (formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)*)? ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')? 'returns' returnType=[tdl::DataType|EString] (':' body=EString)? ; Loading @@ -279,7 +275,7 @@ enum UnassignedMemberTreatment returns tdl::UnassignedMemberTreatment: // with fragments as well for compatibility PredefinedFunction returns tdl::PredefinedFunction: {tdl::PredefinedFunction} PrefixFragment PrefixFragment? 'Predefined' name=EString ('returns' returnType=[tdl::DataType|EString])? Loading @@ -304,11 +300,30 @@ OmitValue returns tdl::OmitValue: Timer returns tdl::Timer: {tdl::Timer} PrefixFragment PrefixFragment? 'timer' name=EString ; TimeConstraint returns tdl::TimeConstraint: PrefixFragment? PrefixNameFragment? timeConstraintExpression=StaticDataUse //TODO: revert to DataUse ; TimeLabel returns tdl::TimeLabel: {tdl::TimeLabel} PrefixFragment? name=EString ; enum TimeLabelUseKind returns tdl::TimeLabelUseKind: //TODO: add '@'? -> likely not Last = 'Last' | Previous = 'Previous' | First = 'First' ; //TODO: continue with the rest //# Test Configuration Loading @@ -316,29 +331,31 @@ Timer returns tdl::Timer: //TODO: test all and refine GateType returns tdl::GateType: PrefixFragment? kind=GateTypeKind 'Gate' name=EString ('extends' extension=Extension)? (extension=Extension)? 'supports' dataType+=[tdl::DataType|EString] ( "," dataType+=[tdl::DataType|EString])* ; enum GateTypeKind returns tdl::GateTypeKind: //TODO: add '@' prefix? Message = 'Message' | Procedure = 'Procedure'; GateInstance returns tdl::GateInstance: PrefixFragment PrefixFragment? type=[tdl::GateType|EString] 'gate' name=EString ; ComponentType returns tdl::ComponentType: PrefixFragment PrefixFragment? 'Component' name=EString ('extends' extension=Extension)? //TODO: align order (extension=Extension)? //TODO: align order? BEGIN (gateInstance+=GateInstance)+ (timer+=Timer)* Loading @@ -347,7 +364,7 @@ ComponentType returns tdl::ComponentType: ; ComponentInstance returns tdl::ComponentInstance: PrefixFragment PrefixFragment? type=[tdl::ComponentType|EString] 'component' name=EString Loading @@ -357,6 +374,7 @@ ComponentInstance returns tdl::ComponentInstance: ; enum ComponentInstanceRole returns tdl::ComponentInstanceRole: //TODO: add '@' prefix? SUT = 'SUT' | Tester = 'Tester'; GateReference returns tdl::GateReference: Loading @@ -379,11 +397,11 @@ Connection returns tdl::Connection: TestConfiguration returns tdl::TestConfiguration: PrefixFragment PrefixFragment? 'Configuration' name=EString BEGIN //TODO: enforce +? //TODO: enforce '+'? (componentInstance+=ComponentInstance)* (connection+=Connection)* END Loading @@ -394,18 +412,16 @@ TestConfiguration returns tdl::TestConfiguration: //## Test Description TestDescription returns tdl::TestDescription: PrefixFragment //TODO: add into a separate fragment? //TODO: Use @-prefix for objectives and notes? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixTDObjectiveFragment? 'TestDescription' (isLocallyOrdered?='Implementation')? name=EString ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')' )? 'uses' testConfiguration=[tdl::TestConfiguration|EString] BEGIN (behaviourDescription=BehaviourDescription)? END ( behaviourDescription=BehaviourDescription )? ; BehaviourDescription returns tdl::BehaviourDescription: Loading @@ -419,18 +435,50 @@ BehaviourDescription returns tdl::BehaviourDescription: Behaviour returns tdl::Behaviour: //TimerStart | TimerStop | TimeOut | Wait | Quiescence | PeriodicBehaviour | AlternativeBehaviour | ParallelBehaviour | BoundedLoopBehaviour | OptionalBehaviour | UnboundedLoopBehaviour | ConditionalBehaviour | CompoundBehaviour | DefaultBehaviour | InterruptBehaviour | VerdictAssignment | Assertion | Stop | Break | Assignment | InlineAction | ActionReference | TestDescriptionReference | Interaction_Impl | Message | ProcedureCall; TimerStart | TimerStop TimerStart | TimerStop | TimeOut | CompoundBehaviour ; Block returns tdl::Block: //TODO: fragments cause ambiguity //PrefixFragment? //PrefixNameFragment? //TODO: extract to fragment ('[' guard+=LocalExpression ( "," guard+=LocalExpression)* ']' )? BEGIN behaviour+=Behaviour+ END ; LocalExpression returns tdl::LocalExpression: PrefixFragment? PrefixNameFragment? (scope=[tdl::ComponentInstance|EString] ':')? expression=StaticDataUse //TODO: revert to DataUse ; //## Atomic Behaviour CompoundBehaviour returns tdl::CompoundBehaviour: PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? block=Block //TODO: periodic / exceptional fragments //('periodic' '{' periodic+=PeriodicBehaviour ( "," periodic+=PeriodicBehaviour)* '}' )? //('exceptional' '{' exceptional+=ExceptionalBehaviour ( "," exceptional+=ExceptionalBehaviour)* '}' )? ; //## Atomic Behaviour TimerStart returns tdl::TimerStart: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? 'start' componentInstance=[tdl::ComponentInstance|EString] '.' Loading @@ -438,38 +486,30 @@ TimerStart returns tdl::TimerStart: 'for' period=StaticDataUse //TODO: shortcut, restore original //'for' period=DataUse // NameFragment? //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? ; TimerStop returns tdl::TimerStop: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? 'stop' componentInstance=[tdl::ComponentInstance|EString] '.' timer=[tdl::Timer|EString] // NameFragment //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? ; TimeOut returns tdl::TimeOut: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? 'expire' PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? componentInstance=[tdl::ComponentInstance|EString] '.' timer=[tdl::Timer|EString] // NameFragment? //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? 'expired' ; Loading @@ -478,6 +518,8 @@ TimeOut returns tdl::TimeOut: //## Fragments //All fragments shall be optional at the point of access //Use: contained/standalone block fragment WithFragmentNested returns tdl::Element: BEGIN Loading @@ -489,23 +531,59 @@ fragment WithFragmentNested returns tdl::Element: fragment WithFragment returns tdl::Element: ('With:' BEGIN (comment+=Comment)* (annotation+=Annotation)* (comment+=Comment | annotation+=Annotation)+ END ) ; //Use: for packageable elements fragment PrefixFragment returns tdl::Element: (comment+=Comment)* (annotation+=AtAnnotation)* fragment ObjectiveFragment returns tdl::Behaviour: 'Objective:' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ; fragment TDObjectiveFragment returns tdl::TestDescription: 'Objective:' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ; fragment NameFragment returns tdl::Element: 'Name:' name=EString ; fragment TimeLabelFragment returns tdl::AtomicBehaviour: 'TimeLabel:' timeLabel=TimeLabel ; fragment TimeConstraintFragment returns tdl::AtomicBehaviour: 'TimeConstraints:' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* ; //Use: for packageable elements only? or for all instead of 'With' fragments? (backwards compatibility?) //TODO: '@' was used for time labels only before fragment PrefixFragment returns tdl::Element: ('@' comment+=Comment | '@' annotation+=Annotation)+ ; fragment PrefixNameFragment returns tdl::Element: '@' NameFragment ; fragment PrefixObjectiveFragment returns tdl::Behaviour: '@' ObjectiveFragment ; fragment PrefixTDObjectiveFragment returns tdl::TestDescription: '@' TDObjectiveFragment ; fragment PrefixTimeConstraintFragment returns tdl::AtomicBehaviour: '@' TimeConstraintFragment ; fragment PrefixTimeLabelFragment returns tdl::AtomicBehaviour: '@' TimeLabelFragment ; //## ValueConverter Rules (Pseudo-terminals) EString returns ecore::EString: Loading @@ -514,10 +592,14 @@ EString returns ecore::EString: //## Terminals // The following synthetic tokens are used for the indentation-aware blocks // The following synthetic tokens are used for the indentation-aware blocks -> moved to extended grammar //terminal BEGIN: 'synthetic:BEGIN'; // increase indentation //terminal END: 'synthetic:END'; // decrease indentation //alternative bindings for brace-based delimiters terminal BEGIN: '{'; terminal END: '}'; terminal BEGIN: LBRACE; terminal END: RBRACE; //separate terminals that can be used for JSON-like data specifications even in indentation-based notation terminal LBRACE: '{'; terminal RBRACE: '}'; Loading
plugins/Prototypes/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext +152 −70 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ import "http://www.etsi.org/spec/TDL/1.3.1/configurations" as extendedconfigurat Package returns tdl::Package: {tdl::Package} PrefixFragment? 'Package' name=EString BEGIN Loading @@ -32,8 +33,7 @@ PackageableElement returns tdl::PackageableElement: | StructuredDataType | StructuredDataInstance | CollectionDataType | CollectionDataInstance | ProcedureSignature //TODO:fix problems with ambiguity // | Action_Impl | Function | Action_Impl | Function | PredefinedFunction // | Time | ComponentType | GateType Loading Loading @@ -77,12 +77,6 @@ Annotation returns tdl::Annotation: (':' value=EString)? ; AtAnnotation returns tdl::Annotation: '@'key=[tdl::AnnotationType|EString] ('(' value=EString ')')? ; AnnotationType returns tdl::AnnotationType: {tdl::AnnotationType} 'AnnotationType' Loading Loading @@ -157,7 +151,7 @@ StructuredDataType returns tdl::StructuredDataType: {tdl::StructuredDataType} //TODO: add to all other elements? //TODO: extract to packageable element? PrefixFragment PrefixFragment? 'Type' name=EString extension=Extension? Loading @@ -175,7 +169,7 @@ Member returns tdl::Member: ; StructuredDataInstance returns tdl::StructuredDataInstance: PrefixFragment PrefixFragment? dataType=[tdl::DataType|EString] name=EString (unassignedMember=UnassignedMemberTreatment)? Loading @@ -197,16 +191,17 @@ MemberAssignment returns tdl::MemberAssignment: // currently: a bit of reinvention CollectionDataType returns tdl::CollectionDataType: PrefixFragment PrefixFragment? 'Collection' name=EString 'of' itemType=[tdl::DataType|EString] ; CollectionDataInstance returns tdl::CollectionDataInstance: PrefixFragment //TODO: angle brackets? PrefixFragment? //TODO: keep angle brackets? '['dataType=[tdl::DataType|EString]']' //alternatively dataType 'collection' name? name=EString (BEGIN item+=StaticDataUse* Loading @@ -214,7 +209,7 @@ CollectionDataInstance returns tdl::CollectionDataInstance: ; ProcedureSignature returns tdl::ProcedureSignature: PrefixFragment PrefixFragment? 'Signature' name=EString '(' parameter+=ProcedureParameter ( "," parameter+=ProcedureParameter)* ')' Loading @@ -235,6 +230,7 @@ Parameter returns tdl::Parameter: Member | FormalParameter | ProcedureParameter; FormalParameter returns tdl::FormalParameter: PrefixFragment? dataType=[tdl::DataType|EString] name=EString //TODO: fix fragments Loading @@ -242,7 +238,7 @@ FormalParameter returns tdl::FormalParameter: ; Variable returns tdl::Variable: PrefixFragment PrefixFragment? dataType=[tdl::DataType|EString] 'variable' name=EString Loading @@ -254,18 +250,18 @@ Action returns tdl::Action: Action_Impl returns tdl::Action: {tdl::Action} PrefixFragment PrefixFragment? 'Action' name=EString (formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)*)? ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')? (':' body=EString)? ; Function returns tdl::Function: PrefixFragment PrefixFragment? 'Function' name=EString (formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)*)? ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')? 'returns' returnType=[tdl::DataType|EString] (':' body=EString)? ; Loading @@ -279,7 +275,7 @@ enum UnassignedMemberTreatment returns tdl::UnassignedMemberTreatment: // with fragments as well for compatibility PredefinedFunction returns tdl::PredefinedFunction: {tdl::PredefinedFunction} PrefixFragment PrefixFragment? 'Predefined' name=EString ('returns' returnType=[tdl::DataType|EString])? Loading @@ -304,11 +300,30 @@ OmitValue returns tdl::OmitValue: Timer returns tdl::Timer: {tdl::Timer} PrefixFragment PrefixFragment? 'timer' name=EString ; TimeConstraint returns tdl::TimeConstraint: PrefixFragment? PrefixNameFragment? timeConstraintExpression=StaticDataUse //TODO: revert to DataUse ; TimeLabel returns tdl::TimeLabel: {tdl::TimeLabel} PrefixFragment? name=EString ; enum TimeLabelUseKind returns tdl::TimeLabelUseKind: //TODO: add '@'? -> likely not Last = 'Last' | Previous = 'Previous' | First = 'First' ; //TODO: continue with the rest //# Test Configuration Loading @@ -316,29 +331,31 @@ Timer returns tdl::Timer: //TODO: test all and refine GateType returns tdl::GateType: PrefixFragment? kind=GateTypeKind 'Gate' name=EString ('extends' extension=Extension)? (extension=Extension)? 'supports' dataType+=[tdl::DataType|EString] ( "," dataType+=[tdl::DataType|EString])* ; enum GateTypeKind returns tdl::GateTypeKind: //TODO: add '@' prefix? Message = 'Message' | Procedure = 'Procedure'; GateInstance returns tdl::GateInstance: PrefixFragment PrefixFragment? type=[tdl::GateType|EString] 'gate' name=EString ; ComponentType returns tdl::ComponentType: PrefixFragment PrefixFragment? 'Component' name=EString ('extends' extension=Extension)? //TODO: align order (extension=Extension)? //TODO: align order? BEGIN (gateInstance+=GateInstance)+ (timer+=Timer)* Loading @@ -347,7 +364,7 @@ ComponentType returns tdl::ComponentType: ; ComponentInstance returns tdl::ComponentInstance: PrefixFragment PrefixFragment? type=[tdl::ComponentType|EString] 'component' name=EString Loading @@ -357,6 +374,7 @@ ComponentInstance returns tdl::ComponentInstance: ; enum ComponentInstanceRole returns tdl::ComponentInstanceRole: //TODO: add '@' prefix? SUT = 'SUT' | Tester = 'Tester'; GateReference returns tdl::GateReference: Loading @@ -379,11 +397,11 @@ Connection returns tdl::Connection: TestConfiguration returns tdl::TestConfiguration: PrefixFragment PrefixFragment? 'Configuration' name=EString BEGIN //TODO: enforce +? //TODO: enforce '+'? (componentInstance+=ComponentInstance)* (connection+=Connection)* END Loading @@ -394,18 +412,16 @@ TestConfiguration returns tdl::TestConfiguration: //## Test Description TestDescription returns tdl::TestDescription: PrefixFragment //TODO: add into a separate fragment? //TODO: Use @-prefix for objectives and notes? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixTDObjectiveFragment? 'TestDescription' (isLocallyOrdered?='Implementation')? name=EString ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')' )? 'uses' testConfiguration=[tdl::TestConfiguration|EString] BEGIN (behaviourDescription=BehaviourDescription)? END ( behaviourDescription=BehaviourDescription )? ; BehaviourDescription returns tdl::BehaviourDescription: Loading @@ -419,18 +435,50 @@ BehaviourDescription returns tdl::BehaviourDescription: Behaviour returns tdl::Behaviour: //TimerStart | TimerStop | TimeOut | Wait | Quiescence | PeriodicBehaviour | AlternativeBehaviour | ParallelBehaviour | BoundedLoopBehaviour | OptionalBehaviour | UnboundedLoopBehaviour | ConditionalBehaviour | CompoundBehaviour | DefaultBehaviour | InterruptBehaviour | VerdictAssignment | Assertion | Stop | Break | Assignment | InlineAction | ActionReference | TestDescriptionReference | Interaction_Impl | Message | ProcedureCall; TimerStart | TimerStop TimerStart | TimerStop | TimeOut | CompoundBehaviour ; Block returns tdl::Block: //TODO: fragments cause ambiguity //PrefixFragment? //PrefixNameFragment? //TODO: extract to fragment ('[' guard+=LocalExpression ( "," guard+=LocalExpression)* ']' )? BEGIN behaviour+=Behaviour+ END ; LocalExpression returns tdl::LocalExpression: PrefixFragment? PrefixNameFragment? (scope=[tdl::ComponentInstance|EString] ':')? expression=StaticDataUse //TODO: revert to DataUse ; //## Atomic Behaviour CompoundBehaviour returns tdl::CompoundBehaviour: PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? block=Block //TODO: periodic / exceptional fragments //('periodic' '{' periodic+=PeriodicBehaviour ( "," periodic+=PeriodicBehaviour)* '}' )? //('exceptional' '{' exceptional+=ExceptionalBehaviour ( "," exceptional+=ExceptionalBehaviour)* '}' )? ; //## Atomic Behaviour TimerStart returns tdl::TimerStart: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? 'start' componentInstance=[tdl::ComponentInstance|EString] '.' Loading @@ -438,38 +486,30 @@ TimerStart returns tdl::TimerStart: 'for' period=StaticDataUse //TODO: shortcut, restore original //'for' period=DataUse // NameFragment? //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? ; TimerStop returns tdl::TimerStop: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? 'stop' componentInstance=[tdl::ComponentInstance|EString] '.' timer=[tdl::Timer|EString] // NameFragment //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? ; TimeOut returns tdl::TimeOut: PrefixFragment //TODO: add into a separate fragment? ('Objective' '(' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ')' )? 'expire' PrefixFragment? PrefixObjectiveFragment? PrefixNameFragment? PrefixTimeLabelFragment? PrefixTimeConstraintFragment? componentInstance=[tdl::ComponentInstance|EString] '.' timer=[tdl::Timer|EString] // NameFragment? //TODO: extract to fragment //('timeConstraint' '{' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* '}' )? //('timeLabel' timeLabel=TimeLabel)? 'expired' ; Loading @@ -478,6 +518,8 @@ TimeOut returns tdl::TimeOut: //## Fragments //All fragments shall be optional at the point of access //Use: contained/standalone block fragment WithFragmentNested returns tdl::Element: BEGIN Loading @@ -489,23 +531,59 @@ fragment WithFragmentNested returns tdl::Element: fragment WithFragment returns tdl::Element: ('With:' BEGIN (comment+=Comment)* (annotation+=Annotation)* (comment+=Comment | annotation+=Annotation)+ END ) ; //Use: for packageable elements fragment PrefixFragment returns tdl::Element: (comment+=Comment)* (annotation+=AtAnnotation)* fragment ObjectiveFragment returns tdl::Behaviour: 'Objective:' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ; fragment TDObjectiveFragment returns tdl::TestDescription: 'Objective:' testObjective+=[tdl::TestObjective|EString] ( "," testObjective+=[tdl::TestObjective|EString])* ; fragment NameFragment returns tdl::Element: 'Name:' name=EString ; fragment TimeLabelFragment returns tdl::AtomicBehaviour: 'TimeLabel:' timeLabel=TimeLabel ; fragment TimeConstraintFragment returns tdl::AtomicBehaviour: 'TimeConstraints:' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* ; //Use: for packageable elements only? or for all instead of 'With' fragments? (backwards compatibility?) //TODO: '@' was used for time labels only before fragment PrefixFragment returns tdl::Element: ('@' comment+=Comment | '@' annotation+=Annotation)+ ; fragment PrefixNameFragment returns tdl::Element: '@' NameFragment ; fragment PrefixObjectiveFragment returns tdl::Behaviour: '@' ObjectiveFragment ; fragment PrefixTDObjectiveFragment returns tdl::TestDescription: '@' TDObjectiveFragment ; fragment PrefixTimeConstraintFragment returns tdl::AtomicBehaviour: '@' TimeConstraintFragment ; fragment PrefixTimeLabelFragment returns tdl::AtomicBehaviour: '@' TimeLabelFragment ; //## ValueConverter Rules (Pseudo-terminals) EString returns ecore::EString: Loading @@ -514,10 +592,14 @@ EString returns ecore::EString: //## Terminals // The following synthetic tokens are used for the indentation-aware blocks // The following synthetic tokens are used for the indentation-aware blocks -> moved to extended grammar //terminal BEGIN: 'synthetic:BEGIN'; // increase indentation //terminal END: 'synthetic:END'; // decrease indentation //alternative bindings for brace-based delimiters terminal BEGIN: '{'; terminal END: '}'; terminal BEGIN: LBRACE; terminal END: RBRACE; //separate terminals that can be used for JSON-like data specifications even in indentation-based notation terminal LBRACE: '{'; terminal RBRACE: '}';