Reformat evaluator #1
This commit is contained in:
48
smnp/runtime/evaluators/asterisk.py
Normal file
48
smnp/runtime/evaluators/asterisk.py
Normal file
@@ -0,0 +1,48 @@
|
||||
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]["__"]
|
||||
Reference in New Issue
Block a user