From ba1918b6d3ba00e952b77bd274e6e85751c33153 Mon Sep 17 00:00:00 2001 From: Harold Dost Date: Sat, 4 Mar 2023 16:51:39 +0100 Subject: [PATCH] promql: Add a Makefile target for goyacc * Add documentation for goyacc as relevant * Ignore the y.output since it's not needed for build process. Signed-off-by: Harold Dost --- .gitignore | 3 +++ CONTRIBUTING.md | 17 +++++++++++++++++ Makefile | 11 +++++++++++ 3 files changed, 31 insertions(+) diff --git a/.gitignore b/.gitignore index a63f49951..6ccfb146d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ npm_licenses.tar.bz2 /.build /**/node_modules + +# Ignore parser debug +y.output diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 16fc40712..2fbed3880 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,3 +78,20 @@ GO111MODULE=on go mod tidy ``` You have to commit the changes to `go.mod` and `go.sum` before submitting the pull request. + +## Working with the PromQL parser + +The PromQL parser grammar is located in `promql/parser/generated_parser.y` and it can be built using `make parser`. +The parser is built using [goyacc](https://pkg.go.dev/golang.org/x/tools/cmd/goyacc) + +If doing some sort of debugging, then it is possible to add some verbose output. After generating the parser, then you +can modify the the `./promql/parser/generated_parser.y.go` manually. + +```golang +// As of writing this was somewhere around line 600. +var ( + yyDebug = 0 // This can be be a number 0 -> 5. + yyErrorVerbose = false // This can be set to true. +) + +``` diff --git a/Makefile b/Makefile index dd51d5817..e345c1a88 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,17 @@ assets-tarball: assets @echo '>> packaging assets' scripts/package_assets.sh +# We only want to generate the parser when there's changes to the grammar. +.PHONY: parser +parser: + @echo ">> running goyacc to generate the .go file." +ifeq (, $(shell which goyacc)) + @echo "goyacc not installed so skipping" + @echo "To install: go install golang.org/x/tools/cmd/goyacc@v0.6.0" +else + goyacc -o promql/parser/generated_parser.y.go promql/parser/generated_parser.y +endif + .PHONY: test # If we only want to only test go code we have to change the test target # which is called by all.