PEG, an Implementation of a Packrat Parsing Expression Grammar in Go
May 21, 2026 ยท View on GitHub
A Parsing Expression Grammar ( hence peg) is a way to create grammars similar in principle to regular expressions but which allow better code integration. Specifically, peg is an implementation of the Packrat parser generator originally implemented as peg/leg by Ian Piumarta 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.
PEG file syntax
See peg-file-syntax.md for creating your own *.peg file.
Usage
-
Add
pegas a tool dependencygo get -tool github.com/pointlander/peg@main -
Create your
mygrammar.peg -
Add a
//go:generateline in a Go source of your package//go:generate go tool peg mygrammar.peg
Widespread community design pattern: Add lines like this in
doc.go. -
Generate
mygrammar.peg.gofrommygrammar.peggo generate
Example
This creates the file peg.peg.go
go tool peg -inline -switch peg.peg
Help
go tool peg -h
Development
Requirements
- Golang, see go.mod for version
- golangci-lint latest version (v2 or later)
- Bash 3.2.x or higher
Generate
Bootstrap and generate grammar *.peg.go. This commands should initially be executed once before other commands.
go generate
Build
go build
(go 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 the go command embeds version control information. Read the information:
go version -m peg
Test
go test -short ./...
(go generate required once beforehand)
Lint
golangci-lint run
(go generate required once beforehand)
Format
golangci-lint fmt
Benchmark
go test -benchmem -bench .
(go generate required once beforehand)
Author
Andrew Snodgrass