From 5cd0b47415f506a52665dd65f91c42f3dc437d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 17:39:10 +0100 Subject: [PATCH] Refactor Node to refer other Nodes instead of Any --- .../kotlin/dsl/ast/model/node/AtomAbstractNode.kt | 10 ++++------ .../ast/model/node/BinaryOperatorAbstractNode.kt | 6 +++--- src/main/kotlin/dsl/ast/model/node/BlockNode.kt | 2 +- .../kotlin/dsl/ast/model/node/ConditionNode.kt | 6 +++--- src/main/kotlin/dsl/ast/model/node/Node.kt | 15 ++++++--------- src/main/kotlin/dsl/ast/model/node/ReturnNode.kt | 2 +- src/main/kotlin/dsl/ast/model/node/ThrowNode.kt | 2 +- src/main/kotlin/dsl/ast/model/node/TokenNode.kt | 9 +-------- .../ast/model/node/UnaryOperatorAbstractNode.kt | 4 ++-- src/main/kotlin/dsl/ast/parser/AtomParser.kt | 1 + 10 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt index bcaebae..c03cdfb 100644 --- a/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt @@ -2,12 +2,10 @@ package dsl.ast.model.node import dsl.token.model.entity.Token -abstract class AtomAbstractNode(token: Token) : Node(1, token.position) { - val value: Any - get() = children[0] - - init { - children[0] = token.value +abstract class AtomAbstractNode(val token: Token) : Node(1, token.position) { + override fun pretty(prefix: String, last: Boolean, first: Boolean) { + println(prefix + (if (first) "" else if (last) "└─" else "├─") + this::class.simpleName + " " + position) + println(prefix + (if (last) " " else "│ ") + "└ " + token) } } diff --git a/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt index d99cf4c..ec5d5d7 100644 --- a/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/BinaryOperatorAbstractNode.kt @@ -1,13 +1,13 @@ package dsl.ast.model.node abstract class BinaryOperatorAbstractNode(lhs: Node, operator: Node, rhs: Node) : Node(3, operator.position) { - val lhs: Any + val lhs: Node get() = children[0] - val operator: Any + val operator: Node get() = children[1] - val rhs: Any + val rhs: Node get() = children[2] init { diff --git a/src/main/kotlin/dsl/ast/model/node/BlockNode.kt b/src/main/kotlin/dsl/ast/model/node/BlockNode.kt index 6cb4ffd..c6129f2 100644 --- a/src/main/kotlin/dsl/ast/model/node/BlockNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/BlockNode.kt @@ -1,7 +1,7 @@ package dsl.ast.model.node class BlockNode(begin: Node, statements: List, end: Node) : Node(statements, begin.position) { - val statements: List + val statements: List get() = children init { diff --git a/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt b/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt index cf08bb0..8f9a691 100644 --- a/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt @@ -1,13 +1,13 @@ package dsl.ast.model.node class ConditionNode(trueBranchToken: Node, condition: Node, trueBranch: Node, falseBranchToken: Node, falseBranch: Node) : Node(3, trueBranchToken.position) { - val condition: Any + val condition: Node get() = children[0] - val trueBranch: Any + val trueBranch: Node get() = children[1] - val falseBranch: Any + val falseBranch: Node get() = children[2] init { diff --git a/src/main/kotlin/dsl/ast/model/node/Node.kt b/src/main/kotlin/dsl/ast/model/node/Node.kt index 53a5cd0..ed6f5a8 100644 --- a/src/main/kotlin/dsl/ast/model/node/Node.kt +++ b/src/main/kotlin/dsl/ast/model/node/Node.kt @@ -3,20 +3,20 @@ package dsl.ast.model.node import dsl.token.model.entity.TokenPosition abstract class Node(numberOfChildren: Int, val position: TokenPosition) { - var children: MutableList = MutableList(numberOfChildren) { NONE } + var children: MutableList = MutableList(numberOfChildren) { NONE } protected set - constructor(children: List, position: TokenPosition) : this(children.size, position) { + 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) { + operator fun set(index: Int, value: Node) { children[index] = value } - fun pretty(prefix: String = "", last: Boolean = true, first: Boolean = true) { + open fun pretty(prefix: String = "", last: Boolean = true, first: Boolean = true) { var newPrefix = prefix var newLast = last val nodeName = this::class.simpleName ?: "" @@ -25,11 +25,8 @@ abstract class Node(numberOfChildren: Int, val position: TokenPosition) { 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) - } + child.pretty(newPrefix, newLast, false) + //println(newPrefix + (if (newLast) "└ " else "├ ") + child) // todo move to atom nodes } } diff --git a/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt b/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt index 9ed9b06..7f26c7f 100644 --- a/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt @@ -1,7 +1,7 @@ package dsl.ast.model.node class ReturnNode(value: Node) : Node(1, value.position) { - val value: Any + val value: Node get() = children[0] init { diff --git a/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt b/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt index 6ebce01..24ab343 100644 --- a/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt @@ -1,7 +1,7 @@ package dsl.ast.model.node class ThrowNode(value: Node) : Node(1, value.position) { - val value: Any + val value: Node get() = children[0] init { diff --git a/src/main/kotlin/dsl/ast/model/node/TokenNode.kt b/src/main/kotlin/dsl/ast/model/node/TokenNode.kt index 5402bd9..3b1f4ed 100644 --- a/src/main/kotlin/dsl/ast/model/node/TokenNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/TokenNode.kt @@ -2,11 +2,4 @@ package dsl.ast.model.node import dsl.token.model.entity.Token -class TokenNode(token: Token) : Node(1, token.position) { - val token: Any - get() = children[0] - - init { - children[0] = token - } -} \ No newline at end of file +class TokenNode(token: Token) : AtomAbstractNode(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 index 327afe0..bcac202 100644 --- a/src/main/kotlin/dsl/ast/model/node/UnaryOperatorAbstractNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/UnaryOperatorAbstractNode.kt @@ -1,10 +1,10 @@ package dsl.ast.model.node abstract class UnaryOperatorAbstractNode(operator: Node, operand: Node) : Node(2, operator.position) { - val operator: Any + val operator: Node get() = children[0] - val operand: Any + val operand: Node get() = children[1] init { diff --git a/src/main/kotlin/dsl/ast/parser/AtomParser.kt b/src/main/kotlin/dsl/ast/parser/AtomParser.kt index 1f07101..67e752e 100644 --- a/src/main/kotlin/dsl/ast/parser/AtomParser.kt +++ b/src/main/kotlin/dsl/ast/parser/AtomParser.kt @@ -15,6 +15,7 @@ class AtomParser : Parser() { ) { it[1] } + val literalParser = oneOf( listOf( parenthesesParser,