Commit 693dd4c3 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ updated grammar (WIP)

parent a3d332e2
Loading
Loading
Loading
Loading
+145 −101
Original line number Diff line number Diff line
@@ -19,11 +19,11 @@ Package returns tdl::Package:
    'Package'
    name=Identifier
    BEGIN
        WithFragment?
        (^import+=ElementImport)*
        (packagedElement+=PackageableElement)*
        (nestedPackage+=Package)*
    END
    WithCommentFragment?
;

PackageableElement returns tdl::PackageableElement:
@@ -58,15 +58,15 @@ PackageableElement returns tdl::PackageableElement:

ElementImport returns tdl::ElementImport:
    {tdl::ElementImport} 
    PrefixFragment?
    'Import'
    ('all' | 
        (importedElement+=[tdl::PackageableElement|Identifier] 
            ( "," importedElement+=[tdl::PackageableElement|Identifier])*
        )
    )
    //TODO: check if this (still) works
    'from' (importedPackage=[tdl::Package|Identifier] | importedPackage=[tdl::Package|QIdentifier])
    WithFragment?
    WithCommentFragment?
;

Comment returns tdl::Comment:
@@ -80,25 +80,32 @@ Annotation returns tdl::Annotation:

AnnotationType returns tdl::AnnotationType:
    {tdl::AnnotationType}
    PrefixFragment?
    'AnnotationType'
    name=Identifier
    extension=Extension?
    WithFragmentNested?
    WithCommentFragment?
;

TestObjective returns tdl::TestObjective:
    {tdl::TestObjective}
    PrefixFragment?
    'TestObjective'
    name=Identifier
    (BEGIN
        ('Description:' description=Identifier)?
    (
        BEGIN
            ('Description:' description=EString)?
            ('References:' (objectiveURI+=Identifier)+)?
        WithFragment?
    END)?
        END
    )?
    WithCommentFragment?
;

Extension returns tdl::Extension:
    PrefixFragment?
    'extends' extending=[tdl::PackageableElement|Identifier]
    //TODO: this is ambiguous
    //WithCommentFragment?
;

//# Data
@@ -107,83 +114,93 @@ Extension returns tdl::Extension:

DataResourceMapping returns tdl::DataResourceMapping:
    {tdl::DataResourceMapping}
    PrefixFragment?
    'Use'
    resourceURI=Identifier
    resourceURI=EString
    'as' name=Identifier
    WithFragmentNested?
    WithCommentFragment?
;

DataElementMapping returns tdl::DataElementMapping:
    PrefixFragment?
    'Map'
    mappableDataElement=[tdl::MappableDataElement|Identifier]
    ('to' elementURI=Identifier)?
    ('to' elementURI=EString)?
    'in' dataResourceMapping=[tdl::DataResourceMapping|Identifier]
    'as' name=Identifier
    ( 
        BEGIN 
            WithFragment?
            (parameterMapping+=ParameterMapping)*
        END
    )?
    WithCommentFragment?
;

ParameterMapping returns tdl::ParameterMapping:
    PrefixFragment?
    parameter=[tdl::Parameter|Identifier]
    '->' parameterURI=Identifier
    WithFragmentNested?
    '->' parameterURI=EString
    WithCommentFragment?
;


SimpleDataType_Impl returns tdl::SimpleDataType:
    {tdl::SimpleDataType}
    PrefixFragment?
    'Type'
    name=Identifier
    WithFragmentNested?
    WithCommentFragment?
;

SimpleDataInstance returns tdl::SimpleDataInstance:
    PrefixFragment?
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    WithFragmentNested?
    WithCommentFragment?
;


//TODO: alternative specification dialects?
StructuredDataType returns tdl::StructuredDataType:
    {tdl::StructuredDataType}
    //TODO: add to all other elements?
    //TODO: extract to packageable element?
    PrefixFragment?
    'Type'
    name=Identifier
    extension=Extension?
    BEGIN
        //WithFragment?
        (member+=Member)*
    END
    WithCommentFragment?
