Sha256: ff81f16966a001c9bbd59f76b17a57860c67fd0b8bbead02a74cbc7ac64493e6

Contents?: true

Size: 1.74 KB

Versions: 1

Compression:

Stored size: 1.74 KB

Contents

require "set"

module Antelope
  module Ace
    class Grammar

      # Manages presidence for tokens.
      module Presidence

        # Accesses the generated presidence list.  Lazily generates
        # the presidence rules on the go, and then caches it.
        #
        # @return [Array<Ace::Presidence>]
        def presidence
          @_presidence ||= generate_presidence
        end

        # Finds a presidence rule for a given token.  If no direct
        # rule is defined for that token, it will check for a rule
        # defined for the special symbol, `:_`.  By default, there
        # is always a rule defined for `:_`.
        #
        # @param token [Ace::Token, Symbol]
        # @return [Ace::Presidence]
        def presidence_for(token)
          token = token.name if token.is_a?(Token)

          set = Set.new([token, :_])

          presidence.
            select { |pr| set.intersect?(pr.tokens) }.
            first
        end

        private

        # Generates the presidence rules.  Loops through the compiler
        # given presidence settings, and then adds two default
        # presidence rules; one for `:$` (level 0, nonassoc), and one
        # for `:_` (level 1, nonassoc).
        #
        # @return [Array<Ace::Presidence>]
        def generate_presidence
          size = @compiler.options[:prec].size + 1
          presidence = @compiler.options[:prec].
            each_with_index.map do |prec, i|
            Ace::Presidence.new(prec[0], prec[1..-1].to_set, size - i)
          end

          presidence <<
            Ace::Presidence.new(:nonassoc, [:"$"].to_set, 0) <<
            Ace::Presidence.new(:nonassoc, [:_].to_set, 1)
          presidence.sort_by { |_| _.level }.reverse
        end

      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
antelope-0.0.1 lib/antelope/ace/grammar/presidence.rb