diff --git a/tests/parsing/expressions.uvl b/tests/parsing/expressions.uvl new file mode 100644 index 0000000..471ab17 --- /dev/null +++ b/tests/parsing/expressions.uvl @@ -0,0 +1,30 @@ +features + A + or + B {Price 2, Fun 12} + C {Price 7, Fun 6} +constraints + B.Fun + C.Fun - B.Price == 16 + B.Fun + (C.Fun - B.Price) == 16 + B.Fun + C.Fun * B.Price == 24 + B.Fun + (C.Fun * B.Price) == 24 + B.Fun + C.Fun / B.Price == 15 + B.Fun + (C.Fun / B.Price) == 15 + B.Fun - C.Fun + B.Price == 8 + B.Fun - (C.Fun + B.Price) == 4 + B.Fun - C.Fun * B.Price == 0 + B.Fun - (C.Fun * B.Price) == 0 + B.Fun - C.Fun / B.Price == 9 + B.Fun - (C.Fun / B.Price) == 9 + B.Fun * C.Fun / B.Price == 36 + B.Fun * (C.Fun / B.Price) == 36 + B.Fun * C.Fun - B.Price == 70 + B.Fun * (C.Fun - B.Price) == 48 + B.Fun * C.Fun + B.Price == 74 + B.Fun * (C.Fun + B.Price) == 96 + B.Fun / C.Fun * B.Price == 4 + B.Fun / (C.Fun * B.Price) == 1 + B.Fun / C.Fun + B.Price == 4 + B.Fun / (C.Fun + B.Price) == 1.5 + B.Fun / C.Fun - B.Price == 0 + B.Fun / (C.Fun - B.Price) == 3 diff --git a/uvl/UVLBase.g4 b/uvl/UVLBase.g4 index 3e60abd..19d783e 100644 --- a/uvl/UVLBase.g4 +++ b/uvl/UVLBase.g4 @@ -72,17 +72,29 @@ equation | expression NOT_EQUALS expression # NotEqualsEquation ; -expression: - FLOAT # FloatLiteralExpression - | INTEGER # IntegerLiteralExpression - | STRING # StringLiteralExpression - | aggregateFunction # AggregateFunctionExpression - | reference # LiteralExpression - | OPEN_PAREN expression CLOSE_PAREN # BracketExpression - | expression ADD expression # AddExpression - | expression SUB expression # SubExpression - | expression MUL expression # MulExpression - | expression DIV expression # DivExpression +expression + : additiveExpression + ; + +additiveExpression + : additiveExpression ADD multiplicativeExpression # AddExpression + | additiveExpression SUB multiplicativeExpression # SubExpression + | multiplicativeExpression # MultiplicativeExpr + ; + +multiplicativeExpression + : multiplicativeExpression MUL primaryExpression # MulExpression + | multiplicativeExpression DIV primaryExpression # DivExpression + | primaryExpression # PrimaryExpressionExpression + ; + +primaryExpression + : FLOAT # FloatLiteralExpression + | INTEGER # IntegerLiteralExpression + | STRING # StringLiteralExpression + | aggregateFunction # AggregateFunctionExpression + | reference # LiteralExpression + | OPEN_PAREN expression CLOSE_PAREN # BracketExpression ; aggregateFunction @@ -160,4 +172,4 @@ SKIP_ fragment SPACES : [ \t]+ - ; \ No newline at end of file + ;