Class: MasterForest::Term
- Inherits:
-
Object
- Object
- MasterForest::Term
- Defined in:
- lib/master_forest/term.rb
Direct Known Subclasses
Instance Method Summary collapse
- #==(other) ⇒ Object
- #fully_reduce(depth = Float::INFINITY) ⇒ Object
-
#initialize(raw, left = nil, right = nil) ⇒ Term
constructor
A new instance of Term.
- #l ⇒ Object
- #leaf? ⇒ Boolean
- #normal? ⇒ Boolean
- #r ⇒ Object
- #reduce ⇒ Object
- #to_s ⇒ Object
- #valid? ⇒ Boolean
Constructor Details
#initialize(raw, left = nil, right = nil) ⇒ Term
Returns a new instance of Term.
3 4 5 6 7 8 9 10 |
# File 'lib/master_forest/term.rb', line 3 def initialize raw, left = nil, right = nil @raw = raw if raw.nil? @l, @r = left, right @parsed = @l and @r raise "Empty node" unless @parsed end end |
Instance Method Details
#==(other) ⇒ Object
16 17 18 |
# File 'lib/master_forest/term.rb', line 16 def ==(other) to_s == other.to_s end |
#fully_reduce(depth = Float::INFINITY) ⇒ Object
65 66 67 68 69 70 71 72 73 |
# File 'lib/master_forest/term.rb', line 65 def fully_reduce depth = Float::INFINITY cur = self 1.upto(depth) do reduced = cur.reduce return reduced if reduced.normal? cur = reduced end cur end |
#l ⇒ Object
38 39 40 41 |
# File 'lib/master_forest/term.rb', line 38 def l shallow_parse unless @parsed @l end |
#leaf? ⇒ Boolean
34 35 36 |
# File 'lib/master_forest/term.rb', line 34 def leaf? to_s[0] != '`' end |
#normal? ⇒ Boolean
24 25 26 27 28 29 30 31 32 |
# File 'lib/master_forest/term.rb', line 24 def normal? return @normal ||= if leaf? true elsif /^`(i|`k|``s)/.match(to_s) false else l.normal? && r.normal? end end |
#r ⇒ Object
43 44 45 46 |
# File 'lib/master_forest/term.rb', line 43 def r shallow_parse unless @parsed @r end |
#reduce ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/master_forest/term.rb', line 48 def reduce return self if leaf? return r if to_s.start_with? '`i' return l.r if to_s.start_with? '``k' if to_s.start_with? '```s' return join(join(l.l.r, r), join(l.r, r)) end reduced = l.reduce return join(reduced, r) if reduced != l reduced = r.reduce return join(l, reduced) if reduced != r return self end |
#to_s ⇒ Object
12 13 14 |
# File 'lib/master_forest/term.rb', line 12 def to_s @raw ||= ['`', l.to_s, r.to_s].join end |
#valid? ⇒ Boolean
20 21 22 |
# File 'lib/master_forest/term.rb', line 20 def valid? /[^`ski]/.match(to_s).nil? and (subterm_length(0)+1 == to_s.length) end |