Add string iterator type to loop
This commit is contained in:
@@ -22,11 +22,12 @@ class LoopEvaluator : Evaluator() {
|
|||||||
environment.pushScope()
|
environment.pushScope()
|
||||||
val output = when (iterator.type) {
|
val output = when (iterator.type) {
|
||||||
INT -> evaluateForInt(iterator, parametersNode, statementNode, filterNode, environment)
|
INT -> evaluateForInt(iterator, parametersNode, statementNode, filterNode, environment)
|
||||||
|
STRING -> evaluateForString(iterator, parametersNode, statementNode, filterNode, environment)
|
||||||
LIST -> evaluateForList(iterator, parametersNode, statementNode, filterNode, environment)
|
LIST -> evaluateForList(iterator, parametersNode, statementNode, filterNode, environment)
|
||||||
MAP -> evaluateForMap(iterator, parametersNode, statementNode, filterNode, environment)
|
MAP -> evaluateForMap(iterator, parametersNode, statementNode, filterNode, environment)
|
||||||
BOOL -> evaluateForBool(iteratorNode, parametersNode, statementNode, filterNode, environment)
|
BOOL -> evaluateForBool(iteratorNode, parametersNode, statementNode, filterNode, environment)
|
||||||
else -> throw EvaluationException(
|
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
|
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(
|
private fun evaluateForList(
|
||||||
iterator: Value,
|
iterator: Value,
|
||||||
parametersNode: Node,
|
parametersNode: Node,
|
||||||
|
|||||||
Reference in New Issue
Block a user