2015-11-30 04:16:51 +00:00
|
|
|
peglint
|
|
|
|
-------
|
|
|
|
|
|
|
|
The lint utility for PEG.
|
|
|
|
|
|
|
|
```
|
2020-05-26 02:48:42 +00:00
|
|
|
usage: grammar_file_path [source_file_path]
|
|
|
|
|
|
|
|
options:
|
|
|
|
--ast: show AST tree
|
2021-01-24 03:58:23 +00:00
|
|
|
--packrat: enable packrat memoise
|
2021-01-22 02:16:47 +00:00
|
|
|
--opt, --opt-all: optimaze all AST nodes except nodes selected with `no_ast_opt` instruction
|
|
|
|
--opt-only: optimaze only AST nodes selected with `no_ast_opt` instruction
|
2020-05-26 02:48:42 +00:00
|
|
|
--source: source text
|
2022-05-27 04:06:27 +00:00
|
|
|
--trace: show concise trace messages
|
|
|
|
--trace-verbose: show verbose trace messages
|
2022-06-03 02:15:09 +00:00
|
|
|
--profile: show profile report
|
2020-05-26 02:48:42 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
### Build peglint
|
|
|
|
|
|
|
|
```
|
|
|
|
> cd lint
|
|
|
|
> mkdir build
|
|
|
|
> cd build
|
|
|
|
> cmake ..
|
|
|
|
> make
|
|
|
|
```
|
|
|
|
|
|
|
|
### Lint grammar
|
|
|
|
|
|
|
|
```
|
|
|
|
> cat a.peg
|
|
|
|
A <- 'hello' ^ 'world'
|
|
|
|
|
|
|
|
> peglint a.peg
|
2021-01-16 22:34:09 +00:00
|
|
|
a.peg:1:16: syntax error
|
2020-05-26 02:48:42 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
> cat a.peg
|
|
|
|
A <- B
|
|
|
|
|
|
|
|
> peglint a.peg
|
|
|
|
a.peg:1:6: 'B' is not defined.
|
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
> cat a.peg
|
|
|
|
A <- B / C
|
|
|
|
B <- 'b'
|
|
|
|
C <- A
|
|
|
|
|
|
|
|
> peglint a.peg
|
|
|
|
a.peg:1:10: 'C' is left recursive.
|
|
|
|
a.peg:3:6: 'A' is left recursive.
|
|
|
|
```
|
|
|
|
|
|
|
|
### Lint source text
|
|
|
|
|
|
|
|
```
|
|
|
|
> cat a.peg
|
|
|
|
Additive <- Multitive '+' Additive / Multitive
|
|
|
|
Multitive <- Primary '*' Multitive / Primary
|
|
|
|
Primary <- '(' Additive ')' / Number
|
|
|
|
Number <- < [0-9]+ >
|
|
|
|
%whitespace <- [ \t\r\n]*
|
|
|
|
|
|
|
|
> peglint --source "1 + a * 3" a.peg
|
|
|
|
[commendline]:1:3: syntax error
|
|
|
|
```
|
|
|
|
|
2021-01-22 02:16:47 +00:00
|
|
|
### AST
|
|
|
|
|
2020-05-26 02:48:42 +00:00
|
|
|
```
|
|
|
|
> cat a.txt
|
|
|
|
1 + 2 * 3
|
|
|
|
|
|
|
|
> peglint --ast a.peg a.txt
|
|
|
|
+ Additive
|
|
|
|
+ Multitive
|
|
|
|
+ Primary
|
|
|
|
- Number (1)
|
|
|
|
+ Additive
|
|
|
|
+ Multitive
|
|
|
|
+ Primary
|
|
|
|
- Number (2)
|
|
|
|
+ Multitive
|
|
|
|
+ Primary
|
|
|
|
- Number (3)
|
|
|
|
```
|
|
|
|
|
2021-01-22 02:16:47 +00:00
|
|
|
### AST optimazation
|
|
|
|
|
2020-05-26 02:48:42 +00:00
|
|
|
```
|
|
|
|
> peglint --ast --opt --source "1 + 2 * 3" a.peg
|
|
|
|
+ Additive
|
|
|
|
- Multitive[Number] (1)
|
|
|
|
+ Additive[Multitive]
|
|
|
|
- Primary[Number] (2)
|
|
|
|
- Multitive[Number] (3)
|
|
|
|
```
|
|
|
|
|
2021-01-22 02:16:47 +00:00
|
|
|
### Adjust AST optimazation with `no_ast_opt` instruction
|
|
|
|
|
2020-05-26 02:48:42 +00:00
|
|
|
```
|
2021-01-22 02:16:47 +00:00
|
|
|
> cat a.peg
|
|
|
|
Additive <- Multitive '+' Additive / Multitive
|
|
|
|
Multitive <- Primary '*' Multitive / Primary
|
|
|
|
Primary <- '(' Additive ')' / Number { no_ast_opt }
|
|
|
|
Number <- < [0-9]+ >
|
|
|
|
%whitespace <- [ \t\r\n]*
|
|
|
|
|
|
|
|
> peglint --ast --opt --source "1 + 2 * 3" a.peg
|
2020-05-26 02:48:42 +00:00
|
|
|
+ Additive/0
|
|
|
|
+ Multitive/1[Primary]
|
|
|
|
- Number (1)
|
|
|
|
+ Additive/1[Multitive]
|
|
|
|
+ Primary/1
|
|
|
|
- Number (2)
|
|
|
|
+ Multitive/1[Primary]
|
|
|
|
- Number (3)
|
|
|
|
|
2021-01-22 02:16:47 +00:00
|
|
|
> peglint --ast --opt-only --source "1 + 2 * 3" a.peg
|
2020-05-26 02:48:42 +00:00
|
|
|
+ Additive/0
|
|
|
|
+ Multitive/1
|
|
|
|
- Primary/1[Number] (1)
|
|
|
|
+ Additive/1
|
|
|
|
+ Multitive/0
|
|
|
|
- Primary/1[Number] (2)
|
|
|
|
+ Multitive/1
|
|
|
|
- Primary/1[Number] (3)
|
2015-11-30 04:16:51 +00:00
|
|
|
```
|