Commit dcedb571 authored by Martti Käärik's avatar Martti Käärik
Browse files

Operator precedence for PredefinedFunctionCall

parent b355dd19
Loading
Loading
Loading
Loading
+94 −14
Original line number Diff line number Diff line
@@ -340,6 +340,18 @@ PredefinedIdentifierSize returns ecore::EString:
    'size'
;

// Precedence (lowest to highest):
// OrExpression → XorExpression → AndExpression → NotExpression → EqualityExpression
//   → RelationalExpression → AdditiveExpression → MultiplicativeExpression
//   → UnaryMinusExpression → PostfixExpression → PrimaryExpression
PredefinedIdentifierOr             returns ecore::EString: 'or';
PredefinedIdentifierXor            returns ecore::EString: 'xor';
PredefinedIdentifierAnd            returns ecore::EString: 'and';
PredefinedIdentifierEquality       returns ecore::EString: '==' | '!=';
PredefinedIdentifierRelational     returns ecore::EString: '<' | '>' | '<=' | '>=';
PredefinedIdentifierAdditive       returns ecore::EString: '+' | '-';
PredefinedIdentifierMultiplicative returns ecore::EString: '*' | '/' | 'mod';

EnumDataType returns tdl::EnumDataType: 
    AnnotationCommentFragment
    'Enumerated' name=Identifier
@@ -352,18 +364,83 @@ EnumDataType returns tdl::EnumDataType:
//## Data Use

DataUse returns tdl::DataUse:
    DataUseWrapped
    XorExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
    	function=[tdl::PredefinedFunction|PredefinedIdentifierBinary] 
    actualParameters+=DataUseWrapped)?
        function=[tdl::PredefinedFunction|PredefinedIdentifierOr]
        actualParameters+=XorExpression
    )*
;

XorExpression returns tdl::DataUse:
    AndExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierXor]
        actualParameters+=AndExpression
    )*
;

AndExpression returns tdl::DataUse:
    NotExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierAnd]
        actualParameters+=NotExpression
    )*
;

NotExpression returns tdl::DataUse:
    {tdl::PredefinedFunctionCall}
    function=[tdl::PredefinedFunction|PredefinedIdentifierNot]
    actualParameters+=NotExpression
    | EqualityExpression
;

EqualityExpression returns tdl::DataUse:
    RelationalExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierEquality]
        actualParameters+=RelationalExpression
    )?
;

RelationalExpression returns tdl::DataUse:
    AdditiveExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierRelational]
        actualParameters+=AdditiveExpression
    )?
;

AdditiveExpression returns tdl::DataUse:
    MultiplicativeExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierAdditive]
        actualParameters+=MultiplicativeExpression
    )*
;

MultiplicativeExpression returns tdl::DataUse:
    UnaryMinusExpression
    ({tdl::PredefinedFunctionCall.actualParameters+=current}
        function=[tdl::PredefinedFunction|PredefinedIdentifierMultiplicative]
        actualParameters+=UnaryMinusExpression
    )*
;

UnaryMinusExpression returns tdl::DataUse:
    {tdl::PredefinedFunctionCall}
    function=[tdl::PredefinedFunction|PredefinedIdentifierMinus]
    actualParameters+=UnaryMinusExpression
    | DataUseWrapped
;

DataUseWrapped returns tdl::DataUse:
    //NOTE: No name, annotations or comments
    DataElementUse
    PredefinedFunctionCallSize
    | DataElementUse
    | StaticDataUse
    | DynamicDataUse
    | CastDataUse
    | LParen DataUse RParen
;

fragment ReductionFragment returns tdl::DataUse:
@@ -477,7 +554,10 @@ DynamicDataUse returns tdl::DynamicDataUse:
    FunctionCall
    | FormalParameterUse
    | VariableUse
    | PredefinedFunctionCall
	// PredefinedFunctionCallSize is now called from DataUseWrapped.
	// The other predefined function forms (not, minus, binary) are called
	// in the precedence ladder and no longer need dedicated rule.
    // | PredefinedFunctionCall
    | TimeLabelUse
;