From 578141c7b839c2b111a732568f5dad1011552112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Wed, 10 Jul 2019 14:08:28 +0200 Subject: [PATCH] Add support for evaluating BOOL and introduce basic logical operators as functions --- smnp/library/loader.py | 6 ++++-- smnp/module/iterable/function/get.py | 2 +- smnp/module/iterable/function/map.py | 4 ++-- smnp/runtime/evaluators/bool.py | 9 +++++++++ smnp/runtime/evaluators/expression.py | 3 +++ smnp/type/model.py | 4 ++++ 6 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 smnp/runtime/evaluators/bool.py diff --git a/smnp/library/loader.py b/smnp/library/loader.py index 37eac21..673eb89 100644 --- a/smnp/library/loader.py +++ b/smnp/library/loader.py @@ -4,6 +4,8 @@ from smnp.program.interpreter import Interpreter def loadStandardLibrary(): - source = resource_string('smnp.library.code', 'main.mus').decode("utf-8") - return Interpreter.interpretString(source) + mainSource = resource_string('smnp.library.code', 'main.mus').decode("utf-8") + boolSource = resource_string('smnp.library.code', 'bool.mus').decode("utf-8") + env = Interpreter.interpretString(mainSource) + return Interpreter.interpretString(boolSource, baseEnvironment=env) diff --git a/smnp/module/iterable/function/get.py b/smnp/module/iterable/function/get.py index 30b5409..3381e68 100644 --- a/smnp/module/iterable/function/get.py +++ b/smnp/module/iterable/function/get.py @@ -12,7 +12,7 @@ def _function1(env, list, index): raise RuntimeException(f"Attempt to access item which is outside the list", None) -_signature2 = signature(ofType(Type.MAP), ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE)) +_signature2 = signature(ofType(Type.MAP), ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE)) def _function2(env, map, key): try: return map.value[key] diff --git a/smnp/module/iterable/function/map.py b/smnp/module/iterable/function/map.py index 7d27b5c..b65e6eb 100644 --- a/smnp/module/iterable/function/map.py +++ b/smnp/module/iterable/function/map.py @@ -4,7 +4,7 @@ from smnp.type.model import Type from smnp.type.signature.matcher.list import listOfMatchers, listMatches from smnp.type.signature.matcher.type import allTypes, ofTypes -_signature1 = varargSignature(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE), allTypes())) +_signature1 = varargSignature(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE), allTypes())) def _function1(env, vararg): map = {} for entry in vararg: @@ -14,7 +14,7 @@ def _function1(env, vararg): return Type.map(map) -_signature2 = signature(listOfMatchers(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE), allTypes()))) +_signature2 = signature(listOfMatchers(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE), allTypes()))) def _function2(env, list): map = {} for entry in list.value: diff --git a/smnp/runtime/evaluators/bool.py b/smnp/runtime/evaluators/bool.py new file mode 100644 index 0000000..66e624c --- /dev/null +++ b/smnp/runtime/evaluators/bool.py @@ -0,0 +1,9 @@ +from smnp.runtime.evaluator import Evaluator +from smnp.type.model import Type + + +class BoolEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + return Type.bool(node.value) \ No newline at end of file diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index fee2031..7dc0e51 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -1,6 +1,7 @@ from smnp.ast.node.access import AccessNode from smnp.ast.node.assignment import AssignmentNode from smnp.ast.node.asterisk import AsteriskNode +from smnp.ast.node.bool import BoolLiteralNode from smnp.ast.node.identifier import IdentifierNode from smnp.ast.node.integer import IntegerLiteralNode from smnp.ast.node.invocation import FunctionCallNode @@ -28,11 +29,13 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.asterisk import AsteriskEvaluator from smnp.runtime.evaluators.map import MapEvaluator from smnp.runtime.evaluators.type import TypeEvaluator + from smnp.runtime.evaluators.bool import BoolEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode), Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode), Evaluator.forNodes(IntegerEvaluator.evaluate, IntegerLiteralNode), Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteralNode), + Evaluator.forNodes(BoolEvaluator.evaluate, BoolLiteralNode), Evaluator.forNodes(TypeEvaluator.evaluate, TypeNode), Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode), Evaluator.forNodes(ListEvaluator.evaluate, ListNode), diff --git a/smnp/type/model.py b/smnp/type/model.py index 1d42e15..dc42a28 100644 --- a/smnp/type/model.py +++ b/smnp/type/model.py @@ -54,6 +54,10 @@ class Type(Enum): "dot": Type.string('.' if value.dot else '') }) + @staticmethod + def bool(value): + return Value(Type.BOOL, value, {}) + @staticmethod def sound(value): return Value(Type.SOUND, value, {