@ -2,7 +2,7 @@ cpp-peglib
==========
[![ ](https://github.com/yhirose/cpp-peglib/workflows/CMake/badge.svg )](https://github.com/yhirose/cpp-peglib/actions)
[![Bul id Status ](https://ci.appveyor.com/api/projects/status/github/yhirose/cpp-peglib?branch=master&svg=true )](https://ci.appveyor.com/project/yhirose/cpp-peglib)
[![Buil d Status ](https://ci.appveyor.com/api/projects/status/github/yhirose/cpp-peglib?branch=master&svg=true )](https://ci.appveyor.com/project/yhirose/cpp-peglib)
C++17 header-only [PEG ](http://en.wikipedia.org/wiki/Parsing_expression_grammar ) (Parsing Expression Grammars) library. You can start using it right away just by including `peglib.h` in your project.
@ -33,7 +33,7 @@ The PEG syntax is well described on page 2 in the [document](http://www.brynosau
* `%recovery(` ... `)` (Error recovery operator)
* `exp⇑label` or `exp^label` (Syntax sugar for `(exp / %recover(label))` )
* `label { error_message "..." }` (Error message instruction)
* `{ no_ast_opt }` (No AST node optima zation instruction)
* `{ no_ast_opt }` (No AST node optimi zation instruction)
'End of Input' check will be done as default. In order to disable the check, please call `disable_eoi_check` .
@ -59,8 +59,8 @@ int main(void) {
// (2) Make a parser
parser parser(R"(
# Grammar for Calculator...
Additive < - Multitive ' + ' Additive / Multitive
Multitive < - Primary ' * ' Multitive / Primary
Additive < - Multiplica tive ' + ' Additive / Multiplica tive
Multiplica tive < - Primary ' * ' Multiplica tive / Primary
Primary < - ' ( ' Additive ' ) ' / Number
Number < - < [ 0-9 ] + >
%whitespace < - [ \t]*
@ -71,16 +71,16 @@ int main(void) {
// (3) Setup actions
parser["Additive"] = [](const SemanticValues & vs) {
switch (vs.choice()) {
case 0: // "Multitive '+' Additive"
case 0: // "Multiplica tive '+' Additive"
return any_cast< int > (vs[0]) + any_cast< int > (vs[1]);
default: // "Multitive"
default: // "Multiplica tive"
return any_cast< int > (vs[0]);
}
};
parser["Multitive"] = [](const SemanticValues & vs) {
parser["Multiplica tive"] = [](const SemanticValues & vs) {
switch (vs.choice()) {
case 0: // "Primary '*' Multitive"
case 0: // "Primary '*' Multiplica tive"
return any_cast< int > (vs[0]) * any_cast< int > (vs[1]);
default: // "Primary"
return any_cast< int > (vs[0]);
@ -106,8 +106,8 @@ To show syntax errors in grammar text:
```cpp
auto grammar = R"(
# Grammar for Calculator...
Additive < - Multitive ' + ' Additive / Multitive
Multitive < - Primary ' * ' Multitive / Primary
Additive < - Multiplica tive ' + ' Additive / Multiplica tive
Multiplica tive < - Primary ' * ' Multiplica tive / Primary
Primary < - ' ( ' Additive ' ) ' / Number
Number < - < [ 0-9 ] + >
%whitespace < - [ \t]*
@ -447,8 +447,8 @@ NOTE: An AST node holds a corresponding token as `std::string_vew` for performan
```
peg::parser parser(R"(
...
defe nition1 < - . . . { no_ast_opt }
defe nition2 < - . . . { no_ast_opt }
defi nition1 < - . . . { no_ast_opt }
defi nition2 < - . . . { no_ast_opt }
...
)");
@ -659,27 +659,27 @@ usage: grammar_file_path [source_file_path]
```
> cat a.peg
Additive < - Multitive ' + ' Additive / Multitive
Multitive < - Primary ' * ' Multitive / Primary
Additive < - Multiplica tive ' + ' Additive / Multiplica tive
Multiplica tive < - Primary ' * ' Multiplica tive / Primary
Primary < - ' ( ' Additive ' ) ' / Number
%whitespace < - [ \t\r\n]*
> peglint a.peg
[comme ndline]:3:35: 'Number' is not defined.
[comma ndline]:3:35: 'Number' is not defined.
```
### Source check
```
> cat a.peg
Additive < - Multitive ' + ' Additive / Multitive
Multitive < - Primary ' * ' Multitive / Primary
Additive < - Multiplica tive ' + ' Additive / Multiplica tive
Multiplica tive < - Primary ' * ' Multiplica tive / Primary
Primary < - ' ( ' Additive ' ) ' / Number
Number < - < [ 0-9 ] + >
%whitespace < - [ \t\r\n]*
> peglint --source "1 + a * 3" a.peg
[comme ndline]:1:3: syntax error
[comma ndline]:1:3: syntax error
```
### AST
@ -690,57 +690,57 @@ Number <- < [0-9]+ >
> peglint --ast a.peg a.txt
+ Additive
+ Multitive
+ Multiplica tive
+ Primary
- Number (1)
+ Additive
+ Multitive
+ Multiplica tive
+ Primary
- Number (2)
+ Multitive
+ Multiplica tive
+ Primary
- Number (3)
```
### AST optima zation
### AST optimi zation
```
> peglint --ast --opt --source "1 + 2 * 3" a.peg
+ Additive
- Multitive[Number] (1)
+ Additive[Multitive]
- Multiplica tive[Number] (1)
+ Additive[Multiplica tive]
- Primary[Number] (2)
- Multitive[Number] (3)
- Multiplica tive[Number] (3)
```
### Adjust AST optima zation with `no_ast_opt` instruction
### Adjust AST optimi zation with `no_ast_opt` instruction
```
> cat a.peg
Additive < - Multitive ' + ' Additive / Multitive
Multitive < - Primary ' * ' Multitive / Primary
Additive < - Multiplica tive ' + ' Additive / Multiplica tive
Multiplica tive < - Primary ' * ' Multiplica tive / Primary
Primary < - ' ( ' Additive ' ) ' / Number { no_ast_opt }
Number < - < [ 0-9 ] + >
%whitespace < - [ \t\r\n]*
> peglint --ast --opt --source "1 + 2 * 3" a.peg
+ Additive/0
+ Multitive/1[Primary]
+ Multiplica tive/1[Primary]
- Number (1)
+ Additive/1[Multitive]
+ Additive/1[Multiplica tive]
+ Primary/1
- Number (2)
+ Multitive/1[Primary]
+ Multiplica tive/1[Primary]
- Number (3)
> peglint --ast --opt-only --source "1 + 2 * 3" a.peg
+ Additive/0
+ Multitive/1
+ Multiplica tive/1
- Primary/1[Number] (1)
+ Additive/1
+ Multitive/0
+ Multiplica tive/0
- Primary/1[Number] (2)
+ Multitive/1
+ Multiplica tive/1
- Primary/1[Number] (3)
```