Signed-off-by: Peter Pöschl <pp+ujt2...@nest-ai.de>
---
 urjtag/src/stapl/jamexp.y | 131 ++++++++++++++------------------------
 1 file changed, 48 insertions(+), 83 deletions(-)

diff --git a/urjtag/src/stapl/jamexp.y b/urjtag/src/stapl/jamexp.y
index 26336271..31a557e5 100644
--- a/urjtag/src/stapl/jamexp.y
+++ b/urjtag/src/stapl/jamexp.y
@@ -1389,168 +1389,133 @@ JAM_RETURN_TYPE urj_jam_evaluate_expression
 }
 }
 
+%left "||"
+%left "&&"
+%left '|'
+%left '^'
+%left '&'
+%left "==" "!="
+%left '>' '<' ">=" "<="
+%left "<<" ">>"
+%left '+' '-'
+%left '*' '/' '%'
+%precedence UNARY_OP // unary '+', '-', '!', '~'
+
 %% // Grammar rules
 
 // grammar start symbol
-stapl_expr: /*P1*/ logical_or_expr {
+stapl_expr: /*P1*/ expr {
    urj_jam_parse_value = $1.val;
    urj_jam_expr_type = $1.type;
 }
 ;
-pound_expr: /*P2*/ '#' "VALUE"[right] {
+int_param: /*P2*/ '#' expr[right] {
    $$ = CALC (POUND, $right, NULL_EXP);
 }
-;
-dollar_expr: /*P3*/ '$' "VALUE"[right] {
-   $$ = CALC (DOLLAR, $right, NULL_EXP);
-}
-| '$' array_expr[right] {
+| /*P3*/ '$' expr[right] {
    $$ = CALC (DOLLAR, $right, NULL_EXP);
 }
-;
-array_range: /*P4*/ "ARRAY" '[' logical_or_expr[left] ".." 
logical_or_expr[right] ']' {
+| /*P4*/ "ARRAY" '[' expr[left] ".." expr[right] ']' {
    // ??: ARRAY seems to have been cached somewhere
    $$ = CALC (ARRAY_RANGE, $left, $right);
 }
-;
-array_all: /*P5*/ "ARRAY"[left] '[' ']' {
+| /*P5*/ "ARRAY"[left] '[' ']' {
    $$ = CALC (ARRAY_ALL, $left, NULL_EXP);
 }
 ;
 primary_expr: /*P6*/ "VALUE"
-| /*P7*/ '(' logical_or_expr[mid] ')' {
+| /*P7*/ '(' expr[mid] ')' {
    $$ = $mid;
 }
 | array_expr
-| abs_expr
-| ceil_expr
-| floor_expr
-| int_expr
-| log2_expr
-| sqrt_expr
 ;
-unary_expr: primary_expr
-| /*P8*/ '+' unary_expr[right] {
+expr: primary_expr
+| /*P8*/ '+' expr[right] %prec UNARY_OP {
    $$ = $right;
 }
-| /*P9*/ '-' unary_expr[right] {
+| /*P9*/ '-' expr[right] %prec UNARY_OP {
    $$ = CALC (UMINUS, $right, NULL_EXP);
 }
-| /*P10*/ '!' unary_expr[right] {
+| /*P10*/ '!' expr[right] %prec UNARY_OP {
    $$ = CALC (NOT, $right, NULL_EXP);
 }
-| /*P11*/ '~' unary_expr[right] {
+| /*P11*/ '~' expr[right] %prec UNARY_OP {
    $$ = CALC (BITWISE_NOT, $right, NULL_EXP);
 }
-;
-additive_expr: multiplicative_expr
-| /*P12*/ additive_expr[left] '+' multiplicative_expr[right] {
+| /*P12*/ expr[left] '+' expr[right] {
    $$ = CALC (ADD, $left, $right);
 }
-| /*P13*/ additive_expr[left] '-' multiplicative_expr[right] {
+| /*P13*/ expr[left] '-' expr[right] {
    $$ = CALC (SUB, $left, $right);
 }
-;
-multiplicative_expr: unary_expr
-| /*P14*/ multiplicative_expr[left] '*' unary_expr[right] {
+| /*P14*/ expr[left] '*' expr[right] {
    $$ = CALC (MULT, $left, $right);
 }
-| /*P15*/ multiplicative_expr[left] '/' unary_expr[right] {
+| /*P15*/ expr[left] '/' expr[right] {
    $$ = CALC (DIV, $left, $right);
 }
-| /*P16*/ multiplicative_expr[left] '%' unary_expr[right] {
+| /*P16*/ expr[left] '%' expr[right] {
    $$ = CALC (MOD, $left, $right);
 }
-;
-bitand_expr: equality_expr
-| /*P17*/ bitand_expr[left] '&' equality_expr[right] {
+| /*P17*/ expr[left] '&' expr[right] {
    $$ = CALC (BITWISE_AND, $left, $right);
 }
-;
-bitor_expr: bitxor_expr
-| /*P18*/ bitor_expr[left] '|' bitxor_expr[right] {
+| /*P18*/ expr[left] '|' expr[right] {
    $$ = CALC (BITWISE_OR, $left, $right);
 }
-;
-bitxor_expr: bitand_expr
-| /*P19*/ bitxor_expr[left] '^' bitand_expr[right] {
+| /*P19*/ expr[left] '^' expr[right] {
    $$ = CALC (BITWISE_XOR, $left, $right);
 }
-;
-logical_and_expr: bitor_expr
-| /*P20*/ logical_and_expr[left] "&&" bitor_expr[right] {
+| /*P20*/ expr[left] "&&" expr[right] {
    $$ = CALC (AND, $left, $right);
 }
-;
-logical_or_expr: logical_and_expr
-| /*P21*/ logical_or_expr[left] "||" logical_and_expr[right] {
+| /*P21*/ expr[left] "||" expr[right] {
    $$ = CALC (OR, $left, $right);
 }
-;
-shift_expr: additive_expr
-| /*P22*/ shift_expr[left] "<<" additive_expr[right] {
+| /*P22*/ expr[left] "<<" expr[right] {
    $$ = CALC (LEFT_SHIFT, $left, $right);
 }
-| /*P23*/ shift_expr[left] ">>" additive_expr[right] {
+| /*P23*/ expr[left] ">>" expr[right] {
    $$ = CALC (RIGHT_SHIFT, $left, $right);
 }
-;
-equality_expr: relational_expr
-| /*P24*/ equality_expr[left] "==" relational_expr[right] {
+| /*P24*/ expr[left] "==" expr[right] {
    $$ = CALC (EQUALITY, $left, $right);
 }
-| /*P25*/ equality_expr[left] "!=" relational_expr[right] {
+| /*P25*/ expr[left] "!=" expr[right] {
    $$ = CALC (INEQUALITY, $left, $right);
 }
-;
-relational_expr: shift_expr
-| /*P26*/ relational_expr[left] '>' shift_expr[right] {
+| /*P26*/ expr[left] '>' expr[right] {
    $$ = CALC (GREATER_THAN, $left, $right);
 }
-| /*P27*/ relational_expr[left] '<' shift_expr[right] {
+| /*P27*/ expr[left] '<' expr[right] {
    $$ = CALC (LESS_THAN, $left, $right);
 }
-| /*28*/ relational_expr[left] ">=" shift_expr[right] {
+| /*28*/ expr[left] ">=" expr[right] {
    $$ = CALC (GREATER_OR_EQUAL, $left, $right);
 }
-| /*P29*/ relational_expr[left] "<=" shift_expr[right] {
+| /*P29*/ expr[left] "<=" expr[right] {
    $$ = CALC (LESS_OR_EQUAL, $left, $right);
 }
-;
-abs_expr: /*P30*/ "ABS" '(' logical_or_expr[mid] ')' {
+| /*P30*/ "ABS" '(' expr[mid] ')' {
    $$ = CALC (ABS, $mid, NULL_EXP);
 }
-;
-int_expr: /*P31*/ "INT" '(' pound_expr[mid] ')' {
-   $$ = CALC (INT, $mid, NULL_EXP);
-}
-| "INT" '(' dollar_expr[mid] ')' {
-   $$ = CALC (INT, $mid, NULL_EXP);
-}
-| "INT" '(' array_range[mid] ')' {
-   $$ = CALC (INT, $mid, NULL_EXP);
-}
-| "INT" '(' array_all[mid] ')' {
+| /*P31*/ "INT" '(' int_param[mid] ')' {
    $$ = CALC (INT, $mid, NULL_EXP);
 }
-;
-log2_expr: /*P32*/ "LOG2" '(' logical_or_expr[mid] ')' {
+| /*P32*/ "LOG2" '(' expr[mid] ')' {
    $$ = CALC (LOG2, $mid, NULL_EXP);
 }
-;
-sqrt_expr: /*P33*/ "SQRT" '(' logical_or_expr[mid] ')' {
+| /*P33*/ "SQRT" '(' expr[mid] ')' {
    $$ = CALC (SQRT, $mid, NULL_EXP);
 }
-;
-ceil_expr: /*P34*/ "CEIL" '(' logical_or_expr[mid] ')' {
+| /*P34*/ "CEIL" '(' expr[mid] ')' {
    $$ = CALC (CIEL, $mid, NULL_EXP);
 }
-;
-floor_expr: /*P35*/ "FLOOR" '(' logical_or_expr[mid] ')' {
+| /*P35*/ "FLOOR" '(' expr[mid] ')' {
    $$ = CALC (FLOOR, $mid, NULL_EXP);
 }
 ;
-array_expr: /*P36*/ "ARRAY"[left] '[' logical_or_expr[right] ']' {
+array_expr: /*P36*/ "ARRAY"[left] '[' expr[right] ']' {
    $$ = CALC (ARRAY, $left, $right);
 }
 ;
-- 
2.35.1






_______________________________________________
UrJTAG-development mailing list
UrJTAG-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/urjtag-development

Reply via email to