-- Programmed by Jedidiah Barber -- Licensed under the Sunset License v1.0 -- See license.txt for further details with Ada.Characters.Latin_1, Ada.Strings.Fixed; package body Kompsos.Pretty_Print is package Latin renames Ada.Characters.Latin_1; package Str renames Ada.Strings; function Image (Item : in Integer) return String is begin return Str.Fixed.Trim (Integer'Image (Item), Str.Left); end Image; function Image (Item : in ID_Number) return String is begin return Str.Fixed.Trim (ID_Number'Image (Item), Str.Left); end Image; function Image (Item : in Variable) return String is begin return "Vargen#" & Image (ID_Number (Item.Ident)) & (if SU.Length (Item.Name) /= 0 then "/" & SU.To_String (Item.Name) else ""); end Image; function Image (Item : in Term) return String is function Bare (Item : in Term) return String is begin case Item.Kind is when Null_Term => return "()"; when Atom_Term => return Element_Image (Item.Atom); when Var_Term => return Image (Item.Var); when Pair_Term => if Item.Right.Kind = Null_Term then return Image (Item.Left); elsif Item.Right.Kind /= Pair_Term then return Image (Item.Left) & " . " & Bare (Item.Right); else return Image (Item.Left) & " " & Bare (Item.Right); end if; end case; end Bare; begin if Item.Kind = Pair_Term then return "(" & Bare (Item) & ")"; else return Bare (Item); end if; end Image; function Image (Item : in State) return String is Result : SU.Unbounded_String; begin SU.Append (Result, Latin.HT & "Generation:"); if Item.Ident.Is_Empty then SU.Append (Result, " N/A" & Latin.LF); else SU.Append (Result, Latin.LF); for Iter in Item.Ident.Iterate loop SU.Append (Result, Latin.HT & Latin.HT & "Vargen#" & Image (ID_Number (ID_Number_Maps.Key (Iter))) & " => " & Image (ID_Number (ID_Number_Maps.Element (Iter))) & Latin.LF); end loop; end if; SU.Append (Result, Latin.HT & "Variables:"); if Item.LVars.Is_Empty then SU.Append (Result, " N/A" & Latin.LF); else SU.Append (Result, Latin.LF); for Index in Item.LVars.First_Index .. Item.LVars.Last_Index loop SU.Append (Result, Latin.HT & Latin.HT & "Var#" & Image (ID_Number (Index)) & (if SU.Length (Item.LVars (Index)) /= 0 then "/" & SU.To_String (Item.LVars (Index)) else "") & Latin.LF); end loop; end if; SU.Append (Result, Latin.HT & "Substitution:"); if Item.Subst.Is_Empty then SU.Append (Result, " N/A" & Latin.LF); else SU.Append (Result, Latin.LF); for Iter in Item.Subst.Iterate loop SU.Append (Result, Latin.HT & Latin.HT & Image (ID_Number (Binding_Maps.Key (Iter))) & " => " & Image (Binding_Maps.Element (Iter)) & Latin.LF); end loop; end if; return -Result; end Image; function Image (Item : in out World) return String is Result : SU.Unbounded_String; Counter : Positive := 1; begin if not Item.Has_State (Counter) then return "States: N/A" & Latin.LF; end if; loop SU.Append (Result, "State#" & Image (Counter) & ":" & Latin.LF); SU.Append (Result, Image (Item.Possibles.Constant_Reference (Counter))); Counter := Counter + 1; exit when not Item.Has_State (Counter); end loop; return SU.Slice (Result, 1, SU.Length (Result) - 1); end Image; function Image_Constant (Item : in World) return String is Scratch : World := Item; begin return Image (Scratch); end Image_Constant; end Kompsos.Pretty_Print;