Argument parsing

This commit is contained in:
Tibo De Peuter 2025-04-28 13:36:24 +02:00
parent 32165a90f5
commit 8e6a34a231
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
5 changed files with 63 additions and 8 deletions

View file

@ -10,6 +10,8 @@ repositories {
} }
dependencies { dependencies {
// CLI argument parsing
implementation("com.xenomachina:kotlin-argparser:2.0.7")
// Parser combinator library // Parser combinator library
implementation("com.github.h0tk3y.betterParse:better-parse:0.4.4") implementation("com.github.h0tk3y.betterParse:better-parse:0.4.4")

View file

@ -1,15 +1,45 @@
import com.sun.org.apache.bcel.internal.util.Args
import com.xenomachina.argparser.ArgParser
import com.xenomachina.argparser.mainBody
import interpreter.FileLoader import interpreter.FileLoader
import io.GhentPrologArgParser
import io.Logger import io.Logger
import prolog.Program import prolog.Program
import prolog.ast.logic.Clause import prolog.ast.logic.Clause
import repl.Repl import repl.Repl
fun main() { fun main(args: Array<String>) = mainBody {
// TODO Make this a command line argument // Parse command line arguments
// Turn on debug mode val parsedArgs = ArgParser(args).parseInto(::GhentPrologArgParser)
Logger.level = Logger.Level.DEBUG
FileLoader().load("tests/parser/resources/parent.pl") parsedArgs.run {
val loader = FileLoader()
// Set the verbosity level
Logger.level = verbosity
// Check if script was provided
for (file in script) {
loader.load(file)
}
// Check if REPL was requested
if (repl) {
Repl().start() Repl().start()
} else {
Logger.warn("REPL not started. Use -r or --repl to start the REPL.")
}
}
}
fun help() {
println("""
Ghent Prolog: A Prolog interpreter in Kotlin
Options:
-s, --source <file> Specify the source file to load
-r, --repl Start the REPL (default)
-v, --verb
-h, --help Show this help message
""".trimIndent())
} }

View file

@ -123,7 +123,7 @@ open class Preprocessor {
} }
if (prepped != term || prepped::class != term::class) { if (prepped != term || prepped::class != term::class) {
Logger.debug("Preprocessed term: $term -> $prepped (${prepped::class})") Logger.debug("Preprocessed term: $term -> $prepped (is ${prepped::class.simpleName})")
} }
return prepped return prepped

View file

@ -0,0 +1,21 @@
package io
import com.xenomachina.argparser.ArgParser
import com.xenomachina.argparser.default
class GhentPrologArgParser(parser: ArgParser) {
val script by parser.adding("-s", "--script", help = "Script to run")
val repl by parser.flagging("-r", "--repl", help = "Start the REPL")
val verbosity by parser.mapping(
"--vvv" to Logger.Level.DEBUG,
"--debug" to Logger.Level.DEBUG,
"--vv" to Logger.Level.INFO,
"--verbose" to Logger.Level.INFO,
"--info" to Logger.Level.INFO,
"-v" to Logger.Level.WARN,
"--warn" to Logger.Level.WARN,
"--error" to Logger.Level.ERROR,
help = "Set the verbosity level (default: WARN)",
).default(Logger.defaultLevel)
}

View file

@ -144,7 +144,7 @@ class Divide(private val expr1: Expression, private val expr2: Expression) :
// TODO Expr rem Expr // TODO Expr rem Expr
class Between(private val expr1: Expression, private val expr2: Expression, private val expr3: Expression) : class Between(private val expr1: Expression, private val expr2: Expression, private val expr3: Expression) :
Operator(Atom("between"), expr1, expr2) { CompoundTerm(Atom("between"), listOf(expr1, expr2, expr3)), Satisfiable {
override fun satisfy(subs: Substitutions): Answers { override fun satisfy(subs: Substitutions): Answers {
val e1 = expr1.simplify(subs) val e1 = expr1.simplify(subs)
val e2 = expr2.simplify(subs) val e2 = expr2.simplify(subs)
@ -165,4 +165,6 @@ class Between(private val expr1: Expression, private val expr2: Expression, priv
} }
} }
} }
override fun toString(): String = "$expr1..$expr3..$expr2"
} }