An actual command line tool to run pork programs.

This commit is contained in:
2023-08-21 23:08:56 -07:00
parent e12b51e8a7
commit 1445490770
13 changed files with 200 additions and 150 deletions

View File

@ -0,0 +1,23 @@
package gay.pizza.pork.cli
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.types.path
import gay.pizza.pork.compiler.KotlinCompiler
import gay.pizza.pork.parse.PorkParser
import gay.pizza.pork.parse.PorkTokenizer
import gay.pizza.pork.parse.StringCharSource
import gay.pizza.pork.parse.TokenStreamSource
import kotlin.io.path.readText
class GenerateKotlinCommand : CliktCommand(help = "Generate Kotlin Code", name = "generate-kotlin") {
val path by argument("file").path(mustExist = true, canBeDir = false)
override fun run() {
val content = path.readText()
val tokenStream = PorkTokenizer(StringCharSource(content)).tokenize()
val program = PorkParser(TokenStreamSource(tokenStream)).readProgram()
val compiler = KotlinCompiler()
println(compiler.visit(program))
}
}

View File

@ -0,0 +1,21 @@
package gay.pizza.pork.cli
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.types.path
import gay.pizza.pork.parse.AnsiHighlightScheme
import gay.pizza.pork.parse.Highlighter
import gay.pizza.pork.parse.PorkTokenizer
import gay.pizza.pork.parse.StringCharSource
import kotlin.io.path.readText
class HighlightCommand : CliktCommand(help = "Syntax Highlighter", name = "highlight") {
val path by argument("file").path(mustExist = true, canBeDir = false)
override fun run() {
val content = path.readText()
val tokenStream = PorkTokenizer(StringCharSource(content)).tokenize()
val highlighter = Highlighter(AnsiHighlightScheme())
print(highlighter.highlight(tokenStream).joinToString(""))
}
}

View File

@ -0,0 +1,20 @@
package gay.pizza.pork.cli
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.core.subcommands
class RootCommand : CliktCommand(
help = "Pork - The BBQ Language",
name = "pork"
) {
init {
subcommands(
RunCommand(),
HighlightCommand(),
TokenizeCommand(),
GenerateKotlinCommand()
)
}
override fun run() {}
}

View File

@ -0,0 +1,32 @@
package gay.pizza.pork.cli
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.types.path
import gay.pizza.pork.eval.CallableFunction
import gay.pizza.pork.eval.PorkEvaluator
import gay.pizza.pork.eval.Scope
import gay.pizza.pork.parse.PorkParser
import gay.pizza.pork.parse.PorkTokenizer
import gay.pizza.pork.parse.StringCharSource
import gay.pizza.pork.parse.TokenStreamSource
import kotlin.io.path.readText
class RunCommand : CliktCommand(help = "Run Program", name = "run") {
val path by argument("file").path(mustExist = true, canBeDir = false)
override fun run() {
val content = path.readText()
val tokenStream = PorkTokenizer(StringCharSource(content)).tokenize()
val program = PorkParser(TokenStreamSource(tokenStream)).readProgram()
val scope = Scope()
scope.define("println", CallableFunction { arguments ->
for (argument in arguments.values) {
println(argument)
}
})
val evaluator = PorkEvaluator(scope)
evaluator.visit(program)
}
}

View File

@ -0,0 +1,25 @@
package gay.pizza.pork.cli
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.types.path
import gay.pizza.pork.parse.PorkTokenizer
import gay.pizza.pork.parse.StringCharSource
import kotlin.io.path.readText
class TokenizeCommand : CliktCommand(help = "Tokenize Program", name = "tokenize") {
val path by argument("file").path(mustExist = true, canBeDir = false)
override fun run() {
val content = path.readText()
val tokenStream = PorkTokenizer(StringCharSource(content)).tokenize()
for (token in tokenStream.tokens) {
println("${token.start} ${token.type.name} '${sanitize(token.text)}'")
}
}
private fun sanitize(input: String): String =
input
.replace("\n", "\\n")
.replace("\r", "\\r")
}

View File

@ -0,0 +1,3 @@
package gay.pizza.pork.cli
fun main(args: Array<String>) = RootCommand().main(args)