Skip to content
This repository has been archived by the owner on Jul 29, 2021. It is now read-only.

Commit

Permalink
Merge pull request #13 from writeonly/parser
Browse files Browse the repository at this point in the history
add parser of calculator
  • Loading branch information
kamil-adam committed Apr 9, 2019
2 parents d85ee6e + 39d8460 commit c6f56c8
Show file tree
Hide file tree
Showing 18 changed files with 84 additions and 33 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ sbt scalastyle test:scalastyle it:scalastyle &&
sbt scapegoat cpd stats
```

All for travis-ci:
All for travis-ci (without Scala Native):
```bash
sbt 'scalafix --check' 'test:scalafix --check' 'it:scalafix --check' &&
sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck it:scalafmtCheck &&
Expand All @@ -54,7 +54,7 @@ sbt scalastyle test:scalastyle it:scalastyle &&
sbt scapegoat cpd stats
```

Only Scala Native
Only Scala Native:
```bash
sbt re/scalafix re/test:scalafix re/it:scalafix &&
sbt re/scalafmtSbt re/scalafmt re/test:scalafmt re/it:scalafmt &&
Expand Down
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ val SharedSettings = Seq(
libraryDependencies ++= Seq(
"biz.enef" %%% "slogging" % SloggingVersion,
),
libraryDependencies += "com.lihaoyi" %%% "fastparse" % "1.0.0",
scalaJSUseMainModuleInitializer := true,
scalaJSMainModuleInitializer := Some(
ModuleInitializer.mainMethod(mainClassString, "main")
Expand Down
2 changes: 1 addition & 1 deletion re/js/src/main/scala/pl/writeonly/re/main/Main.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pl.writeonly.re.main

import pl.writeonly.re.shared.Core
import pl.writeonly.re.shared.core.Core

object Main extends JSApp {
override def main(): Unit = Core.apply("JS")
Expand Down
2 changes: 1 addition & 1 deletion re/jvm/src/main/scala/pl/writeonly/re/main/Main.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pl.writeonly.re.main

import pl.writeonly.re.shared.Core
import pl.writeonly.re.shared.core.Core

object Main extends App {
Core.apply("JVM")
Expand Down
2 changes: 1 addition & 1 deletion re/native/src/main/scala/pl/writeonly/re/main/Main.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pl.writeonly.re.main

import pl.writeonly.re.shared.Core
import pl.writeonly.re.shared.core.Core

object Main extends App {
Core.apply("Native")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.calculator

import scalaprops.{Property, Scalaprops}
import scalaprops._
import scalaz.Scalaz._

object CalculatorIT extends Scalaprops {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.calculator

class Calculator {
type T = Int
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package pl.writeonly.re.shared.calculator

class CalculatorParser {
def eval(tree: (Int, Seq[(String, Int)])): Int = {
val (base, ops) = tree
ops.foldLeft(base) {
case (left, (op, right)) => evalOp(op, left, right)
}
}

private def evalOp(op: String, left: Int, right: Int): Int = op match {
case "+" => left + right
case "-" => left - right
case "*" => left * right
case "/" => left / right
}

import fastparse.all._

val number: P[Int] = P(CharIn('0' to '9').rep(1).!.map(_.toInt))
val parens: P[Int] = P("(" ~/ addSub ~ ")")
val factor: P[Int] = P(number | parens)

val divMul: P[Int] = P(factor ~ (CharIn("*/").! ~/ factor).rep).map(eval)
val addSub: P[Int] = P(divMul ~ (CharIn("+-").! ~/ divMul).rep).map(eval)
val expr: P[Int] = P(addSub ~ End)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.core

trait Core {
def apply(arg: String): Unit
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.core

import slogging.LazyLogging

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.core

import slogging.StrictLogging

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package pl.writeonly.re.shared.calculator

import fastparse.core.Parsed
import utest._

@SuppressWarnings(Array("org.wartremover.warts.Any"))
object CalculatorParserTest extends TestSuite {
override val tests: Tests = Tests {
val parser = new CalculatorParser()
val expr = parser.expr
"1+1" - {
val result = expr.parse("1+1")

assertMatch(result) {
case Parsed.Success(2, _) =>
}
}
"1+1*" - {
val result = expr.parse("1+1*")

assertMatch(result) {
case _: Parsed.Failure[_, _] =>
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.calculator

import scalaz.Scalaz._
import utest._

object CalculatorTest extends TestSuite {
Expand All @@ -9,28 +8,28 @@ object CalculatorTest extends TestSuite {
'addition - {
val addition: (Int, Int) => Int = (x, y) => calculator.add(x, y)
"0 + 0 == 0" - {
assert(addition(0, 0) === 0)
addition(0, 0) ==> 0
}
"2 + 2 == 4" - {
assert(addition(2, 2) === 4)
addition(2, 2) ==> 4
}
}
'multiplication - {
val multiplication: (Int, Int) => Int = (x, y) => calculator.mul(x, y)
"0 + 0 == 0" - {
assert(multiplication(0, 0) === 0)
multiplication(0, 0) ==> 0
}
"2 + 2 == 4" - {
assert(multiplication(2, 2) === 4)
multiplication(2, 2) ==> 4
}
}
'less_or_equal - {
val less_or_equal: (Int, Int) => Boolean = (x, y) => calculator.leq(x, y)
"0 <= 2 == true" - {
assert(less_or_equal(0, 2))
less_or_equal(0, 2) ==> true
}
"2 <= 0 == false" - {
assert(!less_or_equal(2, 0))
less_or_equal(2, 0) ==> false
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package pl.writeonly.re.shared
package pl.writeonly.re.shared.core

import utest._

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package pl.writeonly.re.shared.scalapipe

import pl.writeonly.re.shared.scalapipe.ScalaPipeOps._
import scalaz.Scalaz._
import utest._

object ScalaPipeOptTest extends TestSuite {
Expand All @@ -10,11 +9,11 @@ object ScalaPipeOptTest extends TestSuite {
override val tests: Tests = Tests {
'pipe_with_lambda - {
val result = 1 ||> (_ + 2)
assert(result === 3)
result ==> 3
}
'pipe_with_method - {
val result = 1 ||> add2
assert(result === 3)
result ==> 3
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package pl.writeonly.re.shared.scalapipe

import scalaz.Scalaz._
import utest._

object ScalaPipeOptWithTraitTest extends TestSuite with ScalaPipeOps {
Expand All @@ -9,11 +8,11 @@ object ScalaPipeOptWithTraitTest extends TestSuite with ScalaPipeOps {
override val tests: Tests = Tests {
'into_with_lambda - {
val result = 1 ||> (_ + 2)
assert(result === 3)
result ==> 3
}
'into_with_method - {
val result = 1 ||> add2
assert(result === 3)
result ==> 3
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,32 @@ object ThrushTest extends TestSuite {
override val tests: Tests = Tests {
'into_with_lambda - {
val result = 1 |> (_ + 2)
assert(result === 3)
result ==> 3
}
'into_with_method - {
val result = 1 |> secondFunction
assert(result === 3)
result ==> 3
}
'into_with_method_end - {
val result = data |>
firstFunction |>
secondFunction |>
threeFunction
assert(result === 7)
result ==> 7
}
'into_with_method_front - {
val result = 1
.|>(firstFunction)
.|>(secondFunction)
.|>(threeFunction)
assert(result === 7)
result ==> 7
}
'into_with_method_front_into - {
val result = 1
.into(firstFunction)
.into(secondFunction)
.into(threeFunction)
assert(result === 7)
result ==> 7
}
}
}
4 changes: 2 additions & 2 deletions scalastyle-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
</check>
<check level="error" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
<parameters>
<parameter name="maximum"><![CDATA[2]]></parameter>
<parameter name="maximum"><![CDATA[5]]></parameter>
</parameters>
</check>
<check level="error" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
Expand Down Expand Up @@ -187,7 +187,7 @@
<check enabled="true" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" level="error"/>
<check enabled="true" class="org.scalastyle.scalariform.TodoCommentChecker" level="error">
<parameters>
<parameter default="TODO|FIXME" type="string" name="words"/>
<parameter name="words">TODO|FIXME</parameter>
</parameters>
</check>
<check enabled="false" class="org.scalastyle.scalariform.UnderscoreImportChecker" level="error">
Expand Down

0 comments on commit c6f56c8

Please sign in to comment.