diff --git a/smnp/ast/node/statement.py b/smnp/ast/node/statement.py index eec2cff..3405c79 100644 --- a/smnp/ast/node/statement.py +++ b/smnp/ast/node/statement.py @@ -11,7 +11,7 @@ class StatementNode(Node): from smnp.ast.node.ret import ReturnNode return Parser.oneOf( + ExpressionNode.parse, BlockNode.parse, ReturnNode.parse, - ExpressionNode.parse )(input) \ No newline at end of file diff --git a/smnp/runtime/evaluators/map.py b/smnp/runtime/evaluators/map.py index c3e2ca3..f1596f8 100644 --- a/smnp/runtime/evaluators/map.py +++ b/smnp/runtime/evaluators/map.py @@ -1,4 +1,6 @@ -from smnp.runtime.evaluator import Evaluator, evaluate +from smnp.error.runtime import RuntimeException +from smnp.runtime.evaluator import Evaluator +from smnp.runtime.evaluators.expression import expressionEvaluator from smnp.type.model import Type @@ -6,6 +8,12 @@ class MapEvaluator(Evaluator): @classmethod def evaluator(cls, node, environment): - keys = [ evaluate(entry.key, environment).value for entry in node.children ] - values = [ evaluate(entry.value, environment).value for entry in node.children ] - return Type.map(dict(zip(keys, values))) \ No newline at end of file + 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) \ No newline at end of file