;

Member returns tdl::Member:
    PrefixFragment?
    (isOptional?='optional')?
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    WithFragmentNested?
    WithCommentFragment?
;

//TODO: alternative specification dialects?
StructuredDataInstance returns tdl::StructuredDataInstance:
    PrefixFragment?
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    //TODO: use keywords?
    (unassignedMember=UnassignedMemberTreatment)?
    BEGIN
        //WithFragment?
        //TODO: use parentheses instead? (structure vs parameters)
        //TODO: disambiguate when indentation is used?
        //TODO: align with data use
        (memberAssignment+=MemberAssignment)*
    END
    WithCommentFragment?
;

MemberAssignment returns tdl::MemberAssignment:
    PrefixFragment?
    member=[tdl::Member|Identifier]
    '=' memberSpec=StaticDataUse
    WithFragmentNested?
    WithCommentFragment?
;

//TODO: test below
@@ -196,15 +213,18 @@ CollectionDataType returns tdl::CollectionDataType:
    'Collection'
    name=Identifier
    'of' itemType=[tdl::DataType|Identifier]
    //TODO: use angle brackets instead of 'of'?
    WithCommentFragment?
;

CollectionDataInstance returns tdl::CollectionDataInstance:
    PrefixFragment?
    //TODO: keep square brackets? ->discuss later (exclusive to guards or guards shall use a word?)
    dataType=[tdl::DataType|Identifier] //-> should probably be preferred for index or also for begin/end below
    //alternatively dataType 'collection' name?
    //alternatively dataType 'collection' name? -> no
    name=Identifier
    '[' item+=StaticDataUse* ']'
    WithCommentFragment?
;

ProcedureSignature returns tdl::ProcedureSignature:
@@ -212,19 +232,21 @@ ProcedureSignature returns tdl::ProcedureSignature:
    'Signature'
    name=Identifier
    '(' parameter+=ProcedureParameter ( "," parameter+=ProcedureParameter)* ')'
    WithCommentFragment? 
;

ProcedureParameter returns tdl::ProcedureParameter:
    PrefixFragment?
    kind=ParameterKind
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    WithFragmentNested?
    WithCommentFragment?
;

enum ParameterKind returns tdl::ParameterKind:
    //TODO: add @ prefixes? ->no
    In = 'in' | Out = 'out' | Exception = 'exception';

//TODO: remove?
Parameter returns tdl::Parameter:
    Member | FormalParameter | ProcedureParameter;

@@ -232,15 +254,15 @@ FormalParameter returns tdl::FormalParameter:
    PrefixFragment?
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    //TODO: fix fragments
    //WithFragmentNested
    WithCommentFragment?
;

Variable returns tdl::Variable:
    PrefixFragment?
    dataType=[tdl::DataType|Identifier]
    'variable'
    dataType=[tdl::DataType|Identifier]
    name=Identifier
    WithCommentFragment?
;

//TODO: remove?
@@ -254,6 +276,7 @@ Action_Impl returns tdl::Action:
    name=Identifier
    ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')?
    (':' body=EString)?
    WithCommentFragment?
    ;
    
Function returns tdl::Function:
@@ -263,9 +286,9 @@ Function returns tdl::Function:
    ('(' formalParameter+=FormalParameter ( "," formalParameter+=FormalParameter)* ')')?
    'returns' returnType=[tdl::DataType|Identifier]
    (':' body=EString)?
    WithCommentFragment?
;


enum UnassignedMemberTreatment returns tdl::UnassignedMemberTreatment:
    AnyValue = '?' | AnyValueOrOmit = '*';

@@ -278,6 +301,7 @@ PredefinedFunction returns tdl::PredefinedFunction:
    'Predefined'
    name=Identifier
    ('returns' returnType=[tdl::DataType|Identifier])?
    WithCommentFragment?
;

//## Data Use
@@ -292,7 +316,10 @@ StaticDataUse returns tdl::StaticDataUse:

