This commit is contained in:
Mark Canlas 2020-08-15 14:38:08 -04:00
parent 9c22c22a6f
commit d3e3d314bb
5 changed files with 151 additions and 8 deletions

View File

@ -0,0 +1,43 @@
package com.htmlism.mos6502.dsl
import scala.collection.mutable.ListBuffer
case class AsmDocument(xs: List[TopLevelAsmDocumentFragment])
class AsmDocumentContext {
private val xs: ListBuffer[TopLevelAsmDocumentFragment] =
ListBuffer()
def push(x: TopLevelAsmDocumentFragment): Unit =
xs.append(x)
def toDoc: AsmDocument =
AsmDocument(xs.toList)
}
sealed trait TopLevelAsmDocumentFragment
sealed trait AsmBlockFragment extends TopLevelAsmDocumentFragment
case class DefineGroup(xs: List[Definition[_]]) extends TopLevelAsmDocumentFragment
class DefineGroupContext {
private val xs: ListBuffer[Definition[_]] =
ListBuffer()
def push(x: Definition[_]): Unit =
xs.append(x)
def toGroup: DefineGroup =
DefineGroup(xs.toList)
}
case class Definition[A : Operand](name: String, x: A)
class AsmBlockContext {
private val xs: ListBuffer[Statement] =
ListBuffer()
def push(x: Statement): Unit =
xs.append(x)
}

View File

@ -49,14 +49,6 @@ object DslDemo extends App {
println()
println()
}
implicit class AddressOps(n: Int) {
def z: ZeroAddress =
ZeroAddress(n)
def addr: GlobalAddress =
GlobalAddress(n)
}
}
object registers {

View File

@ -0,0 +1,35 @@
package com.htmlism.mos6502
package object dsl {
def asmDoc(f: AsmDocumentContext => Unit): AsmDocument = {
val ctx: AsmDocumentContext =
new AsmDocumentContext
f(ctx)
ctx
.toDoc
}
def group(f: DefineGroupContext => Unit)(implicit ctx: AsmDocumentContext): Unit = {
val g: DefineGroupContext =
new DefineGroupContext
f(g)
ctx
.push(g.toGroup)
}
def define[A : Operand](name: String, x: A)(implicit ctx: DefineGroupContext): Unit =
ctx
.push(Definition(name, x))
implicit class AddressOps(n: Int) {
def z: ZeroAddress =
ZeroAddress(n)
def addr: GlobalAddress =
GlobalAddress(n)
}
}

View File

@ -0,0 +1,39 @@
package com.htmlism.mos6502.dsl
import org.scalatest.flatspec._
import org.scalatest.matchers._
class DslSpec extends AnyFlatSpec with should.Matchers {
"the dsl" should "compile" in {
val doc =
asmDoc { implicit ctx =>
group { implicit g =>
define("snakeBodyStart", 0x12.z)
define("snakeDirection", 0x02.z)
define("snakeLength", 0x03.z)
}
group { implicit g =>
define("ASCII_w", 0x77)
define("ASCII_a", 0x61)
define("ASCII_s", 0x73)
define("ASCII_d", 0x64)
}
}
doc shouldEqual AsmDocument(List(
DefineGroup(List(
Definition("snakeBodyStart", 0x12.z),
Definition("snakeDirection", 0x02.z),
Definition("snakeLength", 0x03.z)
)),
DefineGroup(List(
Definition("ASCII_w", 0x77),
Definition("ASCII_a", 0x61),
Definition("ASCII_s", 0x73),
Definition("ASCII_d", 0x64)
))
))
}
}

View File

@ -0,0 +1,34 @@
package com.htmlism.mos6502.dsl
import weaver.SimpleIOSuite
import cats.effect._
// Suites must be "objects" for them to be picked by the framework
object MySuite extends SimpleIOSuite {
// A test for non-effectful (pure) functions
pureTest("hello pure") {
expect("hello".size == 6)
}
val random = IO(java.util.UUID.randomUUID())
// A test for side-effecting functions
simpleTest("hello side-effects") {
for {
x <- random
y <- random
} yield expect(x != y)
}
// A test with logs
loggedTest("hello logs") { log =>
for {
x <- random
_ <- log.info(s"x : $x")
y <- random
_ <- log.info(s"y : $y")
} yield expect(x != y)
}
}