Commit cd9828c7 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ numerous grammar refinements based on latest discussion and feedback

parent 31262eed
Loading
Loading
Loading
Loading
+111 −48
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ PackageableElement returns tdl::PackageableElement:
     | ComponentType | GateType 
     | TestConfiguration 
     | TestDescription
     | LocallyOrderedTestDescription 
    )
    WithCommentFragment? 
//    | PredefinedAnnotationType
@@ -69,8 +70,10 @@ ElementImport returns tdl::ElementImport:
        )
    )
    'from' 
        (importedPackage=[tdl::Package|Identifier]
       | importedPackage=[tdl::Package|QIdentifier]
    (
//     importedPackage=[tdl::Package|Identifier]
//       | 
       importedPackage=[tdl::Package|QIdentifier]
    )
    WithCommentFragment?
;
@@ -649,21 +652,22 @@ TimeOperation returns tdl::TimeOperation:
;

Wait returns tdl::Wait: 
    PrefixFragment?
    ( 'component' componentInstance=[tdl::ComponentInstance|Identifier])
    'waits' 'for'
    AtomicPrefixFragment?
    'wait' 'for'
    period=DataUse
    ( 'on' componentInstance=[tdl::ComponentInstance|Identifier])
;

Quiescence returns tdl::Quiescence: 
    PrefixFragment?
    //TODO: improve syntax
    AtomicPrefixFragment?
    'quiet' 'for'
    period=DataUse 
    (
        'component' componentInstance=[tdl::ComponentInstance|Identifier] 
        | 'gate' gateReference=[tdl::GateReference|IdentifierDot]
        'on' (
            componentInstance=[tdl::ComponentInstance|Identifier] 
            | gateReference=[tdl::GateReference|IdentifierDot]
        )
    'is' 'quiet' 'for'
    period=DataUse 
    )?
;


@@ -672,7 +676,7 @@ TimerOperation returns tdl::TimerOperation:
;

TimerStart returns tdl::TimerStart:
    PrefixFragment?
    AtomicPrefixFragment?
    'start'
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
@@ -681,7 +685,7 @@ TimerStart returns tdl::TimerStart:
;

TimerStop returns tdl::TimerStop:
    PrefixFragment?
    AtomicPrefixFragment?
    'stop'
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
@@ -689,12 +693,11 @@ TimerStop returns tdl::TimerStop:
;

TimeOut returns tdl::TimeOut:
    PrefixFragment?
    AtomicPrefixFragment?
    'time' 'out' 'on'
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
    timer=[tdl::Timer|Identifier]
    //TODO: refine syntax
    'times' 'out'
;


@@ -777,10 +780,25 @@ TestConfiguration returns tdl::TestConfiguration:

//## Test Description

LocallyOrderedTestDescription returns tdl::TestDescription:
    PrefixFragment?
    //TODO: consider better way to specify / indicate local ordering
    //Make local ordering the default? Needs value converter?
    //According to the meta-model default shall be global ordering 
    (isLocallyOrdered?='Test')
    name=Identifier
    ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')' )?
    'uses' testConfiguration=[tdl::TestConfiguration|Identifier]
    (behaviourDescription=BehaviourDescription)?
;


TestDescription returns tdl::TestDescription:
    PrefixFragment?
    'TestDescription'
    //TODO: consider better way to specify / indicate local ordering
    //Make local ordering the default? Needs value converter?
    //According to the meta-model default shall be global ordering 
    (isLocallyOrdered?='Implementation')?
    name=Identifier
    ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')' )?
@@ -939,25 +957,25 @@ AtomicBehaviour returns tdl::AtomicBehaviour:

Break returns tdl::Break:
    {tdl::Break}
    PrefixFragment?
    AtomicPrefixFragment?
    'break'
;

Stop returns tdl::Stop:
    {tdl::Stop}
    PrefixFragment?
    AtomicPrefixFragment?
    'terminate'
;

