(******************************************************************************) (* p(rogramming) l(anguage) x compiler (inspired by Wirth's PL/0) *) (* (C) 2010 Steffen Solyga *) (******************************************************************************) MODULE plx; IMPORT SysLib; IMPORT Lib, Str, Args, FIO; IMPORT Scnr, Prsr, Comp; CONST verStr = 'plx l05 v01 (2010-06-05)'; emlStr = 'solyga@absinth.net'; err = FIO.ErrorOutput; hlp = FIO.ErrorOutput; PROCEDURE Init(); PROCEDURE InitGlobals(); BEGIN END InitGlobals; PROCEDURE ParseArgs(); PROCEDURE Error( s: ARRAY OF CHAR ); BEGIN FIO.WrStr( err, 'plx: ' ); FIO.WrStr( err, s ); FIO.WrStr( err, ": '" ); FIO.WrStr( err, Args.lit ); FIO.WrStr( err, "'" ); FIO.WrLn( err ); SysLib.exit( -1 ); END Error; PROCEDURE Help(); BEGIN FIO.WrStr( hlp, verStr ); FIO.WrStr( hlp, ': plx compiler & interpreter.' ); FIO.WrLn( hlp ); FIO.WrStr( hlp, 'Flowers & bug reports to Steffen Solyga <' ); FIO.WrStr( hlp, emlStr ); FIO.WrStr( hlp, '>.' ); FIO.WrLn( hlp ); FIO.WrStr( hlp, 'Usage: plx [] []' ); FIO.WrLn( hlp ); FIO.WrStr( hlp, 'Options: -h show this info and exit' ); FIO.WrLn( hlp ); SysLib.exit( 0 ); END Help; PROCEDURE Options(); BEGIN WHILE Args.sym = Args.symOpt DO IF Str.Compare( Args.lit, '?' ) = 0 THEN Help(); ELSIF Str.Compare( Args.lit, 'h' ) = 0 THEN Help(); ELSE Error( 'Invalid option' ); END; Args.Read(); END; END Options; BEGIN Args.Reset(); Args.Read(); Options(); IF Args.sym = Args.symArg THEN IF Str.Compare( Args.lit, '-' ) # 0 THEN IF ~FIO.Exists( Args.lit ) THEN Error( 'File does not exist' ) END; Scnr.src := FIO.OpenRead( Args.lit ); END; Args.Read(); Options(); END; END ParseArgs; BEGIN InitGlobals(); ParseArgs(); END Init; PROCEDURE Main(); BEGIN Prsr.Run(); END Main; PROCEDURE Done(); BEGIN FIO.Close( Scnr.src ); END Done; BEGIN Init(); Main(); Done(); END plx.