build.sh 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/bin/bash
  2. # Build the P4 Pascal syntax validator from p4_pascal.atg.
  3. # Needs: CR (Coco/R V1.53), gm2 -fiso, parser/scanner frames, FileIO.
  4. # Note: link via the two-step module list; a single-step link trips
  5. # over pre-existing errors in this gm2 build's own ISO library .defs.
  6. set -e
  7. CR="${CR:-/home/eric/Projets/Projets-Modula2/MyWork/CocoGm2/CR}"
  8. GM2="${GM2:-/home/eric/bin/Modula2/Gm2/bin/gm2}"
  9. FRAMES="${CRFRAMES:-/home/eric/Projets/Projets-Modula2/MyWork/Theia/GNU-grammar/build}"
  10. M2LIB="${M2LIB:-/home/eric/Projets/Projets-Modula2/MyWork/Theia/GNU-grammar/build}"
  11. HERE="$(cd "$(dirname "$0")" && pwd)"
  12. B="$HERE/build"
  13. rm -rf "$B"
  14. mkdir -p "$B"
  15. cp "$HERE/p4_pascal.atg" "$B/"
  16. cp "$M2LIB/FileIO.def" "$M2LIB/FileIO.mod" "$B/"
  17. cd "$B"
  18. echo "=== CR ==="; CRFRAMES="$FRAMES" "$CR" -m -C p4_pascal.atg
  19. echo "=== patch: EOF check ==="
  20. python3 - "$B" <<'PYEOF'
  21. import sys
  22. b = sys.argv[1]
  23. s = open(b + '/P4P.mod').read()
  24. old = ' P4S.Reset; Get;\n P4;\n\n END Parse;'
  25. assert old in s, 'EOF patch pattern missing'
  26. s = s.replace(old, ' P4S.Reset; Get;\n P4;\n IF sym # 0 THEN SynError(0) END;\n\n END Parse;')
  27. open(b + '/P4P.mod', 'w').write(s)
  28. print('patched')
  29. PYEOF
  30. echo "=== check: no degenerate code ==="
  31. if grep -q "IF FALSE\\|WHILE FALSE" P4P.mod; then echo "DEGENERATE GENERATION (IF/WHILE FALSE)"; exit 1; fi
  32. echo "=== compile ==="
  33. for m in FileIO P4S P4P P4; do "$GM2" -fiso -I . -c "$m.mod"; done
  34. echo "=== link ==="
  35. # NOTE: the gen step exits 1 on pre-existing errors in gm2's own
  36. # ISO library .defs, but still writes a usable modules.lst.
  37. "$GM2" -fiso -I . -fgen-module-list=modules.lst -o /dev/null FileIO.o P4S.o P4P.o P4.mod || true
  38. "$GM2" -fiso -I . -fuse-list=modules.lst -o P4 FileIO.o P4S.o P4P.o P4.mod
  39. echo "=== smoke ==="
  40. printf 'PROGRAM Hello;\nBEGIN\n WriteLn('"'"'hi'"'"');\nEND.\n' > Hello.pas
  41. ./P4 Hello.pas
  42. printf 'PROGRAM T;\nBEGIN\nEND. GARBAGE\n' > Garbage.pas
  43. if ./P4 Garbage.pas 2>&1 | grep -q "Incorrect"; then echo "trailing-garbage rejected"; else echo "EOF CHECK FAILED"; exit 1; fi
  44. ./P4 "$HERE/tests/deep.pas"
  45. rm -f Hello.pas Hello.LST Garbage.pas Garbage.LST "$HERE/tests/deep.LST"