datalust / superpower

A C# parser construction toolkit with high-quality error reporting
Apache License 2.0
1.07k stars 99 forks source link

Long-form error messages #5

Open nblumhardt opened 8 years ago

nblumhardt commented 8 years ago

Superpower produces errors that carry a location, error message fragment, and expectations.

By default, the result types' ToString() formats these into one-line messages as in this test case:

AssertParser.FailsWithMessage(alternating, "123 abc 123 123", new SExpressionTokenizer(),
    "Syntax error (line 1, column 13): unexpected number `123`, expected atom.");

This is a good default, but in some applications (especially those that produce output for terminals) a multi-line error can provide more context.

This is an example from FParsec:

Failure: Error in Ln: 1 Col: 6
1.25E 3
     ^
Expecting: decimal digit

Using the information available to Superpower,

Unexpected number `123`, expected atom
 ---> line 1, column 13
  | 
1 | 123 abc 123 123
  |             ^^^ expected atom

It would be nice to show the preceding and following lines if available. The new rustc error formatting sets the benchmark here.

nblumhardt commented 8 years ago

To avoid fiddling with the case of the message fragment:

Syntax error: unexpected number `123`, expected atom
 --> line 1, column 13
  | 
1 | 123 abc 123 123
  |             ^^^ expected atom
nblumhardt commented 6 years ago

Made some small improvements in https://github.com/datalust/superpower/pull/38 that should help with this (see the linked screenshot and example program).