#!/bin/bash # Build the Pasta80 Pascal-S syntax validator from pasta80.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/pasta80.atg" "$B/" cp "$M2LIB/FileIO.def" "$M2LIB/FileIO.mod" "$B/" cd "$B" echo "=== CR ==="; CRFRAMES="$FRAMES" "$CR" -m -C pasta80.atg echo "=== check: no degenerate code ===" if grep -q "IF FALSE\|WHILE FALSE" Pasta80P.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 + '/Pasta80P.mod').read() old = ' Pasta80S.Reset; Get;\n Pasta80;\n\n END Parse;' assert old in s, 'EOF patch pattern missing' s = s.replace(old, ' Pasta80S.Reset; Get;\n IF sym # 0 THEN Pasta80 END;\n IF sym # 0 THEN SynError(0) END;\n\n END Parse;') open(b + '/Pasta80P.mod', 'w').write(s) print('patched') PYEOF echo "=== compile ===" for m in FileIO Pasta80S Pasta80P Pasta80; 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 Pasta80S.o Pasta80P.o Pasta80.mod || true "$GM2" -fiso -I . -fuse-list=modules.lst -o Pasta80 FileIO.o Pasta80S.o Pasta80P.o Pasta80.mod echo "=== smoke ===" printf 'program hello (input, output);\nbegin\n writeln(42);\nend.\n' > Hello.pas ./Pasta80 Hello.pas printf 'program t (input, output);\nbegin\nend. GARBAGE\n' > Garbage.pas if ./Pasta80 Garbage.pas 2>&1 | grep -q "Incorrect"; then echo "trailing-garbage rejected"; else echo "EOF CHECK FAILED"; exit 1; fi ./Pasta80 "$HERE/tests/deep.pas" rm -f Hello.pas Hello.LST Garbage.pas Garbage.LST "$HERE/tests/deep.LST"