https://github.com/pointlander/peg
Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.
https://github.com/pointlander/peg
Last synced: 22 days ago
JSON representation
Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.
- Host: GitHub
- URL: https://github.com/pointlander/peg
- Owner: pointlander
- License: bsd-3-clause
- Created: 2010-04-25T21:20:46.000Z (about 16 years ago)
- Default Branch: main
- Last Pushed: 2025-11-10T14:04:55.000Z (6 months ago)
- Last Synced: 2026-01-02T12:46:14.625Z (4 months ago)
- Language: Go
- Homepage:
- Size: 745 KB
- Stars: 1,093
- Watchers: 26
- Forks: 127
- Open Issues: 36
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Authors: AUTHORS
Awesome Lists containing this project
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-compilers - Peg - A PEG parser generator for Go, supports grammar rule definitions. (Golang)
- fucking-awesome-go - :octocat: peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. :star: 295 :fork_and_knife: 44 (Software Packages / Other Software)
- awesome-ccamel - pointlander/peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Go)
- awesome-go-cn - peg
- go-awesome-with-star-updatetime - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. - ★ 527 (Software Packages)
- awesome-go - pointlander/peg
- awesome-go-cn - peg
- awesome-go-cn - peg
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go-zh - peg
- awesome-go-plus - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.  (Software Packages / Other Software)
- awesome-go-with-stars - peg - 11-10 | (Go Tools / Other Software)
- awesome-go-processed - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.| (Software Packages / Other Software)
- awesome-go - peg - | - | - | (Software Packages / Other Software)
- awesome-go-cn - peg
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go-info - peg
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go-extra - peg - 04-25T21:20:46Z|2021-08-22T22:12:48Z| (Go Tools / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. Stars:`1.1K`. (Software Packages / Other Software)
- fucking-awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-Char - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. (Software Packages / Other Software)
- awesome-go - peg - Peg, Parsing Expression Grammar, is an implementation of a Packrat parser generator. - :arrow_down:0 - :star:311 (Software Packages / Other Software)
README
# PEG, an Implementation of a Packrat Parsing Expression Grammar in Go
[](https://pkg.go.dev/github.com/pointlander/peg)
[](https://goreportcard.com/report/github.com/pointlander/peg)
A [Parsing Expression Grammar](https://en.wikipedia.org/wiki/Parsing_expression_grammar) ( hence `peg`) is a way to create grammars similar in principle to [regular expressions](https://en.wikipedia.org/wiki/Regular_expression) but which allow better code integration. Specifically, `peg` is an implementation of the [Packrat](https://en.wikipedia.org/wiki/Parsing_expression_grammar#Implementing_parsers_from_parsing_expression_grammars) parser generator originally implemented as [peg/leg](https://www.piumarta.com/software/peg/) by [Ian Piumarta](https://www.piumarta.com/cv/) in C. A Packrat parser is a "descent recursive parser" capable of backtracking and negative look-ahead assertions which are problematic for regular expression engines.
## Installation
```
go install github.com/pointlander/peg@latest
```
## Usage
### Build executable
```
go generate && go build
```
### Help
```
./peg -h
```
### Example
This creates the file `peg.peg.go`:
```
./peg -inline -switch peg.peg
```
## PEG file syntax
See [peg-file-syntax.md](docs/peg-file-syntax.md)
## Development
### Requirements
* [Golang](https://golang.org/doc/install), see [go.mod](go.mod) for version
* [golangci-lint latest version](https://github.com/golangci/golangci-lint#install) (v2 or later)
* [Bash 3.2.x or higher](https://www.gnu.org/software/bash)
### Generate
Bootstrap and generate grammar *.peg.go. This commands should initially be executed once before other commands.
```
go generate
```
### Build
```
go build
```
([`go generate`](#generate) required once beforehand)
#### Set version
Use the version from the tag if the current commit has a tag. If not use the current commit hash.
```
go build -ldflags "-X main.Version=$(git describe --tags --exact-match 2>/dev/null || git rev-parse --short HEAD)"
```
Additionally, since [Go 1.18](https://go.dev/doc/go1.18) the go command embeds version control information. Read the information:
```
go version -m peg
```
### Test
```
go test -short ./...
```
([`go generate`](#generate) required once beforehand)
### Lint
```
golangci-lint run
```
([`go generate`](#generate) required once beforehand)
### Format
```
golangci-lint fmt
```
### Benchmark
```
go test -benchmem -bench .
```
([`go generate`](#generate) required once beforehand)
## Author
Andrew Snodgrass