ErrorBuilder

parsley.errors.ErrorBuilder
See theErrorBuilder companion object
trait ErrorBuilder[+Err]

This typeclass specifies how to format an error from a parser as a specified type.

An instance of this trait is required when calling parse (or similar). By default, Parsley defines its own instance for ErrorBuilder[String] found in the ErrorBuilder companion object.

To implement this trait, a number of methods must be defined, as well the representation types for a variety of different components; the relation between the various methods is closely linked to the types that they both produce and consume. To only change the basics of formatting without having to define the entire instance, inherit from DefaultErrorBuilder: this will mean, however, that the representation types cannot be overriden.

How an Error is Structured

There are two kinds of error messages that are generated by Parsley: Specialised and Vanilla. These are produced by different combinators and can be merged with other errors of the same type if both errors appear at the same offset. However, Specialised errors will take precedence over Vanilla errors if they appear at the same offset. The most common form of error is the Vanilla variant, which is generated by most combinators, except for some in errors.combinator.

Both types of error share some common structure, namely:

  • The error preamble, which has the file and the position.

  • The content lines, the specifics of which differ between the two types of error.

  • The context lines, which has the surrounding lines of input for contextualisation.

Vanilla Errors

There are three kinds of content line found in a Vanilla error:

  1. Unexpected info: this contains information about the kind of token that caused the error.

  2. Expected info: this contains the information about what kinds of token could have avoided the error.

  3. Reasons: these are the bespoke reasons that an error has occurred (as generated by explain).

There can be at most one unexpected line, at most one expected line, and zero or more reasons. Both of the unexpected and expected info are built up of error items, which are either: the end of input, a named token, raw input taken from the parser definition. These can all be formatted separately.

The overall structure of a Vanilla error is given in the following diagram:

┌───────────────────────────────────────────────────────────────────────┐
│   Vanilla Error                                                       │
│                          ┌────────────────┐◄──────── position         │
│                  source  │                │                           │
│                     │    │   line      col│                           │
│                     ▼    │     │         ││                           │
│                  ┌─────┐ │     ▼         ▼│   end of input            │
│               In foo.txt (line 1, column 5):       │                  │
│                 ┌─────────────────────┐            │                  │
│unexpected ─────►│                     │            │  ┌───── expected │
│                 │          ┌──────────┐ ◄──────────┘  │               │
│                 unexpected end of input               ▼               │
│                 ┌──────────────────────────────────────┐              │
│                 expected "(", "negate", digit, or letter              │
│                          │    └──────┘  └───┘     └────┘ ◄────── named│
│                          │       ▲        └──────────┘ │              │
│                          │       │                     │              │
│                          │      raw                    │              │
│                          └─────────────────┬───────────┘              │
│                 '-' is a binary operator   │                          │
│                 └──────────────────────┘   │                          │
│                ┌──────┐        ▲           │                          │
│                │>3+4- │        │           expected items             │
│                │     ^│        │                                      │
│                └──────┘        └───────────────── reason              │
│                   ▲                                                   │
│                   │                                                   │
│                   line info                                           │
└───────────────────────────────────────────────────────────────────────┘

Specialised Errors

There is only one kind of content found in a Specialised error: a message. These are completely free-form, and are generated by the fail combinator, as well as its derived combinators. There can be one or more messages in a Specialised error.

The overall structure of a Specialised error is given in the following diagram:

┌───────────────────────────────────────────────────────────────────────┐
│   Specialised Error                                                   │
│                          ┌────────────────┐◄──────── position         │
│                  source  │                │                           │
│                     │    │   line       col                           │
│                     ▼    │     │         │                            │
│                  ┌─────┐ │     ▼         ▼                            │
│               In foo.txt (line 1, column 5):                          │
│                                                                       │
│           ┌───► something went wrong                                  │
│           │                                                           │
│ message ──┼───► it looks like a binary operator has no argument       │
│           │                                                           │
│           └───► '-' is a binary operator                              │
│                ┌──────┐                                               │
│                │>3+4- │                                               │
│                │     ^│                                               │
│                └──────┘                                               │
│                   ▲                                                   │
│                   │                                                   │
│                   line info                                           │
└───────────────────────────────────────────────────────────────────────┘

Attributes

Err

The final result type of the error message

Since:

3.0.0

Companion:
object
Source:
ErrorBuilder.scala
Graph
Supertypes
class Object
trait Matchable
class Any
Known subtypes

