Skip to content

Commit

Permalink
Modulo operation was implemented (as it was described in #44 issue)
Browse files Browse the repository at this point in the history
  • Loading branch information
vasiliybondarenko committed Mar 13, 2014
1 parent e5b1f67 commit 91572f2
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/main/scala/org/arnoldc/ArnoldParser.scala
Expand Up @@ -39,6 +39,7 @@ class ArnoldParser extends Parser {
val CallMethod = "DO IT NOW"
val NonVoidMethod = "GIVE THESE PEOPLE AIR"
val AssignVariableFromMethodCall = "GET YOUR ASS TO MARS"
val Modulo = "I LET HIM GO"

val EOL = zeroOrMore("\t" | "\r" | " ") ~ "\n" ~ zeroOrMore("\t" | "\r" | " " | "\n")
val WhiteSpace = oneOrMore(" " | "\t")
Expand Down Expand Up @@ -136,7 +137,8 @@ class ArnoldParser extends Parser {
PlusExpression ~~> PlusExpressionNode |
MinusExpression ~~> MinusExpressionNode |
MultiplicationExpression ~~> MultiplicationExpressionNode |
DivisionExpression ~~> DivisionExpressionNode
DivisionExpression ~~> DivisionExpressionNode |
ModuloExpression ~~> ModuloExpressionNode
}

def SetValueExpression: Rule1[OperandNode] = rule {
Expand All @@ -160,6 +162,10 @@ class ArnoldParser extends Parser {
DivisionOperator ~ WhiteSpace ~ Operand ~ EOL
}

def ModuloExpression: Rule1[AstNode] = rule {
Modulo ~ WhiteSpace ~ Operand ~ EOL
}

def Variable: Rule1[VariableNode] = rule {
VariableName ~> VariableNode
}
Expand Down
14 changes: 14 additions & 0 deletions src/main/scala/org/arnoldc/ast/ModuloExpressionNode.scala
@@ -0,0 +1,14 @@
package org.arnoldc.ast

import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes._
import org.arnoldc.SymbolTable


case class ModuloExpressionNode(expression: AstNode ,operand: AstNode ) extends AstNode {
def generate(mv: MethodVisitor, symbolTable: SymbolTable) {
expression.generate(mv, symbolTable)
operand.generate(mv, symbolTable)
mv.visitInsn(IREM)
}
}
28 changes: 28 additions & 0 deletions src/test/scala/org/arnoldc/ArithmeticTest.scala
Expand Up @@ -291,6 +291,34 @@ class ArithmeticTest extends ArnoldGeneratorTest {
getOutput(code) should equal("2\n")
}

it should "evaluate when calculating modulo variables vol1" in {
val code =
"IT'S SHOWTIME\n" +
"HEY CHRISTMAS TREE var\n" +
"YOU SET US UP 1\n" +
"GET TO THE CHOPPER var\n" +
"HERE IS MY INVITATION var\n" +
"I LET HIM GO 2\n" +
"ENOUGH TALK\n" +
"TALK TO THE HAND var\n" +
"YOU HAVE BEEN TERMINATED\n"
getOutput(code) should equal("1\n")
}

it should "evaluate when calculating modulo variables vol2" in {
val code =
"IT'S SHOWTIME\n" +
"HEY CHRISTMAS TREE var\n" +
"YOU SET US UP 2\n" +
"GET TO THE CHOPPER var\n" +
"HERE IS MY INVITATION var\n" +
"I LET HIM GO 2\n" +
"ENOUGH TALK\n" +
"TALK TO THE HAND var\n" +
"YOU HAVE BEEN TERMINATED\n"
getOutput(code) should equal("0\n")
}

it should "evaluate using different arithmetic operations" in {
val code =
"IT'S SHOWTIME\n" +
Expand Down

0 comments on commit 91572f2

Please sign in to comment.