Module: Antelope::Grammar::Precedences

Included in:
Antelope::Grammar
Defined in:
lib/antelope/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:

  • (Array<Ace::Precedence>)


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 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

#precedenceArray<Ace::Precedence>

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

Returns:

  • (Array<Ace::Precedence>)


13
14
15
# File 'lib/antelope/grammar/precedences.rb', line 13

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:

  • token (Ace::Token, Symbol)

Returns:

  • (Ace::Precedence)


24
25
26
27
28
29
30
31
32
33
# 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