A MiniLAX program has the form of a procedure declaration except for its heading.
Program ::= 'PROGRAM' Id ';' Block '.'The identifier following the symbol PROGRAM is the program name; it has no further significance inside the program.
Example:
PROGRAM test; (* read, sort and write an array of n numbers *) (* this program shows the following features: *) (* procedure calls from main level, to a local, *) (* and to a global procedure *) (* access to a global array *) (* access to local, global and *) (* intermediate variables *) (* recursion *) (* reading and writing of all types *) (* integer to real conversion *) DECLARE test : BOOLEAN; n : INTEGER; a : ARRAY [1..100] OF REAL; PROCEDURE skip; (* do nothing *) DECLARE n: INTEGER BEGIN n := n END; PROCEDURE read (VAR n: INTEGER; VAR a: ARRAY [1..100] OF REAL); DECLARE i: INTEGER BEGIN WRITE (TRUE); READ (test); WRITE (5); READ (n); i := 1; WHILE i < n DO i := i + 1; WRITE (1.0E-7); READ (a [i]) END END; PROCEDURE write (m: INTEGER); (* write a [m..n] *) DECLARE x: INTEGER BEGIN WRITE (a [m]); IF m < n THEN write (m + 1) ELSE skip END END; PROCEDURE sort (VAR a: ARRAY [1..100] OF REAL); (* sort a [1..n] *) DECLARE i : INTEGER; j : INTEGER; k : INTEGER; h : REAL; ok: BOOLEAN; PROCEDURE check (VAR ok: BOOLEAN); (* check order of a [1..n] *) DECLARE continue: BOOLEAN BEGIN IF test THEN write (1) ELSE skip END; i := 1; continue := TRUE; WHILE continue DO IF i < n THEN continue := NOT (a [i + 1] < a [i]); IF continue THEN i := i + 1 ELSE skip END ELSE continue := FALSE END END; ok := NOT (i < n) END BEGIN (* sort *) i := 1; WHILE i < n DO write (1); j := i; k := i; WHILE j < n DO (* a [k] = MIN a [i..j] *) j := j + 1; IF a [j] < a [k] THEN k := j ELSE skip END END; h := a [i]; a [i] := a [k]; a [k] := h; i := i + 1 END; check (ok); WRITE (ok) END BEGIN (* main program *) a [1] := 2.1415926536; a [1] := a [1] + 1.0; read (n, a); sort (a); IF NOT test THEN write (0) ELSE skip END END.