DEFINITION MODULE M2SM;
(*$ LargeVars:=FALSE NameChk:=FALSE LongAlign:=FALSE *)
(*
 * 16.8.90/bp
 * CLOSE und Option-Parser eingebaut
 * Option als Array statt PROC, VIEL schneller!
 * CPU geht ein in Option
 * UnFreezeOption neu
 * 26.3.90/bp
 * 20.2.90/bp
 *	Neu exportiert für M2AM: StrToVal und GetString
 *	StrToVal zur Vermeidung doppelter Prozeduren und GetString zur
 *	einheitlichen neuen String-Behandlung ($K ).
 *	Einen Zusammenlegung der beiden Scanner ist nicht möglich, da
 *	sich zu viele Bezeichner (Symbol) überschneiden!
 * 17.2.90/bp
 *	optK für String-Konversion '\n\123\xc4...'
 *	optG und optJ für cond. Copiling (optG festgelegt für german Version!)
 *	Namen der Optionen noch nicht geändert!
 * 24.1.90/bp
 *	Neu exportiert:
 *	ch, GetCh, Comment
 * 30.10.89/ms
 *	Neue Optionen eingefügt.
 * 27.8.89/ms
 *	InitScanner(continue); Der Parameter gibt an, ob im batch Modus
 *	noch weiter gearbeitet werden soll.
 * 31.5.89/ms
 *	Anpassung des Bezeicherbereichs auf beliebige Grössen. Neu wird
 *	jede Zeichenkette im temporären Buffer 'idBuffer' abgelegt. Alle
 *	Referenzen zur alten Variablen 'id' müssen deshalb auf 'idBuffer'
 *	umgearbeitet werden. 'KeepId()' kopiert den aktuellen Inhalt dieses
 *	Buffers um auf den fortlaufend allozierten dynamischen Bezeichner-
 *	buffer. Nach anfänglichen Zweifeln scheint dies eine gute Lösung
 *	zu sein.
 *)
FROM M2DM IMPORT
 IdRec,Ident,ObjClass,StrForm;

TYPE
 Symbol=(
  null,times,slash,div,rem,mod,and,plus,minus,or,eql,neq,lss,
  leq,gtr,geq,in,arrow,period,comma,colon,ellipsis,rparen,rbrak,
  rbrace,of,then,do,to,by,lparen,lbrak,lbrace,not,becomes,number,
  string,ident,ignore,semicolon,bar,end,else,elsif,until,if,while,repeat,compdate,
  loop,with,exit,return,case,for,array,pointer,bpointer,record,set,begin,
  code,const,type,var,forward,procedure,module,definition,
  implementation,close,export,qualified,from,import,eof
 );

 NumTypes=(character,integer,real);

VAR
 sym: Symbol;
 numberType: NumTypes;

 intval: LONGCARD;
 realval: LONGREAL;
(*
 * 31.5.89/ms
 *	In dieser Variablen wird die jeweils zuletzt gelesene Zeichenkette
 *	gespeichert. Dies bringt eine neue Beschränkung in das System. Eine
 *	Beschränkung auf 1024 Byte sollte sich rechtfertigen lassen.
 *)
 idBuffer: IdRec;
 idB: Ident; (* ADR(idBuffer) *)
 (* neu: exportiert für M2AM/bp *)
 ch: CHAR;
 scanerr: CARDINAL;
 lastPos,lastErrPos,sourcePos:LONGINT;

PROCEDURE InitScanner(continue: BOOLEAN): BOOLEAN;
PROCEDURE GetCh; (* neu: exportiert für M2AM/bp*)
PROCEDURE GetString(termCh:CHAR);
PROCEDURE StrToVal(VAR s: ARRAY OF CHAR; VAR l: LONGCARD;
                   base: CARDINAL; VAR err: BOOLEAN);
PROCEDURE Enter(name: ARRAY OF CHAR): Ident;
PROCEDURE KeepId(): Ident;
PROCEDURE KeepLev0Id(): Ident;
PROCEDURE GetSym;
PROCEDURE Comment;
PROCEDURE Dbg(n: INTEGER);
PROCEDURE Mark(n: INTEGER);
PROCEDURE Warn(n: INTEGER);
PROCEDURE MarkObjClass(cl: ObjClass);
PROCEDURE MarkForm(form: StrForm);
PROCEDURE MarkId(id: Ident);
PROCEDURE SourcePos(VAR p: LONGINT);
PROCEDURE CloseScanner;
END M2SM.
