diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..d4299d1 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,35 @@ +name: Go + +on: + push: + branches: [main, master] + pull_request: + +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: 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 ./... + + - name: Test + run: go test ./... 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