Module: Antelope::Ace::Grammar::Precedences

Included in:
Antelope::Ace::Grammar
Defined in:
lib/antelope/ace/grammar/precedences.rb

Overview

Manages precedence for tokens.

Instance Method Summary collapse

Instance Method Details

#generate_precedenceArray<Ace::Precedence> (private)

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).

Returns:



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/antelope/ace/grammar/precedences.rb', line 51

def generate_precedence
  size = @compiler.options[:prec].size + 1
  precedence = @compiler.options[:prec].
    each_with_index.map do |prec, i|
    Ace::Precedence.new(prec[0], prec[1..-1].to_set, size - i)
  end

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

#precedenceArray<Ace::Precedence>

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

Returns:



16
17
18
# File 'lib/antelope/ace/grammar/precedences.rb', line 16

def precedence
  @_precedence ||= generate_precedence
end

#precedence_for(token) ⇒ Ace::Precedence

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 :_.

Parameters:

Returns:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/antelope/ace/grammar/precedences.rb', line 27

def precedence_for(token)
  token = token.name if token.is_a?(Token)

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

  prec = precedence.
    select { |pr| set.intersection(pr.tokens).any? }.
    first

  if token == :modifier
    p prec
  end

  prec
end