Class: Packcr::Node::AlternateNode
- Inherits:
-
Packcr::Node
- Object
- Packcr::Node
- Packcr::Node::AlternateNode
- Defined in:
- lib/packcr/node/alternate_node.rb
Instance Attribute Summary collapse
-
#nodes ⇒ Object
Returns the value of attribute nodes.
Instance Method Summary collapse
- #alt(node) ⇒ Object
- #debug_dump(indent = 0) ⇒ Object
- #generate_code(gen, onfail, indent, bare) ⇒ Object
-
#initialize(*nodes) ⇒ AlternateNode
constructor
A new instance of AlternateNode.
- #link_references(ctx) ⇒ Object
- #max ⇒ Object
- #verify_captures(ctx, capts) ⇒ Object
- #verify_variables(vars) ⇒ Object
Methods inherited from Packcr::Node
Constructor Details
#initialize(*nodes) ⇒ AlternateNode
Returns a new instance of AlternateNode.
6 7 8 9 |
# File 'lib/packcr/node/alternate_node.rb', line 6 def initialize(*nodes) super() self.nodes = nodes end |
Instance Attribute Details
#nodes ⇒ Object
Returns the value of attribute nodes.
4 5 6 |
# File 'lib/packcr/node/alternate_node.rb', line 4 def nodes @nodes end |
Instance Method Details
#alt(node) ⇒ Object
11 12 13 14 |
# File 'lib/packcr/node/alternate_node.rb', line 11 def alt(node) @nodes << node self end |
#debug_dump(indent = 0) ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/packcr/node/alternate_node.rb', line 16 def debug_dump(indent = 0) $stdout.print "#{" " * indent}Alternate(max:#{max}, len:#{nodes.length}) {\n" nodes.each do |node| node.debug_dump(indent + 2) end $stdout.print "#{" " * indent}}\n" end |
#generate_code(gen, onfail, indent, bare) ⇒ Object
30 31 32 33 34 35 36 37 38 |
# File 'lib/packcr/node/alternate_node.rb', line 30 def generate_code(gen, onfail, indent, ) b = false m = gen.next_label reach = nil gen.write Packcr.template("node/alternate.#{gen.lang}.erb", binding, indent: indent - 4, unwrap: ) reach || Packcr::CODE_REACH__ALWAYS_FAIL end |
#link_references(ctx) ⇒ Object
69 70 71 72 73 |
# File 'lib/packcr/node/alternate_node.rb', line 69 def link_references(ctx) nodes.each do |node| node.link_references(ctx) end end |
#max ⇒ Object
24 25 26 27 28 |
# File 'lib/packcr/node/alternate_node.rb', line 24 def max m = 1 m <<= 1 while m < @nodes.length m end |
#verify_captures(ctx, capts) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/packcr/node/alternate_node.rb', line 57 def verify_captures(ctx, capts) m = capts.length v = capts.dup nodes.each do |node| v = v[0, m] node.verify_captures(ctx, v) v[m...-1].each do |added_node| capts.push(added_node) end end end |
#verify_variables(vars) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/packcr/node/alternate_node.rb', line 40 def verify_variables(vars) m = vars.length v = vars.dup nodes.each do |node| v = v[0, m] node.verify_variables(v) v[m...-1].each do |added_node| found = vars[m...-1].any? do |added_var| added_node.index == added_var.index end if !found vars.push(added_node) end end end end |