From b603c9f2c5a9005cd550d02c8d839a1ba421edfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 13 Mar 2020 10:04:55 +0100 Subject: [PATCH] Improve import parser and evaluator --- .../io/smnp/dsl/ast/model/node/ImportNode.kt | 10 ++----- .../io/smnp/dsl/ast/parser/ImportParser.kt | 30 ++++++++++++------- .../evaluation/evaluator/ImportEvaluator.kt | 23 +------------- 3 files changed, 23 insertions(+), 40 deletions(-) diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/model/node/ImportNode.kt b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/ImportNode.kt index 4862af0..cabad5d 100644 --- a/app/src/main/kotlin/io/smnp/dsl/ast/model/node/ImportNode.kt +++ b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/ImportNode.kt @@ -2,11 +2,7 @@ package io.smnp.dsl.ast.model.node import io.smnp.dsl.token.model.entity.TokenPosition -class ImportNode(path: Node, position: TokenPosition) : Node(1, position) { - val path: Node - get() = children[0] - - init { - children[0] = path - } +class ImportNode(path: List, position: TokenPosition) : Node(path, position) { + val path: List + get() = children } \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/parser/ImportParser.kt b/app/src/main/kotlin/io/smnp/dsl/ast/parser/ImportParser.kt index e583cb0..3437f5b 100644 --- a/app/src/main/kotlin/io/smnp/dsl/ast/parser/ImportParser.kt +++ b/app/src/main/kotlin/io/smnp/dsl/ast/parser/ImportParser.kt @@ -2,21 +2,29 @@ package io.smnp.dsl.ast.parser import io.smnp.dsl.ast.model.entity.ParserOutput import io.smnp.dsl.ast.model.node.ImportNode +import io.smnp.dsl.ast.model.node.Node import io.smnp.dsl.token.model.entity.TokenList import io.smnp.dsl.token.model.enumeration.TokenType class ImportParser : Parser() { - override fun tryToParse(input: TokenList): ParserOutput { - val pathParser = oneOf( - UnitParser(), + override fun tryToParse(input: TokenList): ParserOutput { + val pathParser = allOf( + SimpleIdentifierParser(), + optional(repeat(allOf( + terminal(TokenType.DOT), SimpleIdentifierParser() - ) + ) { (_, child) -> child }) { segments, position -> + object : Node(segments, position) {} + })) { (firstSegment, otherSegments) -> + object : Node(listOf(firstSegment) + otherSegments.children, firstSegment.position) {} + } - return allOf( - terminal(TokenType.IMPORT), - pathParser - ) { - ImportNode(it[1], it[0].position) - }.parse(input) - } + + return allOf( + terminal(TokenType.IMPORT), + pathParser + ) { (import, path) -> + ImportNode(path.children, import.position) + }.parse(input) + } } \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/evaluation/evaluator/ImportEvaluator.kt b/app/src/main/kotlin/io/smnp/evaluation/evaluator/ImportEvaluator.kt index a3758ab..cd9bda7 100644 --- a/app/src/main/kotlin/io/smnp/evaluation/evaluator/ImportEvaluator.kt +++ b/app/src/main/kotlin/io/smnp/evaluation/evaluator/ImportEvaluator.kt @@ -1,39 +1,18 @@ package io.smnp.evaluation.evaluator -import io.smnp.dsl.ast.model.node.AccessOperatorNode import io.smnp.dsl.ast.model.node.IdentifierNode import io.smnp.dsl.ast.model.node.ImportNode import io.smnp.dsl.ast.model.node.Node import io.smnp.environment.Environment -import io.smnp.error.ShouldNeverReachThisLineException import io.smnp.evaluation.model.entity.EvaluatorOutput class ImportEvaluator : Evaluator() { override fun supportedNodes() = listOf(ImportNode::class) override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput { - val path = when (val pathNode = (node as ImportNode).path) { - is AccessOperatorNode -> complexPath(pathNode).joinToString(".") - is IdentifierNode -> pathNode.token.rawValue - else -> throw ShouldNeverReachThisLineException() - } - + val path = (node as ImportNode).path.joinToString(".") { (it as IdentifierNode).token.rawValue } environment.loadModule(path) return EvaluatorOutput.ok() } - - private fun complexPath(segment: AccessOperatorNode): List { - val segments = mutableListOf() - val (lhs, _, rhs) = segment - - segments.add((rhs as IdentifierNode).token.rawValue) - - when(lhs) { - is AccessOperatorNode -> segments.addAll(complexPath(lhs)) - is IdentifierNode -> segments.add(lhs.token.rawValue) - } - - return segments.reversed() - } } \ No newline at end of file