From 6a3bc0de604f30fb41e7053fd2529b750923d2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 13 Mar 2020 17:29:02 +0100 Subject: [PATCH] Add string iterator type to loop --- .../evaluation/evaluator/LoopEvaluator.kt | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/io/smnp/evaluation/evaluator/LoopEvaluator.kt b/app/src/main/kotlin/io/smnp/evaluation/evaluator/LoopEvaluator.kt index 46b15c2..583b308 100644 --- a/app/src/main/kotlin/io/smnp/evaluation/evaluator/LoopEvaluator.kt +++ b/app/src/main/kotlin/io/smnp/evaluation/evaluator/LoopEvaluator.kt @@ -22,11 +22,12 @@ class LoopEvaluator : Evaluator() { environment.pushScope() val output = when (iterator.type) { INT -> evaluateForInt(iterator, parametersNode, statementNode, filterNode, environment) + STRING -> evaluateForString(iterator, parametersNode, statementNode, filterNode, environment) LIST -> evaluateForList(iterator, parametersNode, statementNode, filterNode, environment) MAP -> evaluateForMap(iterator, parametersNode, statementNode, filterNode, environment) BOOL -> evaluateForBool(iteratorNode, parametersNode, statementNode, filterNode, environment) else -> throw EvaluationException( - "Expected for-loop with int iterator or foreach-loop with list or map iterator or while-loop with bool iterator, found ${iterator.type.name.toLowerCase()}", + "Expected for-loop with int iterator or foreach-loop with string, list or map iterator or while-loop with bool iterator, found ${iterator.type.name.toLowerCase()}", iteratorNode.position ) } @@ -55,6 +56,29 @@ class LoopEvaluator : Evaluator() { } } + private fun evaluateForString( + iterator: Value, + parametersNode: Node, + statementNode: Node, + filterNode: Node, + environment: Environment + ): EvaluatorOutput { + return output { outputs -> + var index = 0 + (iterator.value as String).forEach { + parameters(parametersNode, + { id -> environment.setVariable(id, Value.string(it.toString())) }, + { id -> environment.setVariable(id, Value.int(index)) } + ) + + if(filter(filterNode, environment)) { + outputs.add(defaultEvaluator.evaluate(statementNode, environment)) + index++ + } + } + } + } + private fun evaluateForList( iterator: Value, parametersNode: Node,