diff --git a/src/main/kotlin/lumen/ast/Ast.kt b/src/main/kotlin/lumen/ast/Ast.kt new file mode 100644 index 0000000..16083fc --- /dev/null +++ b/src/main/kotlin/lumen/ast/Ast.kt @@ -0,0 +1,48 @@ +package lumen.ast + +sealed class Expr { + abstract val line: Int + abstract val column: Int +} + +class IntLiteral(val value: Long, override val line: Int, override val column: Int = 0) : Expr() +class DoubleLiteral(val value: Double, override val line: Int, override val column: Int = 0) : Expr() +class StringLiteral(val value: String, override val line: Int, override val column: Int = 0) : Expr() +class BoolLiteral(val value: Boolean, override val line: Int, override val column: Int = 0) : Expr() +class NilLiteral(override val line: Int, override val column: Int = 0) : Expr() + +class ListLiteral(val elements: List, override val line: Int, override val column: Int = 0) : Expr() +class MapLiteral(val entries: List>, override val line: Int, override val column: Int = 0) : Expr() + +class Variable(val name: String, override val line: Int, override val column: Int = 0) : Expr() +class Assign(val name: String, val value: Expr, override val line: Int, override val column: Int = 0) : Expr() + +class Index(val target: Expr, val index: Expr, override val line: Int, override val column: Int = 0) : Expr() +class IndexAssign(val target: Expr, val index: Expr, val value: Expr, override val line: Int, override val column: Int = 0) : Expr() + +class Unary(val op: UnaryOp, val operand: Expr, override val line: Int, override val column: Int = 0) : Expr() +class Binary(val op: BinaryOp, val left: Expr, val right: Expr, override val line: Int, override val column: Int = 0) : Expr() +class Logical(val op: LogicalOp, val left: Expr, val right: Expr, override val line: Int, override val column: Int = 0) : Expr() + +class Call(val callee: Expr, val args: List, override val line: Int, override val column: Int = 0) : Expr() +class MethodCall(val receiver: Expr, val method: String, val args: List, override val line: Int, override val column: Int = 0) : Expr() +class FunctionExpr(val name: String?, val params: List, val body: List, override val line: Int, override val column: Int = 0) : Expr() + +enum class UnaryOp { Negate, Not } +enum class BinaryOp { Add, Sub, Mul, Div, Mod, Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual } +enum class LogicalOp { And, Or } + +sealed class Stmt { + abstract val line: Int + abstract val column: Int +} + +class LetStmt(val name: String, val initializer: Expr, val mutable: Boolean, override val line: Int, override val column: Int = 0) : Stmt() +class ExprStmt(val expr: Expr, override val line: Int, override val column: Int = 0) : Stmt() +class BlockStmt(val statements: List, override val line: Int, override val column: Int = 0) : Stmt() +class IfStmt(val condition: Expr, val thenBranch: List, val elseBranch: List?, override val line: Int, override val column: Int = 0) : Stmt() +class WhileStmt(val condition: Expr, val body: List, override val line: Int, override val column: Int = 0) : Stmt() +class ForStmt(val name: String, val iterable: Expr, val body: List, override val line: Int, override val column: Int = 0) : Stmt() +class ReturnStmt(val value: Expr?, override val line: Int, override val column: Int = 0) : Stmt() +class FunctionStmt(val name: String, val function: FunctionExpr, override val line: Int, override val column: Int = 0) : Stmt() +class ImportStmt(val path: String, override val line: Int, override val column: Int = 0) : Stmt()