File: evaluator.rb

package info (click to toggle)
ruby-morpher 0.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 520 kB
  • sloc: ruby: 2,366; makefile: 4
file content (63 lines) | stat: -rw-r--r-- 1,314 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module Morpher
  class Compiler
    # Compiler with evaluators as output
    class Evaluator < self
      include Concord.new(:evaluators, :emitters)

      # Return evaluator tree for node
      #
      # @param [Node] node
      #
      # @return [Evalautor]
      #   on success
      #
      # @raise [Compiler::Error]
      #   on error
      #
      # @api private
      #
      def call(node)
        evaluator = evaluator(node)
        emitter = emitter(evaluator)
        emitter.call(self, evaluator, node)
      end

    private

      # Lookup evaluator for node
      #
      # @param [Node]
      #
      # @return [Class:Evaluator]
      #   if found
      #
      # @raise [Error::UnknownNode]
      #   otherwise
      #
      # @api private
      #
      def evaluator(node)
        type = node.type
        evaluators.fetch(type) do
          fail Error::UnknownNode, type
        end
      end

      # Return emitter for evaluator
      #
      # @param [Class:Evalautor]
      #
      # @return [#call]
      #
      # @api private
      #
      def emitter(evaluator)
        emitters.each do |arity, emitter|
          return emitter if evaluator.ancestors.include?(arity)
        end
        fail Error::UnknownNode, evaluator
      end

    end # Evaluator
  end # Compiler
end # Morpher