Create new type: map (dictionary) with all support for it
This commit is contained in:
@@ -4,6 +4,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.runtime.tools import updatePos
|
||||
|
||||
|
||||
class AccessEvaluator(Evaluator):
|
||||
@@ -20,8 +21,11 @@ class AccessEvaluator(Evaluator):
|
||||
raise RuntimeException(f"Unknown property '{right.value}' of type '{left.type.name.lower()}'", right.pos)
|
||||
|
||||
if type(right) == FunctionCallNode:
|
||||
arguments = abstractIterableEvaluator(expressionEvaluator(True))(right.arguments, environment)
|
||||
return environment.invokeMethod(left, right.name.value, arguments)
|
||||
try:
|
||||
arguments = abstractIterableEvaluator(expressionEvaluator(True))(right.arguments, environment)
|
||||
return environment.invokeMethod(left, right.name.value, arguments)
|
||||
except RuntimeException as e:
|
||||
raise updatePos(e, right)
|
||||
|
||||
#
|
||||
# def evaluateAccess(access, environment):
|
||||
|
||||
@@ -5,6 +5,7 @@ from smnp.ast.node.identifier import IdentifierNode
|
||||
from smnp.ast.node.integer import IntegerLiteralNode
|
||||
from smnp.ast.node.invocation import FunctionCallNode
|
||||
from smnp.ast.node.list import ListNode
|
||||
from smnp.ast.node.map import MapNode
|
||||
from smnp.ast.node.note import NoteLiteralNode
|
||||
from smnp.ast.node.string import StringLiteralNode
|
||||
from smnp.error.runtime import RuntimeException
|
||||
@@ -24,6 +25,7 @@ def expressionEvaluator(doAssert=False):
|
||||
from smnp.runtime.evaluators.access import AccessEvaluator
|
||||
from smnp.runtime.evaluators.assignment import AssignmentEvaluator
|
||||
from smnp.runtime.evaluators.asterisk import AsteriskEvaluator
|
||||
from smnp.runtime.evaluators.map import MapEvaluator
|
||||
result = Evaluator.oneOf(
|
||||
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode),
|
||||
Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode),
|
||||
@@ -33,7 +35,8 @@ def expressionEvaluator(doAssert=False):
|
||||
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
|
||||
Evaluator.forNodes(AccessEvaluator.evaluate, AccessNode),
|
||||
Evaluator.forNodes(AssignmentEvaluator.evaluate, AssignmentNode),
|
||||
Evaluator.forNodes(AsteriskEvaluator.evaluate, AsteriskNode)
|
||||
Evaluator.forNodes(AsteriskEvaluator.evaluate, AsteriskNode),
|
||||
Evaluator.forNodes(MapEvaluator.evaluate, MapNode)
|
||||
)(node, environment)
|
||||
|
||||
if doAssert and result.result and result.value.type == Type.VOID:
|
||||
|
||||
@@ -6,6 +6,7 @@ from smnp.library.signature import signature, listOfMatchers, ofType
|
||||
from smnp.runtime.evaluator import Evaluator, evaluate
|
||||
from smnp.runtime.evaluators.expression import expressionEvaluator
|
||||
from smnp.runtime.evaluators.iterable import abstractIterableEvaluator
|
||||
from smnp.runtime.tools import updatePos
|
||||
from smnp.type.model import Type
|
||||
|
||||
|
||||
@@ -13,9 +14,12 @@ class FunctionCallEvaluator(Evaluator):
|
||||
|
||||
@classmethod
|
||||
def evaluator(cls, node, environment):
|
||||
name = node.name.value
|
||||
arguments = abstractIterableEvaluator(expressionEvaluator(True))(node.arguments, environment)
|
||||
return environment.invokeFunction(name, arguments)
|
||||
try:
|
||||
name = node.name.value
|
||||
arguments = abstractIterableEvaluator(expressionEvaluator(True))(node.arguments, environment)
|
||||
return environment.invokeFunction(name, arguments)
|
||||
except RuntimeException as e:
|
||||
raise updatePos(e, node)
|
||||
|
||||
|
||||
class FunctionDefinitionEvaluator(Evaluator):
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from smnp.error.runtime import RuntimeException
|
||||
from smnp.runtime.evaluator import Evaluator
|
||||
from smnp.runtime.tools import updatePos
|
||||
|
||||
|
||||
class IdentifierEvaluator(Evaluator):
|
||||
@@ -9,5 +10,4 @@ class IdentifierEvaluator(Evaluator):
|
||||
try:
|
||||
return environment.findVariable(node.value)
|
||||
except RuntimeException as e:
|
||||
e.pos = node.pos
|
||||
raise e
|
||||
raise updatePos(e, node)
|
||||
|
||||
11
smnp/runtime/evaluators/map.py
Normal file
11
smnp/runtime/evaluators/map.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from smnp.runtime.evaluator import Evaluator, evaluate
|
||||
from smnp.type.model import Type
|
||||
|
||||
|
||||
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)))
|
||||
Reference in New Issue
Block a user