diff --git a/src/main/kotlin/dsl/ast/model/node/AccessOperatorNode.kt b/src/main/kotlin/dsl/ast/model/node/AccessOperatorNode.kt new file mode 100644 index 0000000..b6a51bf --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/AccessOperatorNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class AccessOperatorNode(position: TokenPosition) : BinaryOperatorAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt new file mode 100644 index 0000000..b94a8b7 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt @@ -0,0 +1,12 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +abstract class AtomAbstractNode(position: TokenPosition) : Node(1, position) { + var value: Any + get() = children[0] + set(value) { + children[0] = value + } +} + diff --git a/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt new file mode 100644 index 0000000..5bc8ade --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt @@ -0,0 +1,23 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +abstract class BinaryOperatorAbstractNode(position: TokenPosition) : Node(3, position) { + var lhs: Any + get() = children[0] + set(value) { + children[0] = value + } + + var operator: Any + get() = children[1] + set(value) { + children[1] = value + } + + var rhs: Any + get() = children[2] + set(value) { + children[2] = value + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt new file mode 100644 index 0000000..aa06e1c --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class BoolLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt new file mode 100644 index 0000000..545585f --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class FloatLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt new file mode 100644 index 0000000..cfcb27c --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class IntegerLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/MinusOperatorNode.kt b/src/main/kotlin/dsl/ast/model/node/MinusOperatorNode.kt new file mode 100644 index 0000000..f89a37e --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/MinusOperatorNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class MinusOperatorNode(position: TokenPosition) : UnaryOperatorAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/Node.kt b/src/main/kotlin/dsl/ast/model/node/Node.kt new file mode 100644 index 0000000..d6d2549 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/Node.kt @@ -0,0 +1,38 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +abstract class Node(numberOfChildren: Int, val position: TokenPosition) { + protected var children: MutableList = MutableList(numberOfChildren) { NONE } + + constructor(children: List, position: TokenPosition) : this(children.size, position) { + this.children = children.toMutableList() + } + + operator fun get(index: Int) = children[index] + + operator fun set(index: Int, value: Any) { + children[index] = value + } + + fun pretty(prefix: String = "", last: Boolean = true, first: Boolean = true) { + var newPrefix = prefix + var newLast = last + val nodeName = this::class.simpleName ?: "" + + println(newPrefix + (if (first) "" else if (newLast) "└─" else "├─") + nodeName + " " + position) + newPrefix += if (newLast) " " else "│ " + for((index, child) in children.withIndex()) { + newLast = index == children.size - 1 + if(child is Node) { + child.pretty(newPrefix, newLast, false) + } else { + println(newPrefix + (if(newLast) "└ " else "├ ") + child) + } + } + } + + companion object { + val NONE = NoneNode() + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/NoneNode.kt b/src/main/kotlin/dsl/ast/model/node/NoneNode.kt new file mode 100644 index 0000000..2e6b39a --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/NoneNode.kt @@ -0,0 +1,7 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class NoneNode : Node(0, + TokenPosition.NONE +) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt new file mode 100644 index 0000000..d987904 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class NoteLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt new file mode 100644 index 0000000..39b3d5b --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class StringLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/TokenNode.kt b/src/main/kotlin/dsl/ast/model/node/TokenNode.kt new file mode 100644 index 0000000..c9f9229 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/TokenNode.kt @@ -0,0 +1,15 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.Token + +class TokenNode(_token: Token) : Node(1, _token.position) { + var type: Any + get() = children[0] + set(value) { + children[0] = value + } + + init { + type = _token + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/UnaryOperatorAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/UnaryOperatorAbstractNode.kt new file mode 100644 index 0000000..90bcd48 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/UnaryOperatorAbstractNode.kt @@ -0,0 +1,17 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +abstract class UnaryOperatorAbstractNode(position: TokenPosition) : Node(2, position) { + var operator: Any + get() = children[0] + set(value) { + children[0] = value + } + + var value: Any + get() = children[1] + set(_value) { + children[1] = _value + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/node/Node.kt b/src/main/kotlin/dsl/ast/node/Node.kt deleted file mode 100644 index 21f1b41..0000000 --- a/src/main/kotlin/dsl/ast/node/Node.kt +++ /dev/null @@ -1,36 +0,0 @@ -package dsl.ast.node - -import dsl.token.model.entity.TokenPosition - -class NoneNode : Node(0, TokenPosition.NONE) - -abstract class Node(numberOfChildren: Int, val position: TokenPosition) { - protected var children: Array = Array(numberOfChildren) { NONE } - - constructor(children: Array, position: TokenPosition) : this(children.size, position) { - this.children = children - } - - operator fun get(index: Int) = children[index] - - operator fun set(index: Int, value: Node) { - children[index] = value - } - - fun pretty(prefix: String = "", last: Boolean = true, first: Boolean = true) { - var newPrefix = prefix - var newLast = last - val newFirst = first - - println(newPrefix + (if (newFirst) "" else if (newLast) "└─" else "├─") + this::class.simpleName + " " + position) - newPrefix += if (newLast) " " else "│ " - for((index, child) in children.withIndex()) { - newLast = index == children.size - 1 - child.pretty(newPrefix, newLast, false) - } - } - - companion object { - val NONE = NoneNode() - } -} \ No newline at end of file