DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 7139 (0x1be3) Types: TextFile Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
with Misc_Defs; with Misc; use Misc_Defs; package body Ecs is -- ccl2ecl - convert character classes to set of equivalence classes procedure Ccl2ecl is use Misc_Defs; Ich, Newlen, Cclp, Cclmec : Integer; begin for I in 1 .. Lastccl loop -- we loop through each character class, and for each character -- in the class, add the character's equivalence class to the -- new "character" class we are creating. Thus when we are all -- done, character classes will really consist of collections -- of equivalence classes Newlen := 0; Cclp := Cclmap (I); for Ccls in 0 .. Ccllen (I) - 1 loop Ich := Character'Pos (Ccltbl (Cclp + Ccls)); Cclmec := Ecgroup (Ich); if (Cclmec > 0) then Ccltbl (Cclp + Newlen) := Character'Val (Cclmec); Newlen := Newlen + 1; end if; end loop; Ccllen (I) := Newlen; end loop; end Ccl2ecl; -- cre8ecs - associate equivalence class numbers with class members -- fwd is the forward linked-list of equivalence class members. bck -- is the backward linked-list, and num is the number of class members. -- Returned is the number of classes. procedure Cre8ecs (Fwd, Bck : in out C_Size_Array; Num : in Integer; Result : out Integer) is J, Numcl : Integer; begin Numcl := 0; -- create equivalence class numbers. From now on, abs( bck(x) ) -- is the equivalence class number for object x. If bck(x) -- is positive, then x is the representative of its equivalence -- class. for I in 1 .. Num loop if (Bck (I) = Nil) then Numcl := Numcl + 1; Bck (I) := Numcl; J := Fwd (I); while (J /= Nil) loop Bck (J) := -Numcl; J := Fwd (J); end loop; end if; end loop; Result := Numcl; return; end Cre8ecs; -- mkeccl - update equivalence classes based on character class xtions -- where ccls contains the elements of the character class, lenccl is the -- number of elements in the ccl, fwd is the forward link-list of equivalent -- characters, bck is the backward link-list, and llsiz size of the link-list procedure Mkeccl (Ccls : in out Char_Array; Lenccl : in Integer; Fwd, Bck : in out Unbounded_Int_Array; Llsiz : in Integer) is use Misc_Defs, Misc; Cclp, Oldec, Newec, Cclm, I, J : Integer; Proc_Array : Boolean_Ptr; begin -- note that it doesn't matter whether or not the character class is -- negated. The same results will be obtained in either case. Cclp := Ccls'First; -- this array tells whether or not a character class has been processed. Proc_Array := new Boolean_Array (Ccls'First .. Ccls'Last); for Ccl_Index in Ccls'First .. Ccls'Last loop Proc_Array (Ccl_Index) := False; end loop; while (Cclp < Lenccl + Ccls'First) loop Cclm := Character'Pos (Ccls (Cclp)); Oldec := Bck (Cclm); Newec := Cclm; J := Cclp + 1; I := Fwd (Cclm); while ((I /= Nil) and (I <= Llsiz)) loop -- look for the symbol in the character class while ((J < Lenccl + Ccls'First) and ((Ccls (J) <= Character'Val (I)) or Proc_Array (J))) loop if (Ccls (J) = Character'Val (I)) then -- we found an old companion of cclm in the ccl. -- link it into the new equivalence class and flag it as -- having been processed Bck (I) := Newec; Fwd (Newec) := I; Newec := I; Proc_Array (J) := True; -- set flag so we don't reprocess -- get next equivalence class member -- continue 2 goto Next_Pt; end if; J := J + 1; end loop; -- symbol isn't in character class. Put it in the old equivalence -- class Bck (I) := Oldec; if (Oldec /= Nil) then Fwd (Oldec) := I; end if; Oldec := I; <<Next_Pt>> I := Fwd (I); end loop; if ((Bck (Cclm) /= Nil) or (Oldec /= Bck (Cclm))) then Bck (Cclm) := Nil; Fwd (Oldec) := Nil; end if; Fwd (Newec) := Nil; -- find next ccl member to process Cclp := Cclp + 1; while ((Cclp < Lenccl + Ccls'First) and Proc_Array (Cclp)) loop -- reset "doesn't need processing" flag Proc_Array (Cclp) := False; Cclp := Cclp + 1; end loop; end loop; exception when Storage_Error => Misc.Aflexfatal ("dynamic memory failure in mkeccl()"); end Mkeccl; -- mkechar - create equivalence class for single character procedure Mkechar (Tch : in Integer; Fwd, Bck : in out C_Size_Array) is begin -- if until now the character has been a proper subset of -- an equivalence class, break it away to create a new ec if (Fwd (Tch) /= Nil) then Bck (Fwd (Tch)) := Bck (Tch); end if; if (Bck (Tch) /= Nil) then Fwd (Bck (Tch)) := Fwd (Tch); end if; Fwd (Tch) := Nil; Bck (Tch) := Nil; end Mkechar; end Ecs; -- Copyright (c) 1990 Regents of the University of California. -- All rights reserved. -- -- This software was developed by John Self of the Arcadia project -- at the University of California, Irvine. -- -- Redistribution and use in source and binary forms are permitted -- provided that the above copyright notice and this paragraph are -- duplicated in all such forms and that any documentation, -- advertising materials, and other materials related to such -- distribution and use acknowledge that the software was developed -- by the University of California, Irvine. The name of the -- University may not be used to endorse or promote products derived -- from this software without specific prior written permission. -- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR -- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. -- TITLE equivalence class -- AUTHOR: John Self (UCI) -- DESCRIPTION finds equivalence classes so DFA will be smaller -- $Header: /co/ua/self/arcadia/aflex/ada/src/RCS/ecsS.a,v 1.4 90/01/12 15:19:57 self Exp Locker: self $