module Antelope::Grammar::Precedences

Manages precedence for tokens.

Public Instance Methods

precedence() click to toggle source

Accesses the generated precedence list. Lazily generates the precedence rules on the go, and then caches it.

@return [Array<Ace::Precedence>]

# File lib/antelope/grammar/precedences.rb, line 13
def precedence
  @_precedence ||= generate_precedence
end
precedence_for(token) click to toggle source

Finds a precedence 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::Precedence]

# File lib/antelope/grammar/precedences.rb, line 24
def precedence_for(token)
  token = token.name if token.is_a?(Token)

  prec = precedence.
    detect { |pr| pr.tokens.include?(token) } ||
  precedence.
    detect { |pr| pr.tokens.include?(:_) }

  prec
end

Private Instance Methods

generate_precedence() click to toggle source

Generates the precedence rules. Loops through the compiler given precedence settings, and then adds two default precedence rules; one for ‘:$` (level 0, nonassoc), and one for `:_` (level 1, nonassoc).

@return [Array<Ace::Precedence>]

# File lib/antelope/grammar/precedences.rb, line 43
def generate_precedence
  size = @compiler.options[:prec].size + 1
  index = 0
  precedence = []

  while index < size - 1
    prec = @compiler.options[:prec][index]
    precedence <<
      Precedence.new(prec[0], prec[1..-1].to_set,
      size - index)
    index += 1
  end

  precedence <<
    Precedence.new(:nonassoc, [:$end].to_set, 0) <<
    Precedence.new(:nonassoc, [:_].to_set, 1)
  precedence.sort_by(&:level).reverse
end