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.
go install github.com/pointlander/peg@latest
go generate && go build
./peg -h
This creates the file peg.peg.go
:
./peg -inline -switch peg.peg
This example Makefile
will convert any file ending with .peg
into a .go
file with the same name:
.SUFFIXES: .peg .go
.peg.go:
peg -noast -switch -inline -strict -output $@ $<
all: grammar.go
- Golang, see go.mod for version
- golangci-lint latest version (v2 or later)
- Bash 3.2.x or higher
Bootstrap and generate grammar *.peg.go. This commands should initially be executed once before other commands.
go generate
bootstrap/main.go
- bootstrap syntax tree of pegtree/peg.go
- syntax tree and code generatorpeg.peg
- peg in its own language
go build
(go generate
required once beforehand)
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
go test -short ./...
(go generate
required once beforehand)
golangci-lint run
(go generate
required once beforehand)
golangci-lint fmt
go test -benchmem -bench .
(go generate
required once beforehand)
Andrew Snodgrass