From 05cb52bc32574d02b7ca1b8729761380755c3651 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Mon, 21 Aug 2023 23:17:30 -0700 Subject: [PATCH] Add reprint command to regenerate program from AST. --- .../gay/pizza/pork/cli/ReprintCommand.kt | 22 +++++++++++++++++++ .../kotlin/gay/pizza/pork/cli/RootCommand.kt | 1 + 2 files changed, 23 insertions(+) create mode 100644 src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt b/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt new file mode 100644 index 0000000..13b1935 --- /dev/null +++ b/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt @@ -0,0 +1,22 @@ +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.ast.Printer +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 ReprintCommand : CliktCommand(help = "Reprint Parsed Program", name = "reprint") { + 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() + print(buildString { Printer(this).visit(program) }) + } +} diff --git a/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt b/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt index 3adc989..69f82cb 100644 --- a/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt +++ b/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt @@ -12,6 +12,7 @@ class RootCommand : CliktCommand( RunCommand(), HighlightCommand(), TokenizeCommand(), + ReprintCommand(), GenerateKotlinCommand() ) }