mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-10-10 16:19:37 +00:00
An actual command line tool to run pork programs.
This commit is contained in:
23
src/main/kotlin/gay/pizza/pork/cli/GenerateKotlinCommand.kt
Normal file
23
src/main/kotlin/gay/pizza/pork/cli/GenerateKotlinCommand.kt
Normal 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))
|
||||
}
|
||||
}
|
21
src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt
Normal file
21
src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt
Normal 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(""))
|
||||
}
|
||||
}
|
20
src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt
Normal file
20
src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt
Normal 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() {}
|
||||
}
|
32
src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt
Normal file
32
src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt
Normal 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)
|
||||
}
|
||||
}
|
25
src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt
Normal file
25
src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt
Normal 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")
|
||||
}
|
3
src/main/kotlin/gay/pizza/pork/cli/main.kt
Normal file
3
src/main/kotlin/gay/pizza/pork/cli/main.kt
Normal file
@ -0,0 +1,3 @@
|
||||
package gay.pizza.pork.cli
|
||||
|
||||
fun main(args: Array<String>) = RootCommand().main(args)
|
Reference in New Issue
Block a user