84 lines
1.7 KiB
Ruby
84 lines
1.7 KiB
Ruby
module Morpher
|
|
class Compiler
|
|
|
|
# Abstract error class for compiler errors
|
|
class Error < RuntimeError
|
|
include AbstractType
|
|
|
|
# Error raised when node children have incorrect amount
|
|
class NodeChildren < self
|
|
include Concord.new(:node, :expected_amount)
|
|
|
|
# Return exception message
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
#
|
|
def message
|
|
"Expected #{expected_amount} #{_children} for #{type}, got #{actual_amount}: #{children}"
|
|
end
|
|
|
|
private
|
|
|
|
# Return inspected type
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
#
|
|
def type
|
|
node.type.inspect
|
|
end
|
|
|
|
# Return actual amount of children
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
#
|
|
def actual_amount
|
|
children.length
|
|
end
|
|
|
|
# Return children
|
|
#
|
|
# @return [Array]
|
|
#
|
|
# @api private
|
|
#
|
|
def children
|
|
node.children
|
|
end
|
|
|
|
# Return user firendly children message
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
#
|
|
def _children
|
|
expected_amount.equal?(1) ? 'child' : 'children'
|
|
end
|
|
|
|
end # NodeChildren
|
|
|
|
# Error raised on compiling unknown nodes
|
|
class UnknownNode < self
|
|
include Concord.new(:type)
|
|
|
|
# Return exception error message
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
#
|
|
def message
|
|
"Node type: #{type.inspect} is unknown"
|
|
end
|
|
|
|
end # UnknownNode
|
|
|
|
end # Error
|
|
end # Compiler
|
|
end # Morpher
|