The following example uses `<` ... ` >` operators. They are the *token boundary* operators. Each token boundary operator creates a semantic value that contains `const char*` of the position. It could be useful to eliminate unnecessary characters.
```c++
```cpp
auto syntax = R"(
ROOT <-_ TOKEN (',' _TOKEN)*
TOKEN <-<[a-z0-9]+> _
@ -138,7 +138,7 @@ auto ret = pg.parse(" token1, token2 ");
We can ignore unnecessary semantic values from the list by using `~` operator.
```c++
```cpp
peg::pegparser parser(
" ROOT <-_ ITEM (',' _ITEM_)*"
" ITEM <-([a-z])+"
@ -154,7 +154,7 @@ auto ret = parser.parse(" item1, item2 ");
The following grammar is same as the above.
```c++
```cpp
peg::parser parser(
" ROOT <-~_ITEM(','~_ITEM~_)*"
" ITEM <-([a-z])+"
@ -164,7 +164,7 @@ peg::parser parser(
*Semantic predicate* support is available. We can do it by throwing a `peg::parse_error` exception in a semantic action.
```c++
```cpp
peg::parser parser("NUMBER <-[0-9]+");
parser["NUMBER"] = [](const SemanticValues& sv) {
@ -184,6 +184,22 @@ ret = parser.parse("200", val);