diff options
Diffstat (limited to 'ql/ast/nodes')
62 files changed, 544 insertions, 0 deletions
diff --git a/ql/ast/nodes/__pycache__/base.cpython-35.pyc b/ql/ast/nodes/__pycache__/base.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..d1f8e50 --- /dev/null +++ b/ql/ast/nodes/__pycache__/base.cpython-35.pyc diff --git a/ql/ast/nodes/base.py b/ql/ast/nodes/base.py new file mode 100644 index 0000000..d9196f9 --- /dev/null +++ b/ql/ast/nodes/base.py @@ -0,0 +1,10 @@ +class BaseNode: + def __init__(self, metadata): + self.__metadata = metadata + + def accept(self, visitor): + visitor.visit(self) + + @property + def metadata(self): + return self.__metadata diff --git a/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc b/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..84ede5c --- /dev/null +++ b/ql/ast/nodes/expressions/__pycache__/expression.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc b/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..b4ff8dc --- /dev/null +++ b/ql/ast/nodes/expressions/__pycache__/variable.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..bbc8130 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/addition_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..f004296 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/and_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..18d3fc0 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/binary_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9cd8e0a --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/division_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..5d48766 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..888c85c --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..be0e395 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/greater_than_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..b7e8155 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..850a39c --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/less_than_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..ff0e1ab --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/multiplication_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..fe666cf --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/not_equals_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..0b81fc3 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/or_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc b/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..cd89879 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/__pycache__/subtraction_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/binary_operators/addition_operator.py b/ql/ast/nodes/expressions/binary_operators/addition_operator.py new file mode 100644 index 0000000..d6e4506 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/addition_operator.py @@ -0,0 +1,27 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class AdditionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(AdditionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLMoney): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value + self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/and_operator.py b/ql/ast/nodes/expressions/binary_operators/and_operator.py new file mode 100644 index 0000000..5981a6b --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/and_operator.py @@ -0,0 +1,21 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class AndOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(AndOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLBoolean, QLBoolean): QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value and self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/binary_operator.py b/ql/ast/nodes/expressions/binary_operators/binary_operator.py new file mode 100644 index 0000000..048d927 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/binary_operator.py @@ -0,0 +1,17 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class BinaryOperatorNode(ExpressionNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(BinaryOperatorNode, self).__init__(metadata, expression_type, value) + self.__left_expression = left_expression + self.__right_expression = right_expression + + @property + def left_expression(self): + return self.__left_expression + + @property + def right_expression(self): + return self.__right_expression + diff --git a/ql/ast/nodes/expressions/binary_operators/division_operator.py b/ql/ast/nodes/expressions/binary_operators/division_operator.py new file mode 100644 index 0000000..16d5063 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/division_operator.py @@ -0,0 +1,31 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class DivisionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(DivisionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLDecimal, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLDecimal): QLMoney, + (QLMoney, QLInteger): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + try: + self.value = self.left_expression.value / self.right_expression.value + except ZeroDivisionError: + self.value = QLUndefined() diff --git a/ql/ast/nodes/expressions/binary_operators/equals_operator.py b/ql/ast/nodes/expressions/binary_operators/equals_operator.py new file mode 100644 index 0000000..21315f9 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/equals_operator.py @@ -0,0 +1,15 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean + + +class EqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(EqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + + @staticmethod + def get_result_type(): + return QLBoolean + + def evaluate(self): + self.value = self.left_expression.value == self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py new file mode 100644 index 0000000..0512688 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/greater_equals_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class GreaterEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(GreaterEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value >= self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py b/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py new file mode 100644 index 0000000..460c909 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/greater_than_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class GreaterThanOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(GreaterThanOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value > self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py new file mode 100644 index 0000000..f5b86df --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/less_equals_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class LessEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(LessEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value <= self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/less_than_operator.py b/ql/ast/nodes/expressions/binary_operators/less_than_operator.py new file mode 100644 index 0000000..65b456d --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/less_than_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.date import QLDate +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class LessThanOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(LessThanOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = [ + (QLDate, QLDate), + (QLDecimal, QLDecimal), + (QLDecimal, QLInteger), + (QLInteger, QLInteger), + (QLInteger, QLDecimal), + (QLMoney, QLMoney), + ] + + def get_result_type(self): + if (self.left_expression.expression_type, self.right_expression.expression_type) in self.__valid_types: + return QLBoolean + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value < self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py b/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py new file mode 100644 index 0000000..b014c0e --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/multiplication_operator.py @@ -0,0 +1,30 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class MultiplicationOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(MultiplicationOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLDecimal, QLMoney): QLMoney, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLInteger, QLMoney): QLMoney, + (QLMoney, QLDecimal): QLMoney, + (QLMoney, QLInteger): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value * self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py b/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py new file mode 100644 index 0000000..3be2e5f --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/not_equals_operator.py @@ -0,0 +1,15 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean + + +class NotEqualsOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(NotEqualsOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + + @staticmethod + def get_result_type(): + return QLBoolean + + def evaluate(self): + self.value = self.left_expression.value != self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/or_operator.py b/ql/ast/nodes/expressions/binary_operators/or_operator.py new file mode 100644 index 0000000..4314868 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/or_operator.py @@ -0,0 +1,21 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class OrOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(OrOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLBoolean, QLBoolean): QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value or self.right_expression.value diff --git a/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py b/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py new file mode 100644 index 0000000..8ebda15 --- /dev/null +++ b/ql/ast/nodes/expressions/binary_operators/subtraction_operator.py @@ -0,0 +1,27 @@ +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class SubtractionOperatorNode(BinaryOperatorNode): + def __init__(self, metadata, expression_type, left_expression, right_expression, value): + super(SubtractionOperatorNode, self).__init__(metadata, expression_type, + left_expression, right_expression, value) + self.__valid_types = { + (QLDecimal, QLDecimal): QLDecimal, + (QLDecimal, QLInteger): QLDecimal, + (QLInteger, QLInteger): QLInteger, + (QLInteger, QLDecimal): QLDecimal, + (QLMoney, QLMoney): QLMoney, + } + + def get_result_type(self): + if self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)): + return self.__valid_types.get((self.left_expression.expression_type, self.right_expression.expression_type)) + + return QLUndefined + + def evaluate(self): + self.value = self.left_expression.value - self.right_expression.value diff --git a/ql/ast/nodes/expressions/expression.py b/ql/ast/nodes/expressions/expression.py new file mode 100644 index 0000000..1364c0b --- /dev/null +++ b/ql/ast/nodes/expressions/expression.py @@ -0,0 +1,24 @@ +from ql.ast.nodes.base import BaseNode + + +class ExpressionNode(BaseNode): + def __init__(self, metadata, expression_type, value): + super(ExpressionNode, self).__init__(metadata) + self.__expression_type = expression_type + self.__value = value + + @property + def expression_type(self): + return self.__expression_type + + @expression_type.setter + def expression_type(self, value): + self.__expression_type = value + + @property + def value(self): + return self.__value + + @value.setter + def value(self, value): + self.__value = value diff --git a/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..a6d43b1 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/boolean_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..33abf57 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/date_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..145ab16 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/decimal_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..33f5c62 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/integer_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..98af8e6 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9dbf5d0 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/money_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..dbb3f72 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/string_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc b/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..73ce02b --- /dev/null +++ b/ql/ast/nodes/expressions/literals/__pycache__/undefined_literal.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/literals/boolean_literal.py b/ql/ast/nodes/expressions/literals/boolean_literal.py new file mode 100644 index 0000000..234e548 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/boolean_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class BooleanNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(BooleanNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/date_literal.py b/ql/ast/nodes/expressions/literals/date_literal.py new file mode 100644 index 0000000..971ab58 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/date_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class DateNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(DateNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/decimal_literal.py b/ql/ast/nodes/expressions/literals/decimal_literal.py new file mode 100644 index 0000000..7cc4eb5 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/decimal_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class DecimalNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(DecimalNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/integer_literal.py b/ql/ast/nodes/expressions/literals/integer_literal.py new file mode 100644 index 0000000..36923f9 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/integer_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class IntegerNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(IntegerNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/literal.py b/ql/ast/nodes/expressions/literals/literal.py new file mode 100644 index 0000000..a0e03ae --- /dev/null +++ b/ql/ast/nodes/expressions/literals/literal.py @@ -0,0 +1,14 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class LiteralNode(ExpressionNode): + def __init__(self, metadata, expression_type, value): + super(LiteralNode, self).__init__(metadata, expression_type, value) + + @ExpressionNode.expression_type.setter + def expression_type(self, unused): + pass + + @ExpressionNode.value.setter + def value(self, unused): + pass diff --git a/ql/ast/nodes/expressions/literals/money_literal.py b/ql/ast/nodes/expressions/literals/money_literal.py new file mode 100644 index 0000000..119e5ff --- /dev/null +++ b/ql/ast/nodes/expressions/literals/money_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class MoneyNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(MoneyNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/string_literal.py b/ql/ast/nodes/expressions/literals/string_literal.py new file mode 100644 index 0000000..4fac895 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/string_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class StringNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(StringNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/literals/undefined_literal.py b/ql/ast/nodes/expressions/literals/undefined_literal.py new file mode 100644 index 0000000..4109df6 --- /dev/null +++ b/ql/ast/nodes/expressions/literals/undefined_literal.py @@ -0,0 +1,6 @@ +from ql.ast.nodes.expressions.literals.literal import LiteralNode + + +class UndefinedNode(LiteralNode): + def __init__(self, metadata, expression_type, value): + super(UndefinedNode, self).__init__(metadata, expression_type, value) diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..9a6e409 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/negation_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..45ad495 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/negative_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc b/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..f72b4f0 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/__pycache__/unary_operator.cpython-35.pyc diff --git a/ql/ast/nodes/expressions/unary_operators/negation_operator.py b/ql/ast/nodes/expressions/unary_operators/negation_operator.py new file mode 100644 index 0000000..7b6b0c5 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/negation_operator.py @@ -0,0 +1,20 @@ +from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode +from ql.types.boolean import QLBoolean +from ql.types.undefined import QLUndefined + + +class NegationOperatorNode(UnaryOperatorNode): + def __init__(self, metadata, expression_type, expression, value): + super(NegationOperatorNode, self).__init__(metadata, expression_type, expression, value) + self.__valid_types = { + QLBoolean: QLBoolean, + } + + def get_result_type(self): + if self.__valid_types.get(self.expression.expression_type): + return self.__valid_types.get(self.expression.expression_type) + + return QLUndefined + + def evaluate(self): + self.value = QLBoolean(not self.expression.value) diff --git a/ql/ast/nodes/expressions/unary_operators/negative_operator.py b/ql/ast/nodes/expressions/unary_operators/negative_operator.py new file mode 100644 index 0000000..359ed2e --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/negative_operator.py @@ -0,0 +1,23 @@ +from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode +from ql.types.decimal import QLDecimal +from ql.types.integer import QLInteger +from ql.types.money import QLMoney +from ql.types.undefined import QLUndefined + + +class NegativeOperatorNode(UnaryOperatorNode): + def __init__(self, metadata, expression_type, expression, value): + super(NegativeOperatorNode, self).__init__(metadata, expression_type, expression, value) + self.__valid_types = { + QLDecimal: QLDecimal, + QLInteger: QLInteger, + QLMoney: QLMoney} + + def get_result_type(self): + if self.__valid_types.get(self.expression.expression_type): + return self.__valid_types.get(self.expression.expression_type) + + return QLUndefined + + def evaluate(self): + self.value = -self.expression.value diff --git a/ql/ast/nodes/expressions/unary_operators/unary_operator.py b/ql/ast/nodes/expressions/unary_operators/unary_operator.py new file mode 100644 index 0000000..fa75249 --- /dev/null +++ b/ql/ast/nodes/expressions/unary_operators/unary_operator.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class UnaryOperatorNode(ExpressionNode): + def __init__(self, metadata, expression_type, expression, value): + super(UnaryOperatorNode, self).__init__(metadata, expression_type, value) + self.__expression = expression + + @property + def expression(self): + return self.__expression diff --git a/ql/ast/nodes/expressions/variable.py b/ql/ast/nodes/expressions/variable.py new file mode 100644 index 0000000..c126372 --- /dev/null +++ b/ql/ast/nodes/expressions/variable.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.expressions.expression import ExpressionNode + + +class VariableNode(ExpressionNode): + def __init__(self, metadata, expression_type, identifier, value): + super(VariableNode, self).__init__(metadata, expression_type, value) + self.__identifier = identifier + + @property + def identifier(self): + return self.__identifier diff --git a/ql/ast/nodes/statements/__pycache__/block_statement.cpython-35.pyc b/ql/ast/nodes/statements/__pycache__/block_statement.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..8ec170d --- /dev/null +++ b/ql/ast/nodes/statements/__pycache__/block_statement.cpython-35.pyc diff --git a/ql/ast/nodes/statements/__pycache__/form_statement.cpython-35.pyc b/ql/ast/nodes/statements/__pycache__/form_statement.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..e10775a --- /dev/null +++ b/ql/ast/nodes/statements/__pycache__/form_statement.cpython-35.pyc diff --git a/ql/ast/nodes/statements/__pycache__/if_statement.cpython-35.pyc b/ql/ast/nodes/statements/__pycache__/if_statement.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..e81cfc1 --- /dev/null +++ b/ql/ast/nodes/statements/__pycache__/if_statement.cpython-35.pyc diff --git a/ql/ast/nodes/statements/__pycache__/question_statement.cpython-35.pyc b/ql/ast/nodes/statements/__pycache__/question_statement.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..6b86ed9 --- /dev/null +++ b/ql/ast/nodes/statements/__pycache__/question_statement.cpython-35.pyc diff --git a/ql/ast/nodes/statements/block_statement.py b/ql/ast/nodes/statements/block_statement.py new file mode 100644 index 0000000..2013c82 --- /dev/null +++ b/ql/ast/nodes/statements/block_statement.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.base import BaseNode + + +class BlockStatementNode(BaseNode): + def __init__(self, metadata, block): + super(BlockStatementNode, self).__init__(metadata) + self.__block = block + + @property + def block(self): + return self.__block diff --git a/ql/ast/nodes/statements/form_statement.py b/ql/ast/nodes/statements/form_statement.py new file mode 100644 index 0000000..0030623 --- /dev/null +++ b/ql/ast/nodes/statements/form_statement.py @@ -0,0 +1,12 @@ +from ql.ast.nodes.statements.block_statement import BlockStatementNode + + +class FormNode(BlockStatementNode): + def __init__(self, metadata, block, identifier): + super(FormNode, self).__init__(metadata, block) + self.__identifier = identifier + + @property + def identifier(self): + return self.__identifier + diff --git a/ql/ast/nodes/statements/if_statement.py b/ql/ast/nodes/statements/if_statement.py new file mode 100644 index 0000000..68845b8 --- /dev/null +++ b/ql/ast/nodes/statements/if_statement.py @@ -0,0 +1,11 @@ +from ql.ast.nodes.statements.block_statement import BlockStatementNode + + +class IfNode(BlockStatementNode): + def __init__(self, metadata, block, condition): + super(IfNode, self).__init__(metadata, block) + self.__condition = condition + + @property + def condition(self): + return self.__condition diff --git a/ql/ast/nodes/statements/question_statement.py b/ql/ast/nodes/statements/question_statement.py new file mode 100644 index 0000000..2878449 --- /dev/null +++ b/ql/ast/nodes/statements/question_statement.py @@ -0,0 +1,31 @@ +from ql.ast.nodes.base import BaseNode + + +class QuestionNode(BaseNode): + def __init__(self, line_number, label, identifier, answer_type, answer, computed): + super(QuestionNode, self).__init__(line_number) + self.__label = label + self.__identifier = identifier + self.__answer_type = answer_type + self.__answer = answer + self.__computed = computed + + @property + def label(self): + return self.__label + + @property + def identifier(self): + return self.__identifier + + @property + def answer_type(self): + return self.__answer_type + + @property + def answer(self): + return self.__answer + + @property + def computed(self): + return self.__computed |