class ShiftNode < ContainerNode
include BinaryNode
def initialize(lhs, rhs)
@lhs, @rhs = lhs, rhs
end
attr_reader :lhs, :rhs
alias :ref :rhs
def to_s
"(#{@lhs.to_s} @ #{@rhs.to_s})"
end
def trim2; @lhs; end
def trim
self.class.new(@lhs.trim, @rhs.trim2)
end
def flatten2; @lhs; end
def flatten
lf = @lhs.flatten
case lf
when ShiftNode
rf = lf.rhs.add_eval(@rhs)
self.class.new(lf.lhs, rf)
else
self.class.new(lf, @rhs.flatten)
end
end
def sort
self.class.new(@lhs.sort, @rhs.sort)
end
def ref
case @lhs
when ShiftNode
@lhs.ref.add_eval(@rhs)
else
@rhs
end
end
def deref
case @lhs
when ShiftNode
@lhs.deref
else
@lhs
end
end
def name
@lhs.name
end
def factor
@lhs.factor
end
end
syntax highlighted by Code2HTML, v. 0.9.1