2013-06-04 19:22:33 +02:00
|
|
|
module Mutant
|
|
|
|
# Mixin for node helpers
|
|
|
|
module NodeHelpers
|
|
|
|
|
|
|
|
# Build node
|
|
|
|
#
|
|
|
|
# @param [Symbol] type
|
|
|
|
#
|
|
|
|
# @return [Parser::AST::Node]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def s(type, *children)
|
2014-05-11 15:18:37 +00:00
|
|
|
Parser::AST::Node.new(type, children)
|
2013-06-04 19:22:33 +02:00
|
|
|
end
|
2013-06-12 19:19:06 +02:00
|
|
|
module_function :s
|
|
|
|
|
2013-07-28 19:57:06 +02:00
|
|
|
NAN =
|
2014-04-12 01:12:49 +00:00
|
|
|
s(:send, s(:float, 0.0), :/, s(:float, 0.0))
|
2013-07-28 19:57:06 +02:00
|
|
|
INFINITY =
|
2014-04-12 01:12:49 +00:00
|
|
|
s(:send, s(:float, 1.0), :/, s(:float, 0.0))
|
2013-07-28 19:57:06 +02:00
|
|
|
NEGATIVE_INFINITY =
|
2014-04-12 01:12:49 +00:00
|
|
|
s(:send, s(:float, -1.0), :/, s(:float, 0.0))
|
2013-06-21 15:03:21 +02:00
|
|
|
|
2014-06-05 16:37:31 +00:00
|
|
|
RAISE = s(:send, nil, :raise)
|
2013-07-02 20:42:09 +02:00
|
|
|
|
2014-06-05 16:37:31 +00:00
|
|
|
N_TRUE = s(:true)
|
|
|
|
N_FALSE = s(:false)
|
|
|
|
N_NIL = s(:nil)
|
|
|
|
N_EMPTY = s(:empty)
|
|
|
|
N_SELF = s(:self)
|
2013-06-04 19:22:33 +02:00
|
|
|
|
2013-07-24 10:53:37 -07:00
|
|
|
# Build a negated boolean node
|
|
|
|
#
|
|
|
|
# @param [Parser::AST::Node] node
|
|
|
|
#
|
|
|
|
# @return [Parser::AST::Node]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def n_not(node)
|
|
|
|
s(:send, node, :!)
|
|
|
|
end
|
|
|
|
|
2014-06-10 02:05:58 +00:00
|
|
|
NODE_TYPES.each do |type|
|
|
|
|
fail "method: #{type} is already defined" if instance_methods(true).include?(type)
|
|
|
|
|
|
|
|
name = "n_#{type.to_s.sub(/\??\z/, '?')}"
|
|
|
|
|
|
|
|
define_method(name) do |node|
|
|
|
|
node.type.equal?(type)
|
|
|
|
end
|
|
|
|
private name
|
|
|
|
end
|
|
|
|
|
2013-06-04 19:22:33 +02:00
|
|
|
end # NodeHelpers
|
|
|
|
end # Mutant
|