diff --git a/README.md b/README.md index 17ea78a..a232161 100644 --- a/README.md +++ b/README.md @@ -489,6 +489,50 @@ Try to match the first expression, if it does not succeed, try the second one, etc. Return the match result of the first successfully matched expression. If no expression matches, consider the match failed. +Error Messages +-------------- + +As described above, you can annotate your grammar rules with human-readable +names that will be used in error messages. For example, this production: + + integer "integer" + = digits:[0-9]+ + +will produce an error message like: + +> Expected integer but "a" found. + +when parsing a non-number, referencing the human-readable name "integer." +Without the human-readable name, PEG.js instead uses a description of the +character class that failed to match: + +> Expected [0-9] but "a" found. + +Aside from the text content of messages, human-readable names also have a +subtler effect on *where* errors are reported. PEG.js prefers to match +named rules completely or not at all, but not partially. Unnamed rules, +on the other hand, can produce an error in the middle of their +subexpressions. + +For example, for this rule matching a comma-separated list of integers: + + seq + = integer ("," integer)* + +an input like `1,2,a` produces this error message: + +> Expected integer but "a" found. + +But if we add a human-readable name to the `seq` production: + + seq "list of numbers" + = integer ("," integer)* + +then PEG.js prefers an error message that implies a smaller attempted parse +tree: + +> Expected end of input but "," found. + Compatibility -------------