diff --git a/smnp/ast/node/map.py b/smnp/ast/node/map.py index 47784dd..e6afbef 100644 --- a/smnp/ast/node/map.py +++ b/smnp/ast/node/map.py @@ -1,4 +1,5 @@ from smnp.ast.node.atom import LiteralParser +from smnp.ast.node.identifier import IdentifierLiteralParser from smnp.ast.node.iterable import abstractIterableParser from smnp.ast.node.model import Node from smnp.ast.node.operator import BinaryOperator, Operator @@ -31,12 +32,15 @@ class Map(Node): def MapParser(input): from smnp.ast.node.expression import ExpressionParser - keyParser = LiteralParser + keyParser = Parser.oneOf( + LiteralParser, + IdentifierLiteralParser + ) valueParser = ExpressionParser mapEntryParser = Parser.allOf( keyParser, - Parser.terminal(TokenType.ARROW, createNode=Operator.withValue, doAssert=True), + Parser.terminal(TokenType.ARROW, createNode=Operator.withValue), Parser.doAssert(valueParser, "expression"), createNode=MapEntry.withValues ) diff --git a/smnp/runtime/evaluators/atom.py b/smnp/runtime/evaluators/atom.py index 7918900..d38df62 100644 --- a/smnp/runtime/evaluators/atom.py +++ b/smnp/runtime/evaluators/atom.py @@ -3,7 +3,7 @@ from smnp.ast.node.identifier import Identifier 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.runtime.evaluator import Evaluator, EvaluationResult from smnp.runtime.evaluators.expression import expressionEvaluator from smnp.runtime.evaluators.float import FloatEvaluator from smnp.runtime.evaluators.iterable import abstractIterableEvaluator @@ -59,12 +59,15 @@ class MapEvaluator(Evaluator): @classmethod def evaluator(cls, node, environment): map = {} - exprEvaluator = expressionEvaluator(doAssert=True) + keyEvaluator = Evaluator.oneOf( + Evaluator.forNodes(lambda node, environment: EvaluationResult.OK(Type.string(node.value)), Identifier), + expressionEvaluator(doAssert=True) + ) for entry in node.children: - key = exprEvaluator(entry.key, environment).value + key = keyEvaluator(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 + map[key] = expressionEvaluator(doAssert=True)(entry.value, environment).value return Type.map(map) diff --git a/smnp/runtime/evaluators/map.py b/smnp/runtime/evaluators/map.py deleted file mode 100644 index f1596f8..0000000 --- a/smnp/runtime/evaluators/map.py +++ /dev/null @@ -1,19 +0,0 @@ -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 - - -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) \ No newline at end of file