From 0ba33d2f98ebc3591635baddda8ee04b435fe149 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Apr 2026 20:34:00 +0000 Subject: [PATCH 1/4] Add GitHub Actions workflow for Go build and test Runs `make parser` to generate the yacc-derived parser sources, then `go build ./...` and `go test ./...` on push and pull_request. --- .github/workflows/go.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/go.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..35d8444 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,27 @@ +name: Go + +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.25' + + - name: Generate parser + run: make parser + + - name: Build + run: go build ./... + + - name: Test + run: go test ./... From a812b3e71b6a225b6383ea5a3770da7d0836167b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Apr 2026 20:36:05 +0000 Subject: [PATCH 2/4] Run Go workflow on all pull requests --- .github/workflows/go.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 35d8444..4a91673 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -4,7 +4,6 @@ on: push: branches: [main, master] pull_request: - branches: [main, master] jobs: build: From a5c179f0b72ab66abf4bf343cb06da5219a1c800 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Apr 2026 20:39:13 +0000 Subject: [PATCH 3/4] Fix Makefile paths after parser sources moved into parser/ The .y grammars and generated .go files now live in parser/, so update the parser, generate, fmt, and clean targets to point at the new locations. The %arser.go pattern rule didn't compose cleanly with a directory prefix, so it's split into explicit parser/parser.go and parser/hintparser.go rules. genkeyword is built into parser/ so the //go:generate ./genkeyword directive in parser/generate.go resolves. --- Makefile | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index f7a203f..9cb36d5 100644 --- a/Makefile +++ b/Makefile @@ -5,32 +5,36 @@ all: fmt parser generate test: fmt parser sh test.sh -parser: parser.go hintparser.go +parser: parser/parser.go parser/hintparser.go genkeyword: generate_keyword/genkeyword.go - go build -C generate_keyword -o ../genkeyword + go build -C generate_keyword -o ../parser/genkeyword -generate: genkeyword parser.y - go generate +generate: genkeyword parser/parser.y + go generate ./parser/... -%arser.go: prefix = $(@:parser.go=) -%arser.go: %arser.y bin/goyacc - @echo "bin/goyacc -o $@ -p yy$(prefix) -t $(prefix)Parser $<" - @bin/goyacc -o $@ -p yy$(prefix) -t $(prefix)Parser $< || ( rm -f $@ && echo 'Please check y.output for more information' && exit 1 ) +parser/parser.go: parser/parser.y bin/goyacc + @echo "bin/goyacc -o $@ -p yy -t Parser $<" + @bin/goyacc -o $@ -p yy -t Parser $< || ( rm -f $@ && echo 'Please check y.output for more information' && exit 1 ) @rm -f y.output -%arser_golden.y: %arser.y +parser/hintparser.go: parser/hintparser.y bin/goyacc + @echo "bin/goyacc -o $@ -p yyhint -t hintParser $<" + @bin/goyacc -o $@ -p yyhint -t hintParser $< || ( rm -f $@ && echo 'Please check y.output for more information' && exit 1 ) + @rm -f y.output + +parser/%arser_golden.y: parser/%arser.y @bin/goyacc -fmt -fmtout $@ $< @(git diff --no-index --exit-code $< $@ && rm $@) || (mv $@ $< && >&2 echo "formatted $<" && exit 1) bin/goyacc: goyacc/main.go goyacc/format_yacc.go GO111MODULE=on go build -o bin/goyacc goyacc/main.go goyacc/format_yacc.go -fmt: bin/goyacc parser_golden.y hintparser_golden.y +fmt: bin/goyacc parser/parser_golden.y parser/hintparser_golden.y @echo "gofmt (simplify)" @gofmt -s -l -w . 2>&1 | awk '{print} END{if(NR>0) {exit 1}}' clean: go clean -i ./... rm -rf *.out - rm -f parser.go hintparser.go + rm -f parser/parser.go parser/hintparser.go parser/genkeyword From 94a81a3da3268977de0fd9bea5b4cf0fcbcbc10f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Apr 2026 20:40:39 +0000 Subject: [PATCH 4/4] Fail CI when committed parser sources are out of date Regenerate parser.go and hintparser.go from the .y grammars on every run, then `git diff --exit-code` against the working tree. If the committed files don't match a fresh `make parser`, the job fails with a hint to rerun and commit. --- .github/workflows/go.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 4a91673..d4299d1 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -16,8 +16,17 @@ jobs: with: go-version: '1.25' - - name: Generate parser - run: make parser + - name: Regenerate parser + run: | + rm -f parser/parser.go parser/hintparser.go + make parser + + - name: Verify parser is up to date + run: | + if ! git diff --exit-code -- parser/parser.go parser/hintparser.go; then + echo "::error::Generated parser files are out of date. Run 'make parser' and commit the result." + exit 1 + fi - name: Build run: go build ./...