OmitValue returns tdl::OmitValue:
    {tdl::OmitValue}
    PrefixFragment?
    'omit'
    //TODO: this is ambiguous    
    //WithCommentFragment?
;

//# Time
@@ -302,22 +329,25 @@ Timer returns tdl::Timer:
    PrefixFragment?
    'timer'
    name=Identifier
    WithCommentFragment?
;

TimeConstraint returns tdl::TimeConstraint:
    PrefixFragment?
    PrefixNameFragment?
    //TODO: this is ambiguous    
    //PrefixFragment?
    timeConstraintExpression=StaticDataUse //TODO: revert to DataUse
    //WithCommentFragment?
;

TimeLabel returns tdl::TimeLabel:
    {tdl::TimeLabel}
    PrefixFragment?
    //TODO: this is ambiguous    
    //PrefixFragment?
    name=Identifier
    //WithCommentFragment?
;

enum TimeLabelUseKind returns tdl::TimeLabelUseKind:
    //TODO: add '@'? -> likely not
    Last = 'Last' | Previous = 'Previous' | First = 'First'
;

@@ -335,18 +365,21 @@ GateType returns tdl::GateType:
    'Gate'
    name=Identifier
    (extension=Extension)?
    //TODO: revert to 'accepts'
    'supports' dataType+=[tdl::DataType|Identifier] ( "," dataType+=[tdl::DataType|Identifier])*
    //TODO: potential ambiguity?
    WithCommentFragment?  
;

enum GateTypeKind returns tdl::GateTypeKind:
    //TODO: add '@' prefix? -> no
    Message = 'Message' | Procedure = 'Procedure';

GateInstance returns tdl::GateInstance:
    PrefixFragment?
    type=[tdl::GateType|Identifier]
    'gate'
    type=[tdl::GateType|Identifier]
    name=Identifier
    WithCommentFragment?  
;

ComponentType returns tdl::ComponentType:
@@ -360,6 +393,7 @@ ComponentType returns tdl::ComponentType:
        (timer+=Timer)*
        (variable+=Variable)*
    END
    WithCommentFragment?  
;

ComponentInstance returns tdl::ComponentInstance:
@@ -373,28 +407,28 @@ ComponentInstance returns tdl::ComponentInstance:
    //create ROLE TYPE ID
    //create ROLE ID of type TYPE (old notation) -> to be aligned with data type syntax and the rest
    role=ComponentInstanceRole
    WithCommentFragment?  
;

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

GateReference returns tdl::GateReference:
    //name=Identifier
    //TODO: check how it was done previously
    //TODO: fix fragments
    //TODO: this is ambiguous    
    //PrefixFragment?
    component=[tdl::ComponentInstance|Identifier]
    '.' 
    gate=[tdl::GateInstance|Identifier]
//    WithFragmentNested?
//    NameFragment?
    //WithCommentFragment?
    //TODO: add extended name fragments
;

Connection returns tdl::Connection:
    PrefixFragment?
    'connect'
    endPoint+=GateReference ( 'to' endPoint+=GateReference)+ 
    //TODO: fix fragments
//    WithFragmentNested?
//    NameFragment?
    endPoint+=GateReference 'to' endPoint+=GateReference
    WithCommentFragment?
    //TODO: add extended name fragments
;


@@ -407,6 +441,7 @@ TestConfiguration returns tdl::TestConfiguration:
        (componentInstance+=ComponentInstance)* 
        (connection+=Connection)* 
    END
    WithCommentFragment?
;

//# Test Behaviour
@@ -415,7 +450,6 @@ TestConfiguration returns tdl::TestConfiguration:

TestDescription returns tdl::TestDescription:
    PrefixFragment?
    PrefixTDObjectiveFragment?
    'TestDescription'
    (isLocallyOrdered?='Implementation')?
    name=Identifier
@@ -424,6 +458,8 @@ TestDescription returns tdl::TestDescription:
    (
        behaviourDescription=BehaviourDescription
    )?
    WithCommentFragment?
    //TODO: add extended objective fragments
