Create evaluators for literals, list and identifier nodes

This commit is contained in:
Bartłomiej Pluta
2019-07-08 13:39:07 +02:00
parent fd9f240ce5
commit 6e42ac0f91
10 changed files with 166 additions and 53 deletions

View File

@@ -1,28 +1,25 @@
import re
from smnp.error.runtime import RuntimeException
from smnp.runtime.evaluator import Evaluator
from smnp.type.model import Type
from smnp.type.value import Value
def evaluateString(string, environment):
value = interpolate(string, environment)
return Value(Type.STRING, value)
class StringEvaluator(Evaluator):
@classmethod
def evaluator(cls, node, environment):
return Value(Type.STRING, node.value)
def interpolate(string, environment):
interpolated = string.value
for scope in reversed(environment.scopes):
for name, value in scope.items():
interpolated = interpolated.replace('{' + name + '}', value.stringify())
nonMatchedVariables = re.findall(r"\{\w+\}", interpolated)
if len(nonMatchedVariables) > 0:
raise RuntimeException(f"Variable '{nonMatchedVariables[0][1:len(nonMatchedVariables[0])-1]}' is not declared",
(string.pos[0], string.pos[1] + string.value.find(nonMatchedVariables[0])+1))
return interpolated
# or scope in reversed(environment.scopes):
# for k, v in scope.items():
# value = value.replace('{' + k + '}', v) #TODO: poprawic
# TODO: make use of complex interpreter for code inside '{' and '}'
# def interpolate(string, environment):
# interpolated = string.value
# for scope in reversed(environment.scopes):
# for name, value in scope.items():
# interpolated = interpolated.replace('{' + name + '}', value.stringify())
#
# nonMatchedVariables = re.findall(r"\{\w+\}", interpolated)
# if len(nonMatchedVariables) > 0:
# raise RuntimeException(f"Variable '{nonMatchedVariables[0][1:len(nonMatchedVariables[0])-1]}' is not declared",
# (string.pos[0], string.pos[1] + string.value.find(nonMatchedVariables[0])+1))
#
# return interpolated
#