Commit 7ce74dae authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ grammar refinements and extension

parent 05aa61eb
Loading
Loading
Loading
Loading
+152 −70
Original line number Diff line number Diff line
@@ -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
@@ -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 
@@ -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'
@@ -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?
@@ -175,7 +169,7 @@ Member returns tdl::Member:
    ;

StructuredDataInstance returns tdl::StructuredDataInstance:
    PrefixFragment
    PrefixFragment?
    dataType=[tdl::DataType|EString]
    name=EString
    (unassignedMember=UnassignedMemberTreatment)?
@@ -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*
@@ -214,7 +209,7 @@ CollectionDataInstance returns tdl::CollectionDataInstance:
;

ProcedureSignature returns tdl::ProcedureSignature:
    PrefixFragment
    PrefixFragment?
    'Signature'
    name=EString
    '(' parameter+=ProcedureParameter ( "," parameter+=ProcedureParameter)* ')' 
@@ -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
@@ -242,7 +238,7 @@ FormalParameter returns tdl::FormalParameter:
;

Variable returns tdl::Variable:
    PrefixFragment
    PrefixFragment?
    dataType=[tdl::DataType|EString]
    'variable'
    name=EString
@@ -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)?
;
@@ -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])?
@@ -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
@@ -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)*
@@ -347,7 +364,7 @@ ComponentType returns tdl::ComponentType:
;

ComponentInstance returns tdl::ComponentInstance:
    PrefixFragment
    PrefixFragment?
    type=[tdl::ComponentType|EString]
    'component'
    name=EString
@@ -357,6 +374,7 @@ ComponentInstance returns tdl::ComponentInstance:
;

enum ComponentInstanceRole returns tdl::ComponentInstanceRole:
    //TODO: add '@' prefix?
    SUT = 'SUT' | Tester = 'Tester';

GateReference returns tdl::GateReference:
@@ -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
@@ -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:
@@ -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]
    '.'
@@ -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'
;


@@ -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
@@ -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:
@@ -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: '}';