(* ----------------------------------------------------------------------------
* $Id: SACSYM2.mi,v 1.3 1992/10/15 16:27:57 kredel Exp $
* ----------------------------------------------------------------------------
* This file is part of MAS.
* ----------------------------------------------------------------------------
* Copyright (c) 1989 - 1992 Universitaet Passau
* ----------------------------------------------------------------------------
* $Log: SACSYM2.mi,v $
* Revision 1.3 1992/10/15 16:27:57 kredel
* Changed rcsid variable
*
* Revision 1.2 1992/02/12 17:32:37 pesch
* Moved CONST definition to the right place
*
* Revision 1.1 1992/01/22 15:11:34 kredel
* Initial revision
*
* ----------------------------------------------------------------------------
*)
IMPLEMENTATION MODULE SACSYM2;
(* SAC Symbol 2 Implementation Module. *)
(* Import lists and declarations. *)
FROM MASSTOR IMPORT SIL, LIST, BETA,
RED, FIRST, COMP, INV, ADV, SFIRST, SRED;
FROM MASERR IMPORT ERROR, severe;
FROM SACLIST IMPORT AWRITE, ADV2, CONC;
FROM SACSYM IMPORT SYMTB;
CONST rcsidi = "$Id: SACSYM2.mi,v 1.3 1992/10/15 16:27:57 kredel Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau";
(* Procedure declarations. *)
PROCEDURE STBAL(L,n: LIST): LIST;
(*Symbol tree balance. L is an alphabetical list of n symbol-tree
nodes (n gt 0), out of which a balanced binary tree S is constructed. *)
VAR LP: LIST;
i, m: INTEGER;
A: ARRAY [0..500] OF LIST;
BEGIN
(*1*) (*initialize.*)
IF n > 500 THEN ERROR(severe,"STBAL: array to small.");
RETURN(SIL) END;
(*2*) (*fill array.*) LP:=L; i:=-1;
WHILE LP <> SIL DO i:=i+1; A[i]:=FIRST(LP);
LP:=RED(LP) END;
(*3*) (*built new symbol tree.*)
m:=STBALS(A,0,INTEGER(n-1));
RETURN(A[m]);
(*4*) END STBAL;
PROCEDURE STBALS(VAR A: ARRAY OF LIST; l, r: INTEGER): INTEGER;
(*Symbol tree balance subroutine. The array A contains symbol-tree
nodes in alphabetical order. The binary tree of the symbols in
A[l..r] is constructed and A[m] is its root. *)
VAR m, m1, m2: INTEGER;
L: LIST;
BEGIN
(*1*) (*recursion basis.*)
IF l = r THEN m:=l; SFIRST(A[m],SIL);
SRED(RED(A[m]),SIL); RETURN(m) END;
(*2*) (*recursion.*) m:=(l+r) DIV 2;
IF l = m THEN SFIRST(A[m],SIL);
ELSE m1:=STBALS(A,l,m-1); SFIRST(A[m],A[m1]) END;
m2:=STBALS(A,m+1,r); SRED(RED(A[m]),A[m2]);
RETURN(m);
(*4*) END STBALS;
PROCEDURE STNLST(T: LIST; VAR L,n: LIST);
(*Symbol tree nodes list. T is a non-empty symbol tree.
L is the list of its nodes in alphabetical order of the
corresponding symbols and n the number of nodes. This algorithm
is normally used for creating the data as required for STBAL. *)
VAR l, r, lp, rp, S, n1, n2: LIST;
BEGIN
(*1*) (*initialize.*) ADV2(T, l,S,r); n1:=0; n2:=0;
lp:=SIL; rp:=SIL;
(*2*) (*recursion on sub-trees.*)
IF l <> SIL THEN STNLST(l,lp,n1) END;
IF r <> SIL THEN STNLST(r,rp,n2) END;
(*3*) (*combine lists.*)
L:=CONC(lp,COMP(T,rp)); n:=n1+1+n2;
RETURN;
(*4*) END STNLST;
PROCEDURE SSYTBAL;
(*System symbol tree balance. SYMTB is balanced. *)
VAR L, n: LIST;
BEGIN
(*1*) (*initialization.*) IF SYMTB = SIL THEN RETURN END;
(*2*) (*list of nodes.*) STNLST(SYMTB,L,n);
(*3*) (*balance nodes.*) L:=STBAL(L,n);
IF L <> SIL THEN SYMTB:=L END;
RETURN;
(*4*) END SSYTBAL;
END SACSYM2.
(* -EOF- *)