Members list

Concise view

Top-Level Formatting

These methods help assembly the final products of the error messages. The format method will return the desired Err types, whereas specialisedError and vanillaError both assemble an ErrorInfoLines that the format method can consume.

The representation type of the main body within the error message.

The representation type of the main body within the error message.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
def format(pos: Position, source: Source, lines: ErrorInfoLines): Err

This is the top level function, which finally compiles all the formatted sub-parts into a finished value of type Err.

This is the top level function, which finally compiles all the formatted sub-parts into a finished value of type Err.

Attributes

lines

this is the main body of the error message (see vanillaError or specialisedError methods).

pos

this is the representation of the position of the error in the input (see the pos method).

source

this is the representation of the filename, if it exists (see the source method).

Returns:

the final assembled error message.

Since:

3.0.0

Source:
ErrorBuilder.scala

Specialised errors are triggered by fail and any combinators that are implemented in terms of fail.

Specialised errors are triggered by fail and any combinators that are implemented in terms of fail. These errors take precedence over the vanilla errors, and contain less, more specialised, information

Attributes

line

representation of the line of input that this error occured on (see the lineInfo method).

msgs

information detailing the error (see the combineMessages method).

Since:

3.0.0

Source:
ErrorBuilder.scala
def vanillaError(unexpected: UnexpectedLine, expected: ExpectedLine, reasons: Messages, line: LineInfo): ErrorInfoLines

Vanilla errors are those produced such that they have information about both expected and unexpected tokens.

Vanilla errors are those produced such that they have information about both expected and unexpected tokens. These are usually the default, and are not produced by fail (or any derivative) combinators.

Attributes

expected

information about which token(s) would have avoided the error (see the expected method).

line

representation of the line of input that this error occured on (see the lineInfo method).

reasons

additional information about why the error occured (see the combineMessages method).

unexpected

information about which token(s) caused the error (see the unexpected method).

Since:

3.0.0

Source:
ErrorBuilder.scala

Error Preamble

These methods control the formatting of the preamble of an error message, which is the position and source info. These are then consumed by format itself.

The representation type of position information within the generated message.

The representation type of position information within the generated message.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
type Source

The representation of the file information.

The representation of the file information.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
def pos(line: Int, col: Int): Position

Formats a position into the representation type given by Position.

Formats a position into the representation type given by Position.

Attributes

col

the column the error occurred at.

line

the line the error occurred at.

Returns:

a representation of the position.

Since:

3.0.0

Source:
ErrorBuilder.scala
def source(sourceName: Option[String]): Source

Formats the name of the file if it exists into the type give by Source

Formats the name of the file if it exists into the type give by Source

Attributes

sourceName

the source name of the file, if any.

Since:

3.0.0

Source:
ErrorBuilder.scala

Contextual Input Lines

These methods control how many lines of input surrounding the error are requested, and direct how these should be put together to form a LineInfo.

The representation of the line of input where the error occurred.

The representation of the line of input where the error occurred.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
def lineInfo(line: String, linesBefore: Seq[String], linesAfter: Seq[String], errorPointsAt: Int, errorWidth: Int): LineInfo

Describes how to format the information about the line that the error occured on.

Describes how to format the information about the line that the error occured on.

Attributes

errorPointsAt

the offset into the line that the error points at.

line

the full line of input that produced this error message.

linesAfter

the lines of input just after the one that produced this message (up to numLinesAfter).

linesBefore

the lines of input just before the one that produced this message (up to numLinesBefore).

Since:

3.1.0

Source:
ErrorBuilder.scala

The number of lines of input to request after an error occured.

The number of lines of input to request after an error occured.

Attributes

Since:

3.1.0

Source:
ErrorBuilder.scala

The number of lines of input to request before an error occured.

The number of lines of input to request before an error occured.

Attributes

Since:

3.1.0

Source:
ErrorBuilder.scala

Shared Components

These methods control any components or structure shared by both types of messages. In particular, the representation of reasons and messages is shared, as well as how they are combined together to form a unified block of content lines.

type Message

The representation of a reason or a message generated by the parser.

The representation of a reason or a message generated by the parser.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

The representation of the combined reasons or failure messages from the parser.

The representation of the combined reasons or failure messages from the parser.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

Details how to combine any reasons or messages generated within a single error.

Details how to combine any reasons or messages generated within a single error. Reasons are used by vanilla messages and messages are used by specialised messages.

