cpp-peglib/lint/README.md
Josh Soref 65ccaaa7c3
Spelling (#287)
* spelling: bracket

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: build

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: commandline

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: debugging

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: definition

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: editing

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: editors

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: github

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: grammar

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: multiplicative

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: optimization

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: optimize

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: semicolon

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: whitespace

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

---------

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2024-01-02 08:44:45 -05:00

2.4 KiB

peglint

The lint utility for PEG.

usage: grammar_file_path [source_file_path]

  options:
    --ast: show AST tree
    --packrat: enable packrat memoise
    --opt, --opt-all: optimize all AST nodes except nodes selected with `no_ast_opt` instruction
    --opt-only: optimize only AST nodes selected with `no_ast_opt` instruction
    --source: source text
    --trace: show concise trace messages
    --profile: show profile report
    --verbose: verbose output for trace and profile

Build peglint

> cd lint
> mkdir build
> cd build
> cmake ..
> make

Lint grammar

> cat a.peg
A <- 'hello' ^ 'world'

> peglint a.peg
a.peg:1:16: syntax error
> 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    <- Multiplicative '+' Additive / Multiplicative
Multiplicative   <- Primary '*' Multiplicative / Primary
Primary     <- '(' Additive ')' / Number
Number      <- < [0-9]+ >
%whitespace <- [ \t\r\n]*

> peglint --source "1 + a * 3" a.peg
[commandline]:1:3: syntax error

AST

> cat a.txt
1 + 2 * 3

> peglint --ast a.peg a.txt
+ Additive
  + Multiplicative
    + Primary
      - Number (1)
  + Additive
    + Multiplicative
      + Primary
        - Number (2)
      + Multiplicative
        + Primary
          - Number (3)

AST optimization

> peglint --ast --opt --source "1 + 2 * 3" a.peg
+ Additive
  - Multiplicative[Number] (1)
  + Additive[Multiplicative]
    - Primary[Number] (2)
    - Multiplicative[Number] (3)

Adjust AST optimization with no_ast_opt instruction

> cat a.peg
Additive    <- Multiplicative '+' Additive / Multiplicative
Multiplicative   <- Primary '*' Multiplicative / 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
  + Multiplicative/1[Primary]
    - Number (1)
  + Additive/1[Multiplicative]
    + Primary/1
      - Number (2)
    + Multiplicative/1[Primary]
      - Number (3)

> peglint --ast --opt-only --source "1 + 2 * 3" a.peg
+ Additive/0
  + Multiplicative/1
    - Primary/1[Number] (1)
  + Additive/1
    + Multiplicative/0
      - Primary/1[Number] (2)
      + Multiplicative/1
        - Primary/1[Number] (3)