diff --git a/chapi-domain/src/main/kotlin/chapi/domain/expr/Expression.kt b/chapi-domain/src/main/kotlin/chapi/domain/expr/Expression.kt index cb6bd20d..468a92b4 100644 --- a/chapi-domain/src/main/kotlin/chapi/domain/expr/Expression.kt +++ b/chapi-domain/src/main/kotlin/chapi/domain/expr/Expression.kt @@ -2,13 +2,6 @@ package chapi.domain.expr // todo: mapping to pratt parser ? // mini sample -// -// enum class TokenTree { -// Primary, -// Prefix, -// Infix, -// Postfix; -// } sealed class Expression { class BinOp(val lhs: ExpressionNode, val op: BinOpKind, val rhs: ExpressionNode) : ExpressionNode { override fun toString() = "$lhs $op $rhs" @@ -22,10 +15,26 @@ sealed class Expression { override fun toString() = value.toString() } + class FloatValue(val value: Float) : ExpressionNode { + override fun toString() = value.toString() + } + + class StringValue(val value: String) : ExpressionNode { + override fun toString() = value + } + class Variable(val name: String) : ExpressionNode { override fun toString() = name } + class TryCatch(val tryBlock: ExpressionNode, val catchBlock: ExpressionNode) : ExpressionNode { + override fun toString() = "try { $tryBlock } catch { $catchBlock }" + } + + class IfElse(val condition: ExpressionNode, val thenBlock: ExpressionNode, val elseBlock: ExpressionNode) : ExpressionNode { + override fun toString() = "if ($condition) { $thenBlock } else { $elseBlock }" + } + class Identifier(val name: String) : ExpressionNode { override fun toString() = name } @@ -45,6 +54,10 @@ sealed class Expression { override fun toString() = args.joinToString(", ") } + class ArrayLiteral(val args: kotlin.Array) : ExpressionNode { + override fun toString() = "[${args.joinToString(", ")}]" + } + class CustomValueType(val value: ValueType) : ExpressionNode } diff --git a/chapi-domain/src/test/kotlin/chapi/domain/expr/ExpressionTest.kt b/chapi-domain/src/test/kotlin/chapi/domain/expr/ExpressionTest.kt index 2e6d6d96..79478226 100644 --- a/chapi-domain/src/test/kotlin/chapi/domain/expr/ExpressionTest.kt +++ b/chapi-domain/src/test/kotlin/chapi/domain/expr/ExpressionTest.kt @@ -70,4 +70,34 @@ class ExpressionTest { ).toString(), "add(1, 2)" ) } + + @Test + fun arrayLiteral() { + assertEquals(Expression.ArrayLiteral( + args = arrayOf( + Expression.IntValue(1), + Expression.IntValue(2) + ) + ).toString(), "[1, 2]" + ) + } + + @Test + fun tryCatch() { + assertEquals(Expression.TryCatch( + tryBlock = Expression.IntValue(1), + catchBlock = Expression.IntValue(2) + ).toString(), "try { 1 } catch { 2 }" + ) + } + + @Test + fun ifElse() { + assertEquals(Expression.IfElse( + condition = Expression.IntValue(1), + thenBlock = Expression.IntValue(2), + elseBlock = Expression.IntValue(3) + ).toString(), "if (1) { 2 } else { 3 }" + ) + } }