Attributes

alts

the messages to combine (see the message or reason methods).

Since:

3.0.0

Source:
ErrorBuilder.scala

Specialised-Specific Components

These methods control the Specialised-specific components, namely the formatting of a bespoke error message.

Describes how to represent the messages produced by the fail combinator (or any that are implemented using it).

Describes how to represent the messages produced by the fail combinator (or any that are implemented using it).

Attributes

msg

the message produced by the parser.

Since:

3.0.0

Source:
ErrorBuilder.scala

Vanilla-Specific Components

These methods control the Vanilla-specific error components, namely how expected error items should be combined, how to format the unexpected line, and how to format reasons generated from explain.

The representation of all the different possible tokens that could have prevented an error.

The representation of all the different possible tokens that could have prevented an error.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

The representation of the information regarding the solving tokens.

The representation of the information regarding the solving tokens.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

The representation of the information regarding the problematic token.

The representation of the information regarding the problematic token.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

Details how to combine the various expected items into a single representation.

Details how to combine the various expected items into a single representation.

Attributes

alts

The possible items that fix the error

Since:

3.0.0

Source:
ErrorBuilder.scala

Describes how to handle the information about the tokens that could have avoided the error.

Describes how to handle the information about the tokens that could have avoided the error.

Attributes

alts

the tokens that could have prevented the error (see the combineExpectedItems method).

Since:

3.0.0

Source:
ErrorBuilder.scala
def reason(reason: String): Message

Describes how to represent the reasons behind a parser fail.

Describes how to represent the reasons behind a parser fail. These reasons originate from the explain combinator.

Attributes

reason

the reason produced by the parser.

Since:

3.0.0

Source:
ErrorBuilder.scala

Describes how to handle the (potentially missing) information about what token(s) caused the error.

Describes how to handle the (potentially missing) information about what token(s) caused the error.

Attributes

item

The Item that caused this error

Since:

3.0.0

Source:
ErrorBuilder.scala

Error Items

These methods control how error items within Vanilla errors are formatted. These are either the end of input, a named label generated by the label combinator, or a raw piece of input intrinsically associated with a combinator.

Represents the end of the input.

Represents the end of the input.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
type Item

The base type of Raw, Named and EndOfInput that represents the individual items within the error.

The base type of Raw, Named and EndOfInput that represents the individual items within the error.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
type Named <: Item

This represents "named" tokens, which have been provided with a label.

This represents "named" tokens, which have been provided with a label.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
type Raw <: Item

This represents "raw" tokens, where are those without labels: they come direct from the input, or the characters that the parser is trying to read.

This represents "raw" tokens, where are those without labels: they come direct from the input, or the characters that the parser is trying to read.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala

Value that represents the end of the input in the error message.

Value that represents the end of the input in the error message.

Attributes

Since:

3.0.0

Source:
ErrorBuilder.scala
def named(item: String): Named

Formats a named item generated by a label.

Formats a named item generated by a label.

Attributes

item

the name given to the label.

Since:

3.0.0

Source:
ErrorBuilder.scala
def raw(item: String): Raw

Formats a raw item generated by either the input string or a input reading combinator without a label.

Formats a raw item generated by either the input string or a input reading combinator without a label.

Attributes

item

the raw, unprocessed input.

Since:

3.0.0

Source:
ErrorBuilder.scala
def unexpectedToken(cs: Iterable[Char], amountOfInputParserWanted: Int, lexicalError: Boolean): Token

Extracts an unexpected token from the remaining input.

Extracts an unexpected token from the remaining input.

When a parser fails, by default an error reports an unexpected token of a specific width. This works well for some parsers, but often it is nice to have the illusion of a dedicated lexing pass: instead of reporting the next few characters as unexpected, an unexpected token can be reported instead. This can take many forms, for instance trimming the token to the next whitespace, only taking one character, or even trying to lex a token out of the stream.

This method can be easily implemented by mixing in an appropriate token extractor from parsley.errors.tokenextractors into this builder.

Attributes

amountOfInputParserWanted

the input the parser tried to read when it failed (this is not guaranteed to be smaller than the length of cs)

cs

the remaining input at point of failure (this is guaranteed to be non-empty)

lexicalError

was this error generated as part of "lexing", or in a wider parser (see markAsToken)

Returns:

a token extracted from cs that will be used as part of the unexpected message.

Since:

4.0.0

Source:
ErrorBuilder.scala