Skip to content

Commit

Permalink
bit shift operators
Browse files Browse the repository at this point in the history
  • Loading branch information
prakashk committed Mar 21, 2013
1 parent 510bcd8 commit 72f3e41
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/main/scala/org/moe/parser/Expressions.scala
Expand Up @@ -59,12 +59,16 @@ trait Expressions extends Literals with JavaTokenParsers with PackratParsers {
} | relOp

// nonassoc < > <= >= lt gt le ge
lazy val relOp: PackratParser[AST] = relOp ~ "[<>]=?|lt|gt|le|ge".r ~ addOp ^^ {
lazy val relOp: PackratParser[AST] = relOp ~ "[<>]=?|lt|gt|le|ge".r ~ bitShiftOp ^^ {
case left ~ op ~ right => BinaryOpNode(left, op, right)
} | addOp
} | bitShiftOp

// TODO: nonassoc named unary operators
// TODO: left << >>

// left << >>
lazy val bitShiftOp: PackratParser[AST] = bitShiftOp ~ "<<|>>".r ~ addOp ^^ {
case left ~ op ~ right => BinaryOpNode(left, op, right)
} | addOp

// left + - .
lazy val addOp: PackratParser[AST] = addOp ~ "[-+.]".r ~ mulOp ^^ {
Expand Down
18 changes: 18 additions & 0 deletions src/main/scala/org/moe/runtime/builtins/IntClass.scala
Expand Up @@ -238,6 +238,24 @@ object IntClass {
)
)

intClass.addMethod(
new MoeMethod(
"infix:<<<>",
new MoeSignature(List(new MoeParameter("$other"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeIntObject].bit_shift_left(r, e.get("$other").get)
)
)

intClass.addMethod(
new MoeMethod(
"infix:<>>>",
new MoeSignature(List(new MoeParameter("$other"))),
env,
(e) => e.getCurrentInvocant.get.asInstanceOf[MoeIntObject].bit_shift_right(r, e.get("$other").get)
)
)

// methods

intClass.addMethod(
Expand Down
Expand Up @@ -109,6 +109,14 @@ class MoeIntObject(
getNativeValue ^ other.unboxToInt.get
)

def bit_shift_left (r: MoeRuntime, other: MoeObject): MoeIntObject = r.NativeObjects.getInt(
getNativeValue << other.unboxToInt.get
)

def bit_shift_right (r: MoeRuntime, other: MoeObject): MoeIntObject = r.NativeObjects.getInt(
getNativeValue >> other.unboxToInt.get
)

// methods

def abs (r: MoeRuntime): MoeIntObject = r.NativeObjects.getInt(Math.abs(getNativeValue))
Expand Down
25 changes: 25 additions & 0 deletions src/test/scala/org/moe/parser/SimpleExpressionTestSuite.scala
Expand Up @@ -411,6 +411,31 @@ class SimpleExpressionTestSuite extends FunSuite with BeforeAndAfter with Parser
result.unboxToInt.get should equal (0xbfed)
}

test("... literal int bitwise left shift ... [32 << 1]") {
val result = interpretCode("32 << 1")
result.unboxToInt.get should equal (64)
}

test("... literal int bitwise left shift ... [257 << 7]") {
val result = interpretCode("257 << 7")
result.unboxToInt.get should equal (32896)
}

test("... literal int bitwise left shift ... [20 << 20]") {
val result = interpretCode("20 << 20")
result.unboxToInt.get should equal (20971520)
}

test("... literal int bitwise right shift ... [32 >> 1]") {
val result = interpretCode("32 >> 1")
result.unboxToInt.get should equal (16)
}

test("... literal int bitwise right shift ... [33023 >> 7]") {
val result = interpretCode("33023 >> 7")
result.unboxToInt.get should equal (257)
}

// methods

test("... literal int abs method ... [2->abs]") {
Expand Down

0 comments on commit 72f3e41

Please sign in to comment.