parser: new class AUnaryopExpr to factorize unary operations
[nit.git] / src / parser / nit.sablecc3xx
index 26946a7..abccc28 100644 (file)
@@ -158,6 +158,12 @@ quad = '::';
 assign = '=';
 pluseq = '+=';
 minuseq = '-=';
+stareq = '*=';
+slasheq = '/=';
+percenteq = '%=';
+starstareq = '**=';
+lleq = '<<=';
+ggeq = '>>=';
 dotdotdot = '...';
 dotdot = '..';
 dot = '.';
@@ -443,6 +449,12 @@ assignment~nopar {-> expr}
 assign_op
        = {plus} pluseq
        | {minus} minuseq
+       | {star} stareq
+       | {slash} slasheq
+       | {percent} percenteq
+       | {starstar} starstareq
+       | {ll} lleq
+       | {gg} ggeq
        ;
 
 do~withelse {-> expr}
@@ -501,10 +513,10 @@ expr~nopar~nobra {-> expr}
 
 expr_and~nopar~nobra {-> expr}
        = expr_not~nopar~nobra {-> expr_not~nopar~nobra.expr}
-       | {:or} expr_and~nopar~nobra :kwor :no expr_not~nopar~nobra
-       | {:and} expr_and~nopar~nobra :kwand :no expr_not~nopar~nobra
-       | {:or_else} expr_and~nopar~nobra :kwor :kwelse :no expr_not~nopar~nobra
-       | {:implies} expr_and~nopar~nobra :kwimplies :no expr_not~nopar~nobra
+       | {:or} expr_and~nopar~nobra kwor :no expr_not~nopar~nobra
+       | {:and} expr_and~nopar~nobra kwand :no expr_not~nopar~nobra
+       | {:or_else} expr_and~nopar~nobra kwor kwelse :no expr_not~nopar~nobra
+       | {:implies} expr_and~nopar~nobra kwimplies :no expr_not~nopar~nobra
        ;
 
 expr_not~nopar~nobra {-> expr}
@@ -514,39 +526,40 @@ expr_not~nopar~nobra {-> expr}
 
 expr_eq~nopar~nobra {-> expr}
        = expr_add~nopar~nobra {-> expr_add~nopar~nobra.expr}
-       | {:eq} expr_add~nopar~nobra :eq :no [expr2]:expr_add~nopar~nobra
-       | {:ne} expr_add~nopar~nobra :ne :no [expr2]:expr_add~nopar~nobra
-       | {:lt} expr_add~nopar~nobra :lt :no [expr2]:expr_add~nopar~nobra
-       | {:le} expr_add~nopar~nobra :le :no [expr2]:expr_add~nopar~nobra
-       | {:ll} expr_eq~nopar~nobra :ll :no [expr2]:expr_add~nopar~nobra
-       | {:gt} expr_add~nopar~nobra :gt :no [expr2]:expr_add~nopar~nobra
-       | {:ge} expr_add~nopar~nobra :ge :no [expr2]:expr_add~nopar~nobra
-       | {:gg} expr_eq~nopar~nobra :gg :no [expr2]:expr_add~nopar~nobra
-       | {:starship} expr_add~nopar~nobra :starship :no [expr2]:expr_add~nopar~nobra
-       | {:isa} expr_add~nopar~nobra :kwisa :no type~nobra
+       | {:eq} expr_add~nopar~nobra eq :no [expr2]:expr_add~nopar~nobra
+       | {:ne} expr_add~nopar~nobra ne :no [expr2]:expr_add~nopar~nobra
+       | {:lt} expr_add~nopar~nobra lt :no [expr2]:expr_add~nopar~nobra
+       | {:le} expr_add~nopar~nobra le :no [expr2]:expr_add~nopar~nobra
+       | {:ll} expr_eq~nopar~nobra ll :no [expr2]:expr_add~nopar~nobra
+       | {:gt} expr_add~nopar~nobra gt :no [expr2]:expr_add~nopar~nobra
+       | {:ge} expr_add~nopar~nobra ge :no [expr2]:expr_add~nopar~nobra
+       | {:gg} expr_eq~nopar~nobra gg :no [expr2]:expr_add~nopar~nobra
+       | {:starship} expr_add~nopar~nobra starship :no [expr2]:expr_add~nopar~nobra
+       | {:isa} expr_add~nopar~nobra kwisa :no type~nobra
        ;
 
 expr_add~nopar~nobra {-> expr}
        =  expr_mul~nopar~nobra {-> expr_mul~nopar~nobra.expr}
-       | {:plus} expr_add~nopar~nobra :plus :no [expr2]:expr_mul~nopar~nobra
-       | {:minus} expr_add~nopar~nobra :minus :no [expr2]:expr_mul~nopar~nobra
+       | {:plus} expr_add~nopar~nobra plus :no [expr2]:expr_mul~nopar~nobra
+       | {:minus} expr_add~nopar~nobra minus :no [expr2]:expr_mul~nopar~nobra
        ;
 
 expr_mul~nopar~nobra {-> expr}
        = expr_pow~nopar~nobra {-> expr_pow~nopar~nobra.expr}
