Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #68 from MoeOrganization/prakashk/intclass-methods
More builtin methods/operators on Ints + tests
  • Loading branch information
Stevan Little committed Mar 13, 2013
2 parents 4f003a0 + d795149 commit f446010
Show file tree
Hide file tree
Showing 6 changed files with 446 additions and 64 deletions.
8 changes: 4 additions & 4 deletions src/main/scala/org/moe/interpreter/Interpreter.scala
Expand Up @@ -141,8 +141,8 @@ class Interpreter {
receiver.getAssociatedClass.getOrElse(
throw new MoeErrors.ClassNotFound(receiver.toString)
).getMethod("prefix:<" + operator + ">").getOrElse(
throw new MoeErrors.MethodNotFound("prefix:<" + operator + ">")
),
throw new MoeErrors.MethodNotFound("method prefix:<" + operator + "> missing in class " + receiver.getClassName)
),
List()
)
}
Expand All @@ -153,7 +153,7 @@ class Interpreter {
receiver.getAssociatedClass.getOrElse(
throw new MoeErrors.ClassNotFound(receiver.toString)
).getMethod("postfix:<" + operator + ">").getOrElse(
throw new MoeErrors.MethodNotFound("postfix:<" + operator + ">")
throw new MoeErrors.MethodNotFound("method postfix:<" + operator + "> missing in class " + receiver.getClassName)
),
List()
)
Expand All @@ -168,7 +168,7 @@ class Interpreter {
receiver.getAssociatedClass.getOrElse(
throw new MoeErrors.ClassNotFound(receiver.toString)
).getMethod("infix:<" + operator + ">").getOrElse(
throw new MoeErrors.MethodNotFound("infix:<" + operator + ">")
throw new MoeErrors.MethodNotFound("method infix:<" + operator + "> missing in class " + receiver.getClassName)
),
List(arg)
)
Expand Down
15 changes: 14 additions & 1 deletion src/main/scala/org/moe/parser/Expressions.scala
Expand Up @@ -14,13 +14,21 @@ trait Expressions extends Literals with JavaTokenParsers with PackratParsers {
(namespacedIdentifier <~ "{") ~
(expression <~ "}")

lazy val expression: PackratParser[AST] = relOp
lazy val expression: PackratParser[AST] = bitOrOp

// This is what I want
// def binOpResult = { case left ~ op ~ right => MethodCallNode(left, op, List(right)) }
// lazy val addOp: PackratParser[AST] = addOp ~ "[-+]".r ~ mulOp ^^ binOpResult | mulOp
// lazy val mulOp: PackratParser[AST] = mulOp ~ "[*/]".r ~ simpleExpression ^^ binOpResult | simpleExpression

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

lazy val bitAndOp: PackratParser[AST] = bitAndOp ~ "&" ~ relOp ^^ {
case left ~ op ~ right => BinaryOpNode(left, op, right)
} | relOp

lazy val relOp: PackratParser[AST] = relOp ~ "[<>]=?|[!=]=".r ~ addOp ^^ {
case left ~ op ~ right => BinaryOpNode(left, op, right)
} | addOp
Expand Down Expand Up @@ -52,9 +60,14 @@ trait Expressions extends Literals with JavaTokenParsers with PackratParsers {
| declaration
| variable
| expressionParens
| signedExpressionParens
)

def expressionParens: Parser[AST] = "(" ~> expression <~ ")"
def signedExpressionParens: PackratParser[AST] = "[-+]".r ~ expressionParens ^^ {
case "+" ~ expr => expr
case "-" ~ expr => PrefixUnaryOpNode(expr, "-")
}

// List stuff
def list: Parser[List[AST]] = (literal(",").? ~> repsep(expression, ",") <~ literal(",").?)
Expand Down
8 changes: 8 additions & 0 deletions src/main/scala/org/moe/runtime/MoeObject.scala
Expand Up @@ -75,6 +75,14 @@ class MoeObject(
def isInstanceOf(klassname: String): Boolean = associatedClass.exists(_.isClassOf(klassname))
def isInstanceOf(klass: MoeClass): Boolean = associatedClass.exists(_.isClassOf(klass))

/**
* Return the name of the class this object is an instance of
*/
def getClassName: String = associatedClass match {
case Some(klass) => klass.getName
case _ => ""
}

/**
* Invoke the named method.
*
Expand Down

0 comments on commit f446010

Please sign in to comment.