Sha256: 34f10d29d9be7d4b81ee1694812f283ce435ff7fc0677a1a2388085c4cedfcc9

Contents?: true

Size: 1.18 KB

Versions: 1

Compression:

Stored size: 1.18 KB

Contents

module Antelope
  module Generation
    class Constructor
      module Follow

        def initialize
          @follows = {}
          super
        end

        def follow(token)

          if token.nonterminal?
            token = token.name
          elsif token.is_a? Symbol
          else
            incorrect_argument! token, Ace::Token::Nonterminal, Symbol
          end

          @follows.fetch(token) do
            @follows[token] = Set.new
            set = Set.new

            parser.productions.each do |key, value|
              value.each do |production|
                items = production[:items]
                positions = items.each_with_index.
                  find_all { |t, _| t.name == token }.
                  map(&:last).map(&:succ)
                positions.map { |pos| first(items[pos..-1]) }.
                  inject(set, :merge)
                positions.each do |pos|
                  if pos == items.size || nullable?(items[pos..-1])
                    set.merge follow(Ace::Token::Nonterminal.new(key))
                  end
                end
              end
            end

            @follows[token] = set
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
antelope-0.0.1 lib/antelope/generation/constructor/follow.rb