VerdictAssignment returns tdl::VerdictAssignment:
    PrefixFragment?
    AtomicPrefixFragment?
    'set' 'verdict' 'to'
    verdict=DataUse
;

Assertion returns tdl::Assertion:
    {tdl::Assertion}
    PrefixFragment?
    AtomicPrefixFragment?
    'assert'
    condition=DataUse
    ('on' componentInstance=[tdl::ComponentInstance|Identifier])?
@@ -966,12 +984,13 @@ Assertion returns tdl::Assertion:
;

Interaction returns tdl::Interaction: 
    Message | ProcedureCall | ProcedureCallResponse
    Message | ReceiveMessage | ProcedureCall | ProcedureCallResponse
;

Message returns tdl::Message:
    PrefixFragment?
    AtomicPrefixFragment?
    sourceGate=[tdl::GateReference|IdentifierDot]
//    | sourceGate=[tdl::GateReference|Identifier]
    ('sends' | (isTrigger?='triggers')) 
    argument=DataUse
    'to' 
@@ -991,13 +1010,45 @@ ValueAssignmentMessage returns tdl::ValueAssignment:
    //TODO: ambiguity?
    //PrefixFragment?
    //TODO: check what the correct syntax shall be
    'where' 'it' 'is' 'assigned' 'to' variable=[tdl::Variable|Identifier]
    //'where' 'it' 'is' 
    'assigned' 'to' variable=[tdl::Variable|Identifier]
    //WithNameFragment?
;

ProcedureCall returns tdl::ProcedureCall:

ReceiveMessage returns tdl::Message:
    AtomicPrefixFragment?
    //TODO: make sure scoping works with this as well
    target+=ReceiveTargetMessage //( "," target+=ReceiveTargetMessage)*
    'receives' 
    (isTrigger?='trigger')? 
    argument=DataUse
    'from' 
    sourceGate=[tdl::GateReference|IdentifierDot]
//    | sourceGate=[tdl::GateReference|Identifier]
;

ReceiveTargetMessage returns tdl::Target:
    //TODO: ambiguity?
    //PrefixFragment?
    (valueAssignment+=ReceiveValueAssignmentMessage)?
    targetGate=[tdl::GateReference|IdentifierDot]
    //TODO: check what the correct syntax shall be
    //WithNameFragment?
;

ReceiveValueAssignmentMessage returns tdl::ValueAssignment:
    //TODO: ambiguity?
    //PrefixFragment?
    variable=[tdl::Variable|Identifier] '='
    //WithNameFragment?
;



ProcedureCall returns tdl::ProcedureCall:
    //TODO: ambiguity?
    AtomicPrefixFragment?
    //TODO: async await pattern? -> it is actually sync
    sourceGate=[tdl::GateReference|IdentifierDot]
    'calls' 
@@ -1009,6 +1060,8 @@ ProcedureCall returns tdl::ProcedureCall:
;

ProcedureCallResponse returns tdl::ProcedureCall:
    AtomicPrefixFragment?
    //TODO: this shall probably be switched
    (replyTo=[tdl::ProcedureCall|Identifier] ':')?
    sourceGate=[tdl::GateReference|IdentifierDot]
    'responds'
@@ -1038,8 +1091,7 @@ ValueAssignmentProcedure returns tdl::ValueAssignment:
;
    
TestDescriptionReference returns tdl::TestDescriptionReference:
    //TODO: ambiguity?
    //PrefixFragment?
    AtomicPrefixFragment?
    'execute'
    testDescription=[tdl::TestDescription|Identifier]
    //TODO: mandatory parentheses? 
@@ -1063,7 +1115,7 @@ ActionBehaviour returns tdl::ActionBehaviour:
;

ActionReference returns tdl::ActionReference:
    PrefixFragment?
    AtomicPrefixFragment?
    //TODO: simplify syntax further
    'perform' //'action'
    action=[tdl::Action|Identifier]
@@ -1072,7 +1124,7 @@ ActionReference returns tdl::ActionReference:
;