-       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_pow~nopar~nobra
-       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_pow~nopar~nobra
-       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_pow~nopar~nobra
+       | {:star} expr_mul~nopar~nobra star :no [expr2]:expr_pow~nopar~nobra
+       | {:slash} expr_mul~nopar~nobra slash :no [expr2]:expr_pow~nopar~nobra
+       | {:percent} expr_mul~nopar~nobra percent :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_pow~nopar~nobra {-> expr}
        = expr_minus~nopar~nobra {-> expr_minus~nopar~nobra.expr}
-       | {:starstar} expr_minus~nopar~nobra :starstar :no [expr2]:expr_pow~nopar~nobra
+       | {:starstar} expr_minus~nopar~nobra starstar :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_minus~nopar~nobra {-> expr}
        = expr_new~nopar~nobra {-> expr_new~nopar~nobra.expr}
        | {:uminus} minus expr_minus~nobra
+       | {:uplus} plus expr_minus~nobra
        | {:once} kwonce :no expr_minus~nobra
        ;
 
@@ -833,7 +846,27 @@ propdef = {attr} doc? kwredef? visibility kwvar [id2]:id type? expr? annotations
        | {annot} doc? kwredef? visibility? atid opar? [args]:expr* cpar? annotations?
        ;
 
-methid = {id} id | {plus} plus | {minus} minus | {star} star | {starstar} starstar | {slash} slash | {percent} percent | {eq} eq | {ne} ne | {le} le | {ge} ge | {lt} lt | {gt} gt |  {ll} ll | {gg} gg | {bra} obra cbra | {starship} starship | {assign} id assign | {braassign} obra cbra assign;
+methid
+       = {id} id
+       | {plus} [op]:plus
+       | {minus} [op]:minus
+       | {star} [op]:star
+       | {starstar} [op]:starstar
+       | {slash} [op]:slash
+       | {percent} [op]:percent
+       | {eq} [op]:eq
+       | {ne} [op]:ne
+       | {le} [op]:le
+       | {ge} [op]:ge
+       | {lt} [op]:lt
+       | {gt} [op]:gt
+       | {ll} [op]:ll
+       | {gg} [op]:gg
+       | {starship} [op]:starship
+       | {bra} obra cbra
+       | {assign} id assign
+       | {braassign} obra cbra assign
+       ;
 
 signature = opar? [params]:param* cpar? type?;
 
@@ -861,28 +894,29 @@ expr      = {block} expr* kwend?
        | {once} kwonce expr 
        | {send} expr 
        | {binop} expr [expr2]:expr 
-       | {or} expr [expr2]:expr 
-       | {and} expr [expr2]:expr 
-       | {or_else} expr [expr2]:expr
-       | {implies} expr [expr2]:expr
-       | {not} kwnot expr 
-       | {eq} expr [expr2]:expr 
-       | {ne} expr [expr2]:expr 
-       | {lt} expr [expr2]:expr 
-       | {le} expr [expr2]:expr 
-       | {ll} expr [expr2]:expr
-       | {gt} expr [expr2]:expr 
-       | {ge} expr [expr2]:expr 
-       | {gg} expr [expr2]:expr
-       | {isa} expr type 
-       | {plus} expr [expr2]:expr 
-       | {minus} expr [expr2]:expr 
-       | {starship} expr [expr2]:expr 
-       | {star} expr [expr2]:expr 
-       | {starstar} expr [expr2]:expr
-       | {slash} expr [expr2]:expr 
-       | {percent} expr [expr2]:expr 
-       | {uminus} minus expr 
+       | {or} expr [op]:kwor [expr2]:expr
+       | {and} expr [op]:kwand [expr2]:expr
+       | {or_else} expr [op]:kwor kwelse [expr2]:expr
+       | {implies} expr [op]:kwimplies [expr2]:expr
+       | {not} kwnot expr
+       | {eq} expr [op]:eq [expr2]:expr
+       | {ne} expr [op]:ne [expr2]:expr
+       | {lt} expr [op]:lt [expr2]:expr
+       | {le} expr [op]:le [expr2]:expr
+       | {ll} expr [op]:ll [expr2]:expr
+       | {gt} expr [op]:gt [expr2]:expr
+       | {ge} expr [op]:ge [expr2]:expr
+       | {gg} expr [op]:gg [expr2]:expr
+       | {isa} expr kwisa type
+       | {plus} expr [op]:plus [expr2]:expr
+       | {minus} expr [op]:minus [expr2]:expr
+       | {starship} expr [op]:starship [expr2]:expr
+       | {star} expr [op]:star [expr2]:expr
+       | {starstar} expr [op]:starstar [expr2]:expr
+       | {slash} expr [op]:slash [expr2]:expr
+       | {percent} expr [op]:percent [expr2]:expr
+       | {uminus} [op]:minus expr
+       | {uplus} [op]:plus expr
        | {new} kwnew type id? [args]:exprs
        | {attr} expr [id]:attrid 
        | {attr_assign} expr [id]:attrid assign [value]:expr 
@@ -933,8 +967,14 @@ exprs
        | {bra} obra [exprs]:expr* cbra
        ;
 assign_op
-       = {plus} pluseq
-       | {minus} minuseq
+       = {plus} [op]:pluseq
+       | {minus}[op]:minuseq
+       | {star} [op]:stareq
+       | {slash} [op]:slasheq
+       | {percent} [op]:percenteq
+       | {starstar} [op]:starstareq
+       | {ll} [op]:lleq
+       | {gg} [op]:ggeq
        ;
 
 module_name = quad? [path]:id* id;