From f560ceca9736c364110bf98f504f83ac119c4db0 Mon Sep 17 00:00:00 2001 From: yhirose Date: Mon, 18 Jan 2021 15:26:54 -0500 Subject: [PATCH] Added unexpected token place holder `%t` --- README.md | 5 +++++ docs/native.wasm | Bin 359514 -> 360710 bytes peglib.h | 49 +++++++++++++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0e6cef5..6687c18 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ The PEG syntax is well described on page 2 in the [document](http://www.brynosau * `|` (Dictionary operator) * `MACRO_NAME(` ... `)` (Parameterized rule or Macro) * `{ precedence L - + L / * }` (Parsing infix expression) + * `%recovery(` ... `)` (Error recovery operator) + * `exp^label` (Syntax sugar for `(exp / %recover(label))`) + * `label { message "..." }` (Error message instruction) This library supports the linear-time parsing known as the [*Packrat*](http://pdos.csail.mit.edu/~baford/packrat/thesis/thesis.pdf) parsing. @@ -515,6 +518,8 @@ cpp-peglib supports the furthest failure error posision report as descrived in t For better error report and recovery, cpp-peglib supports 'recovery' operator with label which can be assosiated with a recovery expression and a custom error message. This idea comes from the fantastic ["Syntax Error Recovery in Parsing Expression Grammars"](https://arxiv.org/pdf/1806.11150.pdf) paper by Sergio Medeiros and Fabio Mascarenhas. +The custom message supports `%t` which is a place holder for the unexpected token. + Here is an example of Java-like grammar: ```peg diff --git a/docs/native.wasm b/docs/native.wasm index c7d4b3338dd4cb3533a08e95abee9da037fef9e3..da74b80af2c37e024754c6abfc9586b0e9334b7a 100644 GIT binary patch delta 15004 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 HZSDRa3u){* delta 13840 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