Class: Fabulator::Grammar::Expr::RuleAlternative

Inherits:
Object
  • Object
show all
Defined in:
lib/fabulator/grammar/expr/rule_alternative.rb

Instance Method Summary collapse

Constructor Details

#initializeRuleAlternative

Returns a new instance of RuleAlternative.



5
6
7
# File 'lib/fabulator/grammar/expr/rule_alternative.rb', line 5

def initialize
  @sequences = [ ]
end

Instance Method Details

#add_sequence(s) ⇒ Object



9
10
11
12
# File 'lib/fabulator/grammar/expr/rule_alternative.rb', line 9

def add_sequence(s)
  s = [ s ] unless s.is_a?(Array)
  @sequences += s
end

#parse(source) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/fabulator/grammar/expr/rule_alternative.rb', line 14

def parse(source)
  results = { }
  @sequences.each do |sequence|
    r = sequence.parse(source)
    return nil if r.nil? # we fail
    nom = (sequence.name rescue nil)
    rr = { }
    if nom.nil?
      rr = r
    elsif !r.nil?
      if !(r.is_a?(Hash) || r.is_a?(Array)) || !r.empty?
        rr[nom] = r
      end
    end
    if rr.is_a?(Hash) && !rr.empty?
      rr.each_pair do |k,v|
        if results[k].nil?
          results[k] = v
        elsif results[k].is_a?(Array)
          results[k] << v
        else
          results[k] = [ results[k], v ]
        end
      end
    end
  end
  results
end