| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #!/bin/bash
- # Build the Ulm-Oberon syntax validator from ulm_oberon.atg.
- # Needs: CR (Coco/R V1.53), gm2 -fiso, parser/scanner frames, FileIO.
- # Note: link via the two-step module list; a single-step link trips
- # over pre-existing errors in this gm2 build's own ISO library .defs.
- set -e
- CR="${CR:-/home/eric/Projets/Projets-Modula2/MyWork/CocoGm2/CR}"
- GM2="${GM2:-/home/eric/bin/Modula2/Gm2/bin/gm2}"
- FRAMES="${CRFRAMES:-/home/eric/Projets/Projets-Modula2/MyWork/Theia/GNU-grammar/build}"
- M2LIB="${M2LIB:-/home/eric/Projets/Projets-Modula2/MyWork/Theia/GNU-grammar/build}"
- HERE="$(cd "$(dirname "$0")" && pwd)"
- B="$HERE/build"
- rm -rf "$B"
- mkdir -p "$B"
- cp "$HERE/ulm_oberon.atg" "$B/"
- cp "$M2LIB/FileIO.def" "$M2LIB/FileIO.mod" "$B/"
- cd "$B"
- echo "=== CR ==="; CRFRAMES="$FRAMES" "$CR" -m -C ulm_oberon.atg
- echo "=== check: no degenerate code ==="
- if grep -q "IF FALSE\|WHILE FALSE" OberonP.mod; then echo "DEGENERATE GENERATION (IF/WHILE FALSE)"; exit 1; fi
- echo "=== patch: EOF check ==="
- python3 - "$B" <<'PYEOF'
- import sys
- b = sys.argv[1]
- s = open(b + '/OberonP.mod').read()
- old = ' OberonS.Reset; Get;\n Oberon;\n\n END Parse;'
- assert old in s, 'EOF patch pattern missing'
- s = s.replace(old, ' OberonS.Reset; Get;\n IF sym # 0 THEN Oberon END;\n IF sym # 0 THEN SynError(0) END;\n\n END Parse;')
- open(b + '/OberonP.mod', 'w').write(s)
- print('patched')
- PYEOF
- echo "=== compile ==="
- for m in FileIO OberonS OberonP Oberon; do "$GM2" -fiso -I . -c "$m.mod"; done
- echo "=== link ==="
- # NOTE: the gen step exits 1 on pre-existing errors in gm2's own
- # ISO library .defs, but still writes a usable modules.lst.
- "$GM2" -fiso -I . -fgen-module-list=modules.lst -o /dev/null FileIO.o OberonS.o OberonP.o Oberon.mod || true
- "$GM2" -fiso -I . -fuse-list=modules.lst -o Ulm FileIO.o OberonS.o OberonP.o Oberon.mod
- echo "=== smoke ==="
- printf 'MODULE Hello;\nBEGIN\nEND Hello.\n' > Hello.mod
- ./Ulm Hello.mod
- printf 'MODULE T;\nBEGIN\nEND T. GARBAGE\n' > Garbage.mod
- if ./Ulm Garbage.mod 2>&1 | grep -q "Incorrect"; then echo "trailing-garbage rejected"; else echo "EOF CHECK FAILED"; exit 1; fi
- ./Ulm "$HERE/tests/deep.mod"
- rm -f Hello.mod Hello.LST Garbage.mod Garbage.LST "$HERE/tests/deep.LST"
|