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
-
#generate_precedence ⇒ Array<Ace::Precedence>
private
Generates the precedence rules.
-
#precedence ⇒ Array<Ace::Precedence>
Accesses the generated precedence list.
-
#precedence_for(token) ⇒ Ace::Precedence
Finds a precedence rule for a given token.
Instance Method Details
#generate_precedence ⇒ Array<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).
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.[:prec].size + 1 precedence = @compiler.[: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 |
#precedence ⇒ Array<Ace::Precedence>
Accesses the generated precedence list. Lazily generates the precedence rules on the go, and then caches it.
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 :_
.
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 |