diff --git a/smnp/runtime/evaluators/atom.py b/smnp/runtime/evaluators/atom.py index 890183a..9ee3733 100644 --- a/smnp/runtime/evaluators/atom.py +++ b/smnp/runtime/evaluators/atom.py @@ -1,4 +1,7 @@ +from smnp.error.runtime import RuntimeException from smnp.runtime.evaluator import Evaluator +from smnp.runtime.evaluators.expression import expressionEvaluator +from smnp.runtime.evaluators.iterable import abstractIterableEvaluator from smnp.type.model import Type @@ -34,4 +37,27 @@ class TypeEvaluator(Evaluator): @classmethod def evaluator(cls, node, environment): - return Type.type(node.value) \ No newline at end of file + return Type.type(node.value) + + +class ListEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + list = abstractIterableEvaluator(expressionEvaluator(doAssert=True))(node, environment) + return Type.list(list) + + +class MapEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + map = {} + exprEvaluator = expressionEvaluator(doAssert=True) + for entry in node.children: + key = exprEvaluator(entry.key, environment).value + if key in map: + raise RuntimeException(f"Duplicated key '{key.stringify()}' found in map", entry.pos) + map[key] = exprEvaluator(entry.value, environment).value + + return Type.map(map) diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index 3d78dcb..117f804 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -1,5 +1,7 @@ from smnp.ast.node.atom import StringLiteral, IntegerLiteral, NoteLiteral, BoolLiteral, TypeLiteral from smnp.ast.node.identifier import FunctionCall +from smnp.ast.node.list import List +from smnp.ast.node.map import Map from smnp.error.runtime import RuntimeException from smnp.runtime.evaluator import Evaluator from smnp.type.model import Type @@ -14,6 +16,8 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.atom import BoolEvaluator from smnp.runtime.evaluators.function import FunctionCallEvaluator + from smnp.runtime.evaluators.atom import ListEvaluator + from smnp.runtime.evaluators.atom import MapEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall), Evaluator.forNodes(StringEvaluator.evaluate, StringLiteral), @@ -21,6 +25,8 @@ def expressionEvaluator(doAssert=False): Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteral), Evaluator.forNodes(BoolEvaluator.evaluate, BoolLiteral), Evaluator.forNodes(TypeEvaluator.evaluate, TypeLiteral), + Evaluator.forNodes(ListEvaluator.evaluate, List), + Evaluator.forNodes(MapEvaluator.evaluate, Map) # Evaluator.forNodes(IdentifierEvaluator.evaluate, Identifier), # Evaluator.forNodes(ListEvaluator.evaluate, List), # Evaluator.forNodes(AccessEvaluator.evaluate, LeftAssociativeOperatorNode),