class Parslet::ErrorReporter::Deepest

Instead of reporting the latest error that happens like {Tree} does, this class reports the deepest error. Depth is defined here as how advanced into the input an error happens. The errors close to the greatest depth tend to be more relevant to the end user, since they specify what could be done to make them go away.

More specifically, errors produced by this reporter won't be related to the structure of the grammar at all. The positions of the errors will be advanced and convey at every grammar level what the deepest rule was to fail.

Attributes

deepest_cause[R]

Public Class Methods

new() click to toggle source
# File lib/parslet/error_reporter/deepest.rb, line 15
def initialize
  @deepest_cause = nil
end

Public Instance Methods

deepest(cause) click to toggle source

Checks to see if the lineage of the cause given includes a cause with an error position deeper than the current deepest cause stored. If yes, it passes the cause through to the caller. If no, it returns the current deepest error that was saved as a reference.

# File lib/parslet/error_reporter/deepest.rb, line 66
def deepest(cause)
  rank, leaf = deepest_child(cause)
  
  if !deepest_cause || leaf.pos >= deepest_cause.pos
    # This error reaches deeper into the input, save it as reference.
    @deepest_cause = leaf
    return cause
  end
  
  return deepest_cause
end
err(atom, source, message, children=nil) click to toggle source

Produces an error cause that combines the message at the current level with the errors that happened at a level below (children).

@param atom [Parslet::Atoms::Base] parslet that failed @param source [Source] Source that we're using for this parse. (line

number information...)

@param message [String, Array] Error message at this level. @param children [Array] A list of errors from a deeper level (or nil). @return [Cause] An error tree combining children with message.

# File lib/parslet/error_reporter/deepest.rb, line 29
def err(atom, source, message, children=nil)
  position = source.pos
  cause = Cause.format(source, position, message, children)
  return deepest(cause)
end
err_at(atom, source, message, pos, children=nil) click to toggle source

Produces an error cause that combines the message at the current level with the errors that happened at a level below (children).

@param atom [Parslet::Atoms::Base] parslet that failed @param source [Source] Source that we're using for this parse. (line

number information...)

@param message [String, Array] Error message at this level. @param pos [Fixnum] The real position of the error. @param children [Array] A list of errors from a deeper level (or nil). @return [Cause] An error tree combining children with message.

# File lib/parslet/error_reporter/deepest.rb, line 46
def err_at(atom, source, message, pos, children=nil)
  position = pos
  cause = Cause.format(source, position, message, children)
  return deepest(cause)
end
succ(source) click to toggle source

Notification that an expression successfully parsed not used, see ErrorReporter::Contextual

# File lib/parslet/error_reporter/deepest.rb, line 56
def succ(source)
end

Private Instance Methods

deepest_child(cause, rank=0) click to toggle source

Returns the leaf from a given error tree with the biggest rank.

# File lib/parslet/error_reporter/deepest.rb, line 81
def deepest_child(cause, rank=0)
  max_child = cause
  max_rank  = rank
  
  if cause.children && !cause.children.empty?
    cause.children.each do |child|
      c_rank, c_cause = deepest_child(child, rank+1)
      
      if c_rank > max_rank
        max_rank = c_rank
        max_child = c_cause
      end
    end
  end
  
  return max_rank, max_child
end