InlineAction returns tdl::InlineAction:
    PrefixFragment?
    AtomicPrefixFragment?
    //TODO: simplify syntax further
    'perform' 'action' ':'
    body=EString
@@ -1080,12 +1132,11 @@ InlineAction returns tdl::InlineAction:
;

Assignment returns tdl::Assignment:
    PrefixFragment?
    //TODO: shall be mandatory?
    (componentInstance=[tdl::ComponentInstance|Identifier] '->')?
    AtomicPrefixFragment?
    variable=VariableUse
    '=' 
    expression=DataUse
    ('on' componentInstance=[tdl::ComponentInstance|Identifier])?
;


@@ -1104,7 +1155,7 @@ Assignment returns tdl::Assignment:

//Use: inline block - within other blocks, e.g. with other contents 
fragment WithCommentFragment returns tdl::Element:
    'With:'
    'with'
    BEGIN
        (comment+=Comment)+
        //SHall this be '*'? Ambiguity?
@@ -1112,7 +1163,7 @@ fragment WithCommentFragment returns tdl::Element:
;

fragment WithNameFragment returns tdl::Element:
    'With:'
    'with'
    BEGIN
        //At least one element shall be provided? Ambiguity?
        NameFragment?
@@ -1121,7 +1172,7 @@ fragment WithNameFragment returns tdl::Element:
;

fragment WithBehaviourFragment returns tdl::Behaviour:
    'With:'
    'with'
    BEGIN
        //At least one element shall be provided? Ambiguity?
        NameFragment?
@@ -1130,29 +1181,36 @@ fragment WithBehaviourFragment returns tdl::Behaviour:
    END
;

fragment TDPrefixFragment returns tdl::TestDescription:
    TDObjectiveFragment?
    ('@' annotation+=Annotation)+
    (comment+=Comment)*
;

fragment WithTDFragment returns tdl::TestDescription:
    'With:'
    'with'
    BEGIN
        //At least one element shall be provided? Ambiguity?
        TDObjectiveFragment?
        (comment+=Comment)*
    END
;

fragment AtomicPrefixFragment returns tdl::AtomicBehaviour:
    ObjectiveFragment?
    (comment+=Comment)*
    ('@' annotation+=Annotation)+
;

fragment WithAtomicFragment returns tdl::AtomicBehaviour:
    'With:'
    'with'
    BEGIN
        //At least one element shall be provided? Ambiguity?
        NameFragment?
        ObjectiveFragment?
        TimeLabelFragment?
        TimeConstraintFragment?
        (comment+=Comment)*
    END
;

fragment WithCombinedFragment returns tdl::CombinedBehaviour:
    'With:'
    'with'
    BEGIN
        //At least one element shall be provided? Ambiguity?
        NameFragment?
@@ -1178,11 +1236,11 @@ fragment NameFragment returns tdl::Element:
;

fragment TimeLabelFragment returns tdl::AtomicBehaviour:
    'TimeLabel:' timeLabel=TimeLabel
    timeLabel=TimeLabel '=now' 
;

fragment TimeConstraintFragment returns tdl::AtomicBehaviour:
    'TimeConstraints:' timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)*
    LBrace timeConstraint+=TimeConstraint ( "," timeConstraint+=TimeConstraint)* RBrace
;

//Use: for packageable elements only? or for all instead of 'With' fragments? (backwards compatibility?)
@@ -1191,6 +1249,11 @@ fragment PrefixFragment returns tdl::Element:
    ('@' annotation+=Annotation)+
;

fragment PrefixCommentFragment returns tdl::Element:
    ('@' comment+=Comment)*
    ('@' annotation+=Annotation)+
;

fragment ConstraintFragment returns tdl::DataType:
    LBrace (constraint+=Constraint)+ RBrace
;
@@ -1244,7 +1307,7 @@ IdentifierDot returns ecore::EString:
;

QIdentifier returns ecore::EString:
    ID ('.' ID)+
    ID ('.' ID)*
;

//Retain Braces even in indentation-based