grammar: add bitwise operators `|`, `^`, `&`, and `~`
authorJean Privat <jean@pryen.org>
Thu, 23 Apr 2015 08:30:00 +0000 (15:30 +0700)
committerJean Privat <jean@pryen.org>
Thu, 23 Apr 2015 08:30:00 +0000 (15:30 +0700)
Signed-off-by: Jean Privat <jean@pryen.org>

src/parser/nit.sablecc3xx
src/parser/parser_nodes.nit

index abccc28..f763a6f 100644 (file)
@@ -162,6 +162,9 @@ stareq = '*=';
 slasheq = '/=';
 percenteq = '%=';
 starstareq = '**=';
+pipeeq = '|=';
+careteq = '^=';
+ampeq = '&=';
 lleq = '<<=';
 ggeq = '>>=';
 dotdotdot = '...';
@@ -173,6 +176,10 @@ star = '*';
 starstar = '**';
 slash = '/';
 percent = '%';
+pipe = '|';
+caret = '^';
+amp = '&';
+tilde = '~';
 eq = '==';
 ne = '!=';
 lt = '<';
@@ -312,6 +319,10 @@ methid~noid {-> methid}
        | {starstar} starstar {-> New methid.starstar(starstar)}
        | {slash} slash {-> New methid.slash(slash)}
        | {percent} percent {-> New methid.percent(percent)}
+       | {pipe} pipe {-> New methid.pipe(pipe)}
+       | {caret} caret {-> New methid.caret(caret)}
+       | {amp} amp {-> New methid.amp(amp)}
+       | {tilde} tilde {-> New methid.tilde(tilde)}
        | {eq} eq {-> New methid.eq(eq)}
        | {ne} ne {-> New methid.ne(ne)}
        | {le} le {-> New methid.le(le)}
@@ -453,6 +464,9 @@ assign_op
        | {slash} slasheq
        | {percent} percenteq
        | {starstar} starstareq
+       | {pipe} pipeeq
+       | {caret} careteq
+       | {amp} ampeq
        | {ll} lleq
        | {gg} ggeq
        ;
@@ -525,17 +539,36 @@ 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
+       = expr_bitor~nopar~nobra {-> expr_bitor~nopar~nobra.expr}
+       | {:eq} expr_bitor~nopar~nobra eq :no [expr2]:expr_bitor~nopar~nobra
+       | {:ne} expr_bitor~nopar~nobra ne :no [expr2]:expr_bitor~nopar~nobra
+       | {:lt} expr_bitor~nopar~nobra lt :no [expr2]:expr_bitor~nopar~nobra
+       | {:le} expr_bitor~nopar~nobra le :no [expr2]:expr_bitor~nopar~nobra
+       | {:gt} expr_bitor~nopar~nobra gt :no [expr2]:expr_bitor~nopar~nobra
+       | {:ge} expr_bitor~nopar~nobra ge :no [expr2]:expr_bitor~nopar~nobra
+       | {:starship} expr_bitor~nopar~nobra starship :no [expr2]:expr_bitor~nopar~nobra
+       | {:isa} expr_bitor~nopar~nobra kwisa :no type~nobra
+       ;
+
+expr_bitor~nopar~nobra {-> expr}
+       = [expr]:expr_bitxor~nopar~nobra {-> expr.expr}
+       | {:pipe} expr_bitor~nopar~nobra pipe :no [expr2]:expr_bitxor~nopar~nobra
+       ;
+
+expr_bitxor~nopar~nobra {-> expr}
+       = [expr]:expr_bitand~nopar~nobra {-> expr.expr}
+       | {:caret} expr_bitxor~nopar~nobra caret :no [expr2]:expr_bitand~nopar~nobra
+       ;
+
+expr_bitand~nopar~nobra {-> expr}
+       = [expr]:expr_shift~nopar~nobra {-> expr.expr}
+       | {:amp} expr_bitand~nopar~nobra amp :no [expr2]:expr_shift~nopar~nobra
+       ;
+
+expr_shift~nopar~nobra {-> expr}
+       = [expr]:expr_add~nopar~nobra {-> expr.expr}
+       | {:ll} expr_shift~nopar~nobra ll :no [expr2]:expr_add~nopar~nobra
+       | {:gg} expr_shift~nopar~nobra gg :no [expr2]:expr_add~nopar~nobra
        ;
 
 expr_add~nopar~nobra {-> expr}
@@ -560,6 +593,7 @@ expr_minus~nopar~nobra {-> expr}
        = expr_new~nopar~nobra {-> expr_new~nopar~nobra.expr}
        | {:uminus} minus expr_minus~nobra
        | {:uplus} plus expr_minus~nobra
