Class: Parslet::ErrorReporter::Deepest

Inherits:
Object
  • Object
show all
Defined in:
lib/parslet/error_reporter/deepest.rb

Overview

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.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDeepest

Returns a new instance of Deepest.



15
16
17
# File 'lib/parslet/error_reporter/deepest.rb', line 15

def initialize
  @deepest_cause = nil
end

Instance Attribute Details

#deepest_causeObject (readonly)

Returns the cause that is currently deepest. Mainly for specs.



54
55
56
# File 'lib/parslet/error_reporter/deepest.rb', line 54

def deepest_cause
  @deepest_cause
end

Instance Method Details

#deepest(cause) ⇒ Object

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.



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/parslet/error_reporter/deepest.rb', line 61

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) ⇒ Cause

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

Parameters:

  • atom (Parslet::Atoms::Base)

    parslet that failed

  • source (Source)

    Source that we’re using for this parse. (line number information…)

  • message (String, Array)

    Error message at this level.

  • children (Array) (defaults to: nil)

    A list of errors from a deeper level (or nil).

Returns:

  • (Cause)

    An error tree combining children with message.



29
30
31
32
33
# 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) ⇒ Cause

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

Parameters:

  • atom (Parslet::Atoms::Base)

    parslet that failed

  • source (Source)

    Source that we’re using for this parse. (line number information…)

  • message (String, Array)

    Error message at this level.

  • pos (Fixnum)

    The real position of the error.

  • children (Array) (defaults to: nil)

    A list of errors from a deeper level (or nil).

Returns:

  • (Cause)

    An error tree combining children with message.



46
47
48
49
50
# 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