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