48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
from smnp.ast.node.identifier import IdentifierNode
|
|
from smnp.runtime.evaluator import evaluate
|
|
from smnp.type.model import Type
|
|
from smnp.type.value import Value
|
|
|
|
|
|
def evaluateAsterisk(asterisk, environment):
|
|
iterator = evaluate(asterisk.iterator, environment)
|
|
if iterator.type == Type.INTEGER:
|
|
evaluateAsteriskForNumber(asterisk, environment, iterator)
|
|
|
|
if iterator.type == Type.LIST:
|
|
evaluateAsteriskForList(asterisk, environment, iterator)
|
|
|
|
|
|
|
|
def evaluateAsteriskForNumber(asterisk, environment, count):
|
|
for i in range(count.value):
|
|
if type(asterisk.iterator) == IdentifierNode:
|
|
environment.scopes[-1][f"_{asterisk.iterator.identifier}"] = Value(Type.INTEGER, i+1)
|
|
else:
|
|
environment.scopes[-1]["_"] = Value(Type.INTEGER, i+1)
|
|
|
|
evaluate(asterisk.statement, environment)
|
|
|
|
if type(asterisk.iterator) == IdentifierNode:
|
|
del environment.scopes[-1][f"_{asterisk.iterator.identifier}"]
|
|
else:
|
|
del environment.scopes[-1]["_"]
|
|
|
|
|
|
def evaluateAsteriskForList(asterisk, environment, list):
|
|
for i, v in enumerate(list.value):
|
|
if type(asterisk.iterator) == IdentifierNode:
|
|
environment.scopes[-1][f"_{asterisk.iterator.identifier}"] = Value(Type.INTEGER, i+1)
|
|
environment.scopes[-1][f"{asterisk.iterator.identifier}_"] = v
|
|
else:
|
|
environment.scopes[-1]["_"] = Value(Type.INTEGER, i+1)
|
|
environment.scopes[-1]["__"] = v
|
|
|
|
evaluate(asterisk.statement, environment)
|
|
|
|
if type(asterisk.iterator) == IdentifierNode:
|
|
del environment.scopes[-1][f"_{asterisk.iterator.identifier}"]
|
|
del environment.scopes[-1][f"{asterisk.iterator.identifier}_"]
|
|
else:
|
|
del environment.scopes[-1]["_"]
|
|
del environment.scopes[-1]["__"] |