Sha256: d223c7a04e48631adf9e305a07b3b99960a9cdf8f11af3e1c157d9d0420a82ec

Contents?: true

Size: 1.59 KB

Versions: 2

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true

#
# Copyright (c) 2018-present, Blue Marble Payroll, LLC
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
#

module Logicality
  module Interpreter
    # This class implements NodeVisitor and gives each type of node the proper type of visitor
    # implementation.
    class SimpleInterpreter < NodeVisitor
      attr_reader :resolver

      def initialize(resolver)
        raise ArgumentError, 'Resolver is required' unless resolver

        @resolver = resolver
      end

      def error(node)
        raise ArgumentError, "Visitor cant process node token type: #{node.token.type}"
      end

      def visit_binary_operator_node(node)
        if node.token.type == Lexer::Token::Type::AND_OP
          visit(node.left) && visit(node.right)
        elsif node.token.type == Lexer::Token::Type::OR_OP
          visit(node.left) || visit(node.right)
        else
          error(node)
        end
      end

      def visit_unary_operator_node(node)
        if node.token.type == Lexer::Token::Type::NOT_OP
          !visit(node.child)
        else
          error(node)
        end
      end

      def visit_value_operand_node(node)
        if node.value == 'true'
          true
        elsif node.value == 'false' || node.value == 'null'
          false
        else
          resolve_value(node.value)
        end
      end

      private

      def resolve_value(value)
        raise ArgumentError, "No resolver function: #{value}" if resolver.nil?

        !!resolver.call(value)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
logicality-2.0.0 lib/logicality/interpreter/simple_interpreter.rb
logicality-1.0.5 lib/logicality/interpreter/simple_interpreter.rb