;

BehaviourDescription returns tdl::BehaviourDescription:
@@ -453,23 +489,27 @@ Block returns tdl::Block:
;

LocalExpression returns tdl::LocalExpression:
    PrefixFragment?
    PrefixNameFragment?
    //TODO: this is ambiguous    
    //PrefixFragment?
    (scope=[tdl::ComponentInstance|Identifier] ':')?
    expression=StaticDataUse //TODO: revert to DataUse
    //WithCommentFragment?
    //TODO: add extended name fragments
;



CompoundBehaviour returns tdl::CompoundBehaviour:
    PrefixFragment?
    PrefixObjectiveFragment?
    PrefixNameFragment?
    block=Block
    //TODO: extract to fragment
//    PrefixObjectiveFragment?
//    PrefixNameFragment?
    
    //TODO: periodic / exceptional fragments
    //('periodic' '{' periodic+=PeriodicBehaviour ( "," periodic+=PeriodicBehaviour)* '}' )?
    //('exceptional' '{' exceptional+=ExceptionalBehaviour ( "," exceptional+=ExceptionalBehaviour)* '}' )?
//    WithCommentFragment?
;


@@ -477,10 +517,11 @@ CompoundBehaviour returns tdl::CompoundBehaviour:

TimerStart returns tdl::TimerStart:
    PrefixFragment?
    PrefixObjectiveFragment?
    PrefixNameFragment?
    PrefixTimeLabelFragment?
    PrefixTimeConstraintFragment?
    //TODO: extract to fragment
//    PrefixObjectiveFragment?
//    PrefixNameFragment?
//    PrefixTimeLabelFragment?
//    PrefixTimeConstraintFragment?
    'start'
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
@@ -492,10 +533,11 @@ TimerStart returns tdl::TimerStart:

TimerStop returns tdl::TimerStop:
    PrefixFragment?
    PrefixObjectiveFragment?
    PrefixNameFragment?
    PrefixTimeLabelFragment?
    PrefixTimeConstraintFragment?
    //TODO: extract to fragment
//    PrefixObjectiveFragment?
//    PrefixNameFragment?
//    PrefixTimeLabelFragment?
//    PrefixTimeConstraintFragment?
    'stop'
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
@@ -504,10 +546,11 @@ TimerStop returns tdl::TimerStop:

TimeOut returns tdl::TimeOut:
    PrefixFragment?
    PrefixObjectiveFragment?
    PrefixNameFragment?
    PrefixTimeLabelFragment?
    PrefixTimeConstraintFragment?
    //TODO: extract to fragment
//    PrefixObjectiveFragment?
//    PrefixNameFragment?
//    PrefixTimeLabelFragment?
//    PrefixTimeConstraintFragment?
    componentInstance=[tdl::ComponentInstance|Identifier]
    '.'
    timer=[tdl::Timer|Identifier]
@@ -523,17 +566,17 @@ TimeOut returns tdl::TimeOut:
//All fragments shall be optional at the point of access

//Use: contained/standalone block
fragment WithFragmentNested returns tdl::Element:
    BEGIN
    WithFragment
    END
;
//fragment WithFragmentNested returns tdl::Element:
//    BEGIN
//    WithCommentFragment
//    END
//;

//Use: inline block - within other blocks, e.g. with other contents 
fragment WithFragment returns tdl::Element:
fragment WithCommentFragment returns tdl::Element:
    ('With:'
        BEGIN
        (comment+=Comment | annotation+=Annotation)+
        (comment+=Comment)+
        END
    )
;
@@ -560,35 +603,36 @@ fragment TimeConstraintFragment returns tdl::AtomicBehaviour:
;

//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)+
    //('@' comment+=Comment | '@' annotation+=Annotation)+
    ('@' 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
;
//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)

//TODO: why does this strip quotes when it is a single word?
EString returns ecore::EString:
    STRING
    // | ID