+       | {:utilde} tilde expr_minus~nobra
        | {:once} kwonce :no expr_minus~nobra
        ;
 
@@ -863,6 +897,10 @@ methid
        | {ll} [op]:ll
        | {gg} [op]:gg
        | {starship} [op]:starship
+       | {pipe} [op]:pipe
+       | {caret} [op]:caret
+       | {amp} [op]:amp
+       | {tilde} [op]:tilde
        | {bra} obra cbra
        | {assign} id assign
        | {braassign} obra cbra assign
@@ -915,8 +953,12 @@ expr       = {block} expr* kwend?
        | {starstar} expr [op]:starstar [expr2]:expr
        | {slash} expr [op]:slash [expr2]:expr
        | {percent} expr [op]:percent [expr2]:expr
+       | {pipe} expr [op]:pipe [expr2]:expr
+       | {caret} expr [op]:caret [expr2]:expr
+       | {amp} expr [op]:amp [expr2]:expr
        | {uminus} [op]:minus expr
        | {uplus} [op]:plus expr
+       | {utilde} [op]:tilde expr
        | {new} kwnew type id? [args]:exprs
        | {attr} expr [id]:attrid 
        | {attr_assign} expr [id]:attrid assign [value]:expr 
@@ -973,6 +1015,9 @@ assign_op
        | {slash} [op]:slasheq
        | {percent} [op]:percenteq
        | {starstar} [op]:starstareq
+       | {pipe} [op]:pipeeq
+       | {caret} [op]:careteq
+       | {amp} [op]:ampeq
        | {ll} [op]:lleq
        | {gg} [op]:ggeq
        ;
index b883ad4..1a37332 100644 (file)
@@ -750,6 +750,21 @@ class TStarstareq
        super TokenOperator
 end
 
+# The operator `|=`
+class TPipeeq
+       super TokenOperator
+end
+
+# The operator `^=`
+class TCareteq
+       super TokenOperator
+end
+
+# The operator `&=`
+class TAmpeq
+       super TokenOperator
+end
+
 # The operator `<<=`
 class TLleq
        super TokenOperator
@@ -800,11 +815,31 @@ class TSlash
        super TokenOperator
 end
 
-# The operator `+%
+# The operator `%`
 class TPercent
        super TokenOperator
 end
 
+# The operator `|`
+class TPipe
+       super TokenOperator
+end
+
+# The operator `^`
+class TCaret
+       super TokenOperator
+end
+
+# The operator `&`
+class TAmp
+       super TokenOperator
+end
+
+# The operator `~`
+class TTilde
+       super TokenOperator
+end
+
 # The operator `==`
 class TEq
        super TokenOperator
@@ -1460,7 +1495,26 @@ end
 # A method name `%`
 class APercentMethid
        super AOperatorMethid
+end
 
+# A method name `|`
+class APipeMethid
+       super AOperatorMethid
+end
+
+# A method name `^`
+class ACaretMethid
+       super AOperatorMethid
+end
+
+# A method name `&`
+class AAmpMethid
+       super AOperatorMethid
+end
+
+# A method name `~`
+class ATildeMethid
+       super AOperatorMethid
 end
 
 # A method name `==`
@@ -2041,6 +2095,24 @@ class APercentExpr
        redef fun operator do return "%"
 end
 
+# A `|` expression
+class APipeExpr
+       super ABinopExpr
+       redef fun operator do return "|"
+end
+
+# A `^` expression
+class ACaretExpr
+       super ABinopExpr
+       redef fun operator do return "^"
+end
+
+# A `&` expression
+class AAmpExpr
+       super ABinopExpr
+       redef fun operator do return "&"
+end
+
 # A unary operation on a method
 class AUnaryopExpr
        super ASendExpr
@@ -2062,7 +2134,12 @@ end
 class AUplusExpr
        super AUnaryopExpr
        redef fun operator do return "+"
+end
 
+# A unary `~` expression
+class AUtildeExpr
+       super AUnaryopExpr
+       redef fun operator do return "~"
 end
 
 # An explicit instantiation. eg `new T`
@@ -2602,6 +2679,27 @@ class AStarstarAssignOp
        redef fun operator do return "**"
 end
 
+# A `|=` assignment operation
+class APipeAssignOp
+       super AAssignOp
+
+       redef fun operator do return "|"
+end
+
+# A `^=` assignment operation
+class ACaretAssignOp
+       super AAssignOp
+
+       redef fun operator do return "^"
+end
+
+# A `&=` assignment operation
+class AAmpAssignOp
+       super AAssignOp
+
+       redef fun operator do return "&"
+end
+
 # A `<<=` assignment operation
 class ALlAssignOp
        super AAssignOp