Sha256: 3236f81eed8ddc6a6e2613d15a998129161fe8d56e3a49afc97bfe783b36788f

Contents?: true

Size: 1.24 KB

Versions: 1

Compression:

Stored size: 1.24 KB

Contents

# frozen_string_literal: true

module Rus3

  module AST

    require_relative "ast/error"

    module Utils
      class << self
        def camel_case(snake_case)
          snake_case.to_s.split("_").map(&:capitalize).join("")
        end
      end
    end

    class Node
      attr_reader :literal

      def initialize(literal = nil)
        @literal = literal
      end

      def leaf?;    false; end
      def branch?;  false; end
      def illegal?; false; end

      def type; nil; end

      def to_s
        @literal
      end
    end

    class IllegalNode < Node
      def initialize(ast_type, literal)
        super(literal)
        @given_type = ast_type
      end

      def illegal?
        true
      end

      def type
        @given_type
      end

      def to_s
        "type: #{@given_type}, literal: #{@literal}"
      end
    end

    require_relative "ast/leaf_node"
    require_relative "ast/branch_node"

    class << self
      def instantiate(ast_type, literal = nil)
        klass_name = Utils.camel_case(ast_type) + "Node"
        klass = AST.const_get(klass_name)
        if klass.nil? or klass == IllegalNode
          IllegalNode.new(ast_type, literal)
        else
          klass.new(literal)
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rus3-0.2.0 lib/rus3/ast.rb