From 62df3d5e9d3cc711b388ceae92e1abcf2c6ee809 Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 23 Apr 2024 14:22:28 +0200 Subject: [PATCH 1/3] Bump CI to GHC 9.10.0 and latest minor versions Building HTF with GHC 9.10 is stuck on - https://github.com/haskell/cabal/issues/9917 --- .github/workflows/haskell-ci.yml | 91 +++++++++---------- cabal.haskell-ci | 2 +- source/BNFC.cabal | 7 +- source/Makefile | 4 +- source/stack-9.6.yaml | 4 +- source/stack-9.8.yaml | 4 +- stack-9.6.yaml | 4 +- stack-9.8.yaml | 10 +- testing/bnfc-system-tests.cabal | 12 +-- .../479_LabelsCaseSensitive/good01.in | 1 + .../479_LabelsCaseSensitive/good01.out | 10 ++ .../479_LabelsCaseSensitive/test.cf | 10 ++ 12 files changed, 86 insertions(+), 73 deletions(-) create mode 100644 testing/regression-tests/479_LabelsCaseSensitive/good01.in create mode 100644 testing/regression-tests/479_LabelsCaseSensitive/good01.out create mode 100644 testing/regression-tests/479_LabelsCaseSensitive/test.cf diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml index 90975598..18b33418 100644 --- a/.github/workflows/haskell-ci.yml +++ b/.github/workflows/haskell-ci.yml @@ -8,20 +8,18 @@ # # For more information, see https://github.com/andreasabel/haskell-ci # -# version: 0.17.20231012 +# version: 0.19.20240422 # -# REGENDATA ("0.17.20231012",["github","cabal.project"]) +# REGENDATA ("0.19.20240422",["github","cabal.project"]) # name: Haskell-CI on: push: branches: - master - - ci* pull_request: branches: - master - - ci* jobs: linux: name: Haskell-CI - Linux - ${{ matrix.compiler }} @@ -29,24 +27,29 @@ jobs: timeout-minutes: 60 container: - image: buildpack-deps:focal + image: buildpack-deps:jammy continue-on-error: ${{ matrix.allow-failure }} strategy: matrix: include: - - compiler: ghc-9.8.1 + - compiler: ghc-9.10.0.20240413 compilerKind: ghc - compilerVersion: 9.8.1 + compilerVersion: 9.10.0.20240413 setup-method: ghcup allow-failure: false - - compiler: ghc-9.6.3 + - compiler: ghc-9.8.2 compilerKind: ghc - compilerVersion: 9.6.3 + compilerVersion: 9.8.2 setup-method: ghcup allow-failure: false - - compiler: ghc-9.4.7 + - compiler: ghc-9.6.5 compilerKind: ghc - compilerVersion: 9.4.7 + compilerVersion: 9.6.5 + setup-method: ghcup + allow-failure: false + - compiler: ghc-9.4.8 + compilerKind: ghc + compilerVersion: 9.4.8 setup-method: ghcup allow-failure: false - compiler: ghc-9.2.8 @@ -89,34 +92,18 @@ jobs: compilerVersion: 8.0.2 setup-method: ghcup allow-failure: false - - compiler: ghc-7.10.3 - compilerKind: ghc - compilerVersion: 7.10.3 - setup-method: hvr-ppa - allow-failure: false fail-fast: false steps: - name: apt run: | apt-get update apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 libnuma-dev - if [ "${{ matrix.setup-method }}" = ghcup ]; then - mkdir -p "$HOME/.ghcup/bin" - curl -sL https://downloads.haskell.org/ghcup/0.1.19.5/x86_64-linux-ghcup-0.1.19.5 > "$HOME/.ghcup/bin/ghcup" - chmod a+x "$HOME/.ghcup/bin/ghcup" - "$HOME/.ghcup/bin/ghcup" config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml; - "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false) - "$HOME/.ghcup/bin/ghcup" install cabal 3.10.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false) - else - apt-add-repository -y 'ppa:hvr/ghc' - apt-get update - apt-get install -y "$HCNAME" - mkdir -p "$HOME/.ghcup/bin" - curl -sL https://downloads.haskell.org/ghcup/0.1.19.5/x86_64-linux-ghcup-0.1.19.5 > "$HOME/.ghcup/bin/ghcup" - chmod a+x "$HOME/.ghcup/bin/ghcup" - "$HOME/.ghcup/bin/ghcup" config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml; - "$HOME/.ghcup/bin/ghcup" install cabal 3.10.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false) - fi + mkdir -p "$HOME/.ghcup/bin" + curl -sL https://downloads.haskell.org/ghcup/0.1.20.0/x86_64-linux-ghcup-0.1.20.0 > "$HOME/.ghcup/bin/ghcup" + chmod a+x "$HOME/.ghcup/bin/ghcup" + "$HOME/.ghcup/bin/ghcup" config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.8.yaml; + "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false) + "$HOME/.ghcup/bin/ghcup" install cabal 3.10.3.0 || (cat "$HOME"/.ghcup/logs/*.* && false) env: HCKIND: ${{ matrix.compilerKind }} HCNAME: ${{ matrix.compiler }} @@ -128,27 +115,18 @@ jobs: echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV" echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV" HCDIR=/opt/$HCKIND/$HCVER - if [ "${{ matrix.setup-method }}" = ghcup ]; then - HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER") - HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#') - HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#') - echo "HC=$HC" >> "$GITHUB_ENV" - echo "HCPKG=$HCPKG" >> "$GITHUB_ENV" - echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV" - echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.1.0 -vnormal+nowrap" >> "$GITHUB_ENV" - else - HC=$HCDIR/bin/$HCKIND - echo "HC=$HC" >> "$GITHUB_ENV" - echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV" - echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV" - echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.1.0 -vnormal+nowrap" >> "$GITHUB_ENV" - fi - + HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER") + HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#') + HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#') + echo "HC=$HC" >> "$GITHUB_ENV" + echo "HCPKG=$HCPKG" >> "$GITHUB_ENV" + echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV" + echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.3.0 -vnormal+nowrap" >> "$GITHUB_ENV" HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))') echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV" echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV" echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV" - echo "HEADHACKAGE=false" >> "$GITHUB_ENV" + if [ $((HCNUMVER >= 91000)) -ne 0 ] ; then echo "HEADHACKAGE=true" >> "$GITHUB_ENV" ; else echo "HEADHACKAGE=false" >> "$GITHUB_ENV" ; fi echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV" echo "GHCJSARITH=0" >> "$GITHUB_ENV" env: @@ -177,8 +155,18 @@ jobs: repository hackage.haskell.org url: http://hackage.haskell.org/ EOF + if $HEADHACKAGE; then cat >> $CABAL_CONFIG <= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi cat >> cabal.project <> cabal.project + fi $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(BNFC|bnfc-system-tests)$/; }' >> cabal.project.local cat cabal.project cat cabal.project.local diff --git a/cabal.haskell-ci b/cabal.haskell-ci index 7b88abe7..bad5b022 100644 --- a/cabal.haskell-ci +++ b/cabal.haskell-ci @@ -1,7 +1,7 @@ -- -- The name of GitHub Action -- github-action-name: -branches: master ci* +branches: master -- 2021-01-22 if cabal-version is greater than shipped Cabal, allow newer Cabal version -- https://github.com/haskell-CI/haskell-ci/issues/468#issuecomment-761865807 diff --git a/source/BNFC.cabal b/source/BNFC.cabal index 0b1c8266..c5397e26 100644 --- a/source/BNFC.cabal +++ b/source/BNFC.cabal @@ -32,8 +32,9 @@ Description: -- Support range when build with cabal tested-with: - GHC == 9.8.1 - GHC == 9.6.3 + GHC == 9.10.0 + GHC == 9.8.2 + GHC == 9.6.5 GHC == 9.4.8 GHC == 9.2.8 GHC == 9.0.2 @@ -43,7 +44,7 @@ tested-with: GHC == 8.4.4 GHC == 8.2.2 GHC == 8.0.2 - GHC == 7.10.3 + -- GHC == 7.10.3 extra-doc-files: README.md diff --git a/source/Makefile b/source/Makefile index 6849b7b1..4c3ae3bb 100644 --- a/source/Makefile +++ b/source/Makefile @@ -8,7 +8,7 @@ CABAL_BUILDDIR_SUFFIX= CABAL_BUILD_OPTS = --enable-tests # --builddir=dist-ghc-$(GHC_VERSION)$(CABAL_BUILDDIR_SUFFIX) CABAL_CONFIGURE_OPTS = --enable-tests -CABAL_INSTALL_OPTS = $(CABAL_CONFIGURE_OPTS) $(CABAL_BUILD_OPTS) --overwrite-policy=always +CABAL_INSTALL_OPTS = --overwrite-policy=always CABAL_TEST_OPTS = $(CABAL_BUILD_OPTS) CABAL = cabal $(CABAL_OPTS) @@ -38,7 +38,7 @@ cabal-test: doctest: build doctest-install doctest-quick doctest-install: - cabal install doctest --program-suffix=-${GHC_VERSION} + cabal install doctest --ignore-project --program-suffix=-${GHC_VERSION} doctest-quick: cabal repl -w doctest-${GHC_VERSION} --repl-options=-Wno-type-defaults diff --git a/source/stack-9.6.yaml b/source/stack-9.6.yaml index 54648e91..ab2e280e 100644 --- a/source/stack-9.6.yaml +++ b/source/stack-9.6.yaml @@ -1,3 +1,3 @@ -resolver: lts-22.0 -compiler: ghc-9.6.3 +resolver: lts-22.18 +compiler: ghc-9.6.4 compiler-check: newer-minor diff --git a/source/stack-9.8.yaml b/source/stack-9.8.yaml index 4d024947..e77beb4a 100644 --- a/source/stack-9.8.yaml +++ b/source/stack-9.8.yaml @@ -1,5 +1,5 @@ -resolver: nightly-2023-12-19 -compiler: ghc-9.8.1 +resolver: nightly-2024-04-22 +compiler: ghc-9.8.2 compiler-check: newer-minor packages: diff --git a/stack-9.6.yaml b/stack-9.6.yaml index d7f14d91..869935f5 100644 --- a/stack-9.6.yaml +++ b/stack-9.6.yaml @@ -1,5 +1,5 @@ -resolver: lts-22.0 -compiler: ghc-9.6.3 +resolver: lts-22.18 +compiler: ghc-9.6.4 compiler-check: newer-minor packages: diff --git a/stack-9.8.yaml b/stack-9.8.yaml index 205c3841..37e107ee 100644 --- a/stack-9.8.yaml +++ b/stack-9.8.yaml @@ -1,11 +1,11 @@ -resolver: nightly-2023-12-19 -compiler: ghc-9.8.1 +resolver: nightly-2024-04-22 +compiler: ghc-9.8.2 compiler-check: newer-minor packages: - source - testing -extra-deps: -- aeson-2.2.1.0 -- th-abstraction-0.6.0.0 +# extra-deps: +# - aeson-2.2.1.0 +# - th-abstraction-0.6.0.0 diff --git a/testing/bnfc-system-tests.cabal b/testing/bnfc-system-tests.cabal index 81bcc52d..ec6caaef 100644 --- a/testing/bnfc-system-tests.cabal +++ b/testing/bnfc-system-tests.cabal @@ -50,9 +50,10 @@ build-type: Simple cabal-version: >=1.10 tested-with: - GHC == 9.8.1 - GHC == 9.6.3 - GHC == 9.4.7 + GHC == 9.10.0 + GHC == 9.8.2 + GHC == 9.6.5 + GHC == 9.4.8 GHC == 9.2.8 GHC == 9.0.2 GHC == 8.10.7 @@ -88,10 +89,9 @@ executable bnfc-system-tests , HUnit >= 1.2 , shelly >= 1.9 , filepath - -- filepath >= 1.4.2.1 , text - , HTF >= 0.14.0.5 - -- API change in HTF-0.15.0.0 (issue #416) + , HTF >= 0.15.0.0 + -- API change in HTF-0.15 (issue #416) , random , string-qq diff --git a/testing/regression-tests/479_LabelsCaseSensitive/good01.in b/testing/regression-tests/479_LabelsCaseSensitive/good01.in new file mode 100644 index 00000000..27969d2b --- /dev/null +++ b/testing/regression-tests/479_LabelsCaseSensitive/good01.in @@ -0,0 +1 @@ +2 ^ (2 ** 2) \ No newline at end of file diff --git a/testing/regression-tests/479_LabelsCaseSensitive/good01.out b/testing/regression-tests/479_LabelsCaseSensitive/good01.out new file mode 100644 index 00000000..96ac70f2 --- /dev/null +++ b/testing/regression-tests/479_LabelsCaseSensitive/good01.out @@ -0,0 +1,10 @@ + +Parse Successful! + +[Abstract Syntax] + +Eexp (EInt 2) (EExp (EInt 2) (EInt 2)) + +[Linearized tree] + +2 ^ (2 ** 2) diff --git a/testing/regression-tests/479_LabelsCaseSensitive/test.cf b/testing/regression-tests/479_LabelsCaseSensitive/test.cf new file mode 100644 index 00000000..07062e2b --- /dev/null +++ b/testing/regression-tests/479_LabelsCaseSensitive/test.cf @@ -0,0 +1,10 @@ +-- Andreas, 2024-04-23, issue #479: +-- Support case-variants in labels also in the C backend. + +Eexp. Exp ::= Exp "^" Exp1 ; +EExp. Exp ::= Exp "**" Exp1 ; +EInt. Exp1 ::= Integer ; + +coercions Exp 1 ; + +comment "--" ; From 62398aff2f11c157c9d717f46280494aba03062d Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 23 Apr 2024 14:48:20 +0200 Subject: [PATCH 2/3] bnfc-system-tests: C: turn off a warning for newer bison --- testing/src/ParameterizedTests.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/src/ParameterizedTests.hs b/testing/src/ParameterizedTests.hs index 16215fee..cef7e0d7 100644 --- a/testing/src/ParameterizedTests.hs +++ b/testing/src/ParameterizedTests.hs @@ -366,7 +366,7 @@ parameters = concat , [ TP { tpName = "C" , tpBnfcOptions = ["--c"] , tpBuild = do - let flags = "CC_OPTS=-Wstrict-prototypes -Werror" + let flags = "CC_OPTS=-Wstrict-prototypes -Wno-sign-compare -Werror" tpMake [flags] tpMake [flags, "Skeleton.o"] , tpRunTestProg = \ lang args -> do From bfb34ee05b1005ab1bda43b25a95da8cbf9d3375 Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 23 Apr 2024 14:49:44 +0200 Subject: [PATCH 3/3] Fix #479: C: case-sensitive labels: preserve case in union member names Java does not suffer case-sensitive labels as each label becomes a class in its own file. Thus, we check this and throw an error. Consequently, test 479_LabelsCaseSensitive is broken for the java backends. --- source/CHANGELOG.md | 2 ++ source/src/BNFC/Backend/C/CFtoCAbs.hs | 30 +++++++++-------------- source/src/BNFC/Backend/C/CFtoCPrinter.hs | 9 ++++--- source/src/BNFC/Backend/C/CFtoCSkel.hs | 14 +++++------ source/src/BNFC/Backend/C/Common.hs | 9 ++++++- source/src/BNFC/GetCF.hs | 10 +++++--- testing/src/ParameterizedTests.hs | 6 +++-- 7 files changed, 45 insertions(+), 35 deletions(-) diff --git a/source/CHANGELOG.md b/source/CHANGELOG.md index 2bebf2bc..7fa13f6d 100644 --- a/source/CHANGELOG.md +++ b/source/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +* C: preserve case in constructors (union): e.g. label `EInt` now is union member `eInt_` rather than `eint_` + [[#479](https://github.com/BNFC/bnfc/issues/479)] # 2.9.5 diff --git a/source/src/BNFC/Backend/C/CFtoCAbs.hs b/source/src/BNFC/Backend/C/CFtoCAbs.hs index b906ca85..3d69d3bc 100644 --- a/source/src/BNFC/Backend/C/CFtoCAbs.hs +++ b/source/src/BNFC/Backend/C/CFtoCAbs.hs @@ -35,7 +35,7 @@ import BNFC.PrettyPrint import BNFC.Options ( RecordPositions(..) ) import BNFC.Utils ( (+++), unless ) import BNFC.Backend.Common.NamedVariables -import BNFC.Backend.C.Common ( posixC ) +import BNFC.Backend.C.Common ( posixC, memName ) -- | The result is two files (.H file, .C file) @@ -304,12 +304,12 @@ mkCFile datas _cf = concat -- switch(p->kind) -- { -- case is_EInt: --- return make_EInt (p->u.eint_.integer_); +-- return make_EInt (p->u.eInt_.integer_); -- -- case is_EAdd: -- return make_EAdd --- ( clone_Exp(p->u.eadd_.exp_1) --- , clone_Exp(p->u.eadd_.exp_2) +-- ( clone_Exp(p->u.eAdd_.exp_1) +-- , clone_Exp(p->u.eAdd_.exp_2) -- ); -- -- default: @@ -375,7 +375,7 @@ prCloneC (cat, rules) prCloneCat :: String -> (Cat, Doc) -> String prCloneCat fnm (cat, nt) = cloner cat member where - member = concat [ "p->u.", map toLower fnm, "_.", render nt ] + member = concat [ "p->u.", memName fnm, ".", render nt ] -- | Clone or not depending on the category. -- Only pointers need to be cloned. @@ -401,8 +401,8 @@ cloner cat x = -- break; -- -- case is_EAdd: --- free_Exp(p->u.eadd_.exp_1); --- free_Exp(p->u.eadd_.exp_2); +-- free_Exp(p->u.eAdd_.exp_1); +-- free_Exp(p->u.eAdd_.exp_2); -- break; -- -- default: @@ -482,8 +482,8 @@ prDestructorC (cat, rules) prFreeCat fnm (cat, nt) = Just $ concat [ maybe ("free_" ++ identCat (normCat cat)) (const "free") $ maybeTokenCat cat , "(p->u." - , map toLower fnm - , "_.", render nt, ");" + , memName fnm + , ".", render nt, ");" ] @@ -614,21 +614,15 @@ prParams = zipWith prParam [1::Int ..] prParam n c = (text (identCat c), text ("p" ++ show n)) -- | Prints the assignments of parameters to instance variables. --- >>> prAssigns "A" [("A",1),("B",2)] [text "abc", text "def"] +-- >>> prAssigns "A" [("A",1),("BA",2)] [text "abc", text "def"] -- tmp->u.a_.a_ = abc; --- tmp->u.a_.b_2 = def; +-- tmp->u.a_.ba_2 = def; prAssigns :: String -> [IVar] -> [Doc] -> Doc prAssigns c vars params = vcat $ zipWith prAssign vars params where prAssign (t,n) p = - text ("tmp->u." ++ c' ++ "_." ++ vname t n) <+> char '=' <+> p <> semi + text ("tmp->u." ++ memName c ++ "." ++ vname t n) <+> char '=' <+> p <> semi vname t n | n == 1, [_] <- filter ((t ==) . fst) vars = varName t | otherwise = varName t ++ showNum n - c' = map toLower c - -{- **** Helper Functions **** -} - -memName :: String -> String -memName s = map toLower s ++ "_" diff --git a/source/src/BNFC/Backend/C/CFtoCPrinter.hs b/source/src/BNFC/Backend/C/CFtoCPrinter.hs index 85701121..f4ab6f99 100644 --- a/source/src/BNFC/Backend/C/CFtoCPrinter.hs +++ b/source/src/BNFC/Backend/C/CFtoCPrinter.hs @@ -33,7 +33,8 @@ import BNFC.Utils ( (+++), uniqOn, unless, unlessNull ) import BNFC.Backend.Common import BNFC.Backend.Common.NamedVariables -import BNFC.Backend.Common.StrUtils (renderCharOrString) +import BNFC.Backend.Common.StrUtils ( renderCharOrString ) +import BNFC.Backend.C.Common ( memName ) -- | Produces (.h file, .c file). @@ -446,7 +447,7 @@ prPrintRule r@(Rule fun _ _ _) = unless (isCoercion fun) $ concat where p = precRule r fnm = funName fun - pre = concat [ "p->u.", map toLower fnm, "_." ] + pre = concat [ "p->u.", memName fnm, "." ] -- | Only render the rhs (items) of a rule. @@ -567,8 +568,8 @@ prShowCat fnm (cat, nt) = concat [ " sh" , maybe (identCat $ normCat cat) basicFunName $ maybeTokenCat cat , "(p->u." - , map toLower fnm - , "_." + , memName fnm + , "." , render nt , ");\n" ] diff --git a/source/src/BNFC/Backend/C/CFtoCSkel.hs b/source/src/BNFC/Backend/C/CFtoCSkel.hs index ea21f072..4fc8af5e 100644 --- a/source/src/BNFC/Backend/C/CFtoCSkel.hs +++ b/source/src/BNFC/Backend/C/CFtoCSkel.hs @@ -19,6 +19,7 @@ import Prelude hiding ((<>)) import BNFC.CF import BNFC.Utils ( (+++), capitalize ) import BNFC.Backend.Common.NamedVariables +import BNFC.Backend.C.Common ( memName ) import Data.Char ( toLower ) import Data.Either ( lefts ) @@ -166,11 +167,11 @@ prData (cat, rules) -- | Visits all the instance variables of a category. -- >>> let ab = Cat "Ab" --- >>> prPrintRule (Rule "Abc" undefined [Left ab, Left ab] Parsable) --- case is_Abc: --- /* Code for Abc Goes Here */ --- visitAb(p->u.abc_.ab_1); --- visitAb(p->u.abc_.ab_2); +-- >>> prPrintRule (Rule "ABC" undefined [Left ab, Left ab] Parsable) +-- case is_ABC: +-- /* Code for ABC Goes Here */ +-- visitAb(p->u.aBC_.ab_1); +-- visitAb(p->u.aBC_.ab_2); -- break; -- -- >>> let ab = TokenCat "Ab" @@ -209,8 +210,7 @@ prCat fnm (cat, vname) = let visitf = "visit" <> if isTokenCat cat then basicFunName cat else text (identCat (normCat cat)) - in visitf <> parens ("p->u." <> text v <> "_." <> vname ) <> ";" - where v = map toLower fnm + in visitf <> parens ("p->u." <> text (memName fnm) <> "." <> vname ) <> ";" -- | The visit-function name of a basic type diff --git a/source/src/BNFC/Backend/C/Common.hs b/source/src/BNFC/Backend/C/Common.hs index ae4ccded..1ccc2796 100644 --- a/source/src/BNFC/Backend/C/Common.hs +++ b/source/src/BNFC/Backend/C/Common.hs @@ -1,10 +1,12 @@ -- | Common definitions for the modules of the C backend. module BNFC.Backend.C.Common - ( posixC + ( memName + , posixC ) where import Prelude +import BNFC.Backend.Common.NamedVariables -- | Switch C to language variant that has @strdup@. @@ -16,3 +18,8 @@ posixC = , " */" , "#define _POSIX_C_SOURCE 200809L" ] + +-- | Variant names in unions. + +memName :: String -> String +memName s = firstLowerCase s ++ "_" diff --git a/source/src/BNFC/GetCF.hs b/source/src/BNFC/GetCF.hs index fe9d6eaa..1c6fc23d 100644 --- a/source/src/BNFC/GetCF.hs +++ b/source/src/BNFC/GetCF.hs @@ -162,9 +162,13 @@ parseCF opts target content = do ] -- Warn or fail if the grammar uses names not unique modulo upper/lowercase. - when False $ - case nub $ filter (`notElem` nonUniqueNames) $ filter (not . isDefinedRule) $ - concatMap List1.toList $ duplicatesOn (map toLower . wpThing) names of + case nub + . filter (`notElem` nonUniqueNames) + . concatMap List1.toList + . duplicatesOn (map toLower . wpThing) + . filter (not . isDefinedRule) + $ names + of [] -> return () ns | target `elem` [ TargetJava ] -> dieUnlessForce $ unlines $ concat diff --git a/testing/src/ParameterizedTests.hs b/testing/src/ParameterizedTests.hs index cef7e0d7..ce0c945c 100644 --- a/testing/src/ParameterizedTests.hs +++ b/testing/src/ParameterizedTests.hs @@ -72,11 +72,12 @@ currentRegressionTest :: Test currentRegressionTest = makeTestSuite "Current parameterized test" $ map (`makeTestCase` ("regression-tests" cur)) parameters where + cur = "479_LabelsCaseSensitive" -- cur = "comments" -- cur = "358_MixFixLists" -- cur = "289_LexerKeywords" -- cur = "249_unicode" - cur = "266_define" + -- cur = "266_define" -- cur = "235_SymbolsOverlapTokens" -- cur = "202_comments" -- cur = "278_Keywords" @@ -192,7 +193,8 @@ testCases :: TestParameters -> [Test] testCases params = map (makeTestCase params) $ map ("regression-tests/" ++) $ - [ "266_define" + [ "479_LabelsCaseSensitive" + , "266_define" , "358_MixFixLists" , "235_SymbolsOverlapTokens" , "278_Keywords"