-- Check tables generated by LALR generator with Anagram.Grammars; with Anagram.Grammars.Constructors; with Anagram.Grammars_Debug; with Anagram.Grammars.Reader; with Anagram.Grammars.LR_Tables; with Anagram.Grammars.LR.LALR; with Ada.Text_IO; procedure TS_00032 is procedure Print_Action (Table : Anagram.Grammars.LR_Tables.Table; State : Anagram.Grammars.LR.State_Index; T : Anagram.Grammars.Terminal_Count); ------------------ -- Print_Action -- ------------------ procedure Print_Action (Table : Anagram.Grammars.LR_Tables.Table; State : Anagram.Grammars.LR.State_Index; T : Anagram.Grammars.Terminal_Count) is use Anagram.Grammars.LR_Tables; use type Anagram.Grammars.Terminal_Count; use type Anagram.Grammars.Production_Count; use type Anagram.Grammars.LR.State_Count; S : constant Anagram.Grammars.LR.State_Count := Shift (Table, State, T); R : constant Reduce_Iterator := Reduce (Table, State, T); begin Ada.Text_IO.Put (' '); if T = 0 and then Finish (Table, State) then Ada.Text_IO.Put ("FINISH "); elsif S /= 0 then Ada.Text_IO.Put ("SHIFT "); Ada.Text_IO.Put (Anagram.Grammars.LR.State_Count'Image (S)); if S in 1 .. 9 then Ada.Text_IO.Put (' '); end if; elsif not Is_Empty (R) then Ada.Text_IO.Put ("REDUCE"); Ada.Text_IO.Put (Anagram.Grammars.Production_Index'Image (Production (R))); if Production (R) <= 9 then Ada.Text_IO.Put (' '); end if; else Ada.Text_IO.Put ("Error "); end if; end Print_Action; G : constant Anagram.Grammars.Grammar := Anagram.Grammars.Reader.Read ("test.ag"); AG : constant Anagram.Grammars.Grammar := Anagram.Grammars.Constructors.To_Augmented (G); use Anagram.Grammars; begin -- Anagram.Grammars_Debug.Print (AG); Ada.Text_IO.Put ("Terminals" & Terminal_Count'Image (G.Last_Terminal)); Ada.Text_IO.Put (" Non_Terminals" & Non_Terminal_Count'Image (G.Last_Non_Terminal)); Ada.Text_IO.Put (" Production" & Production_Count'Image (G.Last_Production)); Ada.Text_IO.Put_Line (" Parts" & Part_Count'Image (G.Last_Part)); declare use Anagram.Grammars.LR; Table : LR_Tables.Table_Access := LALR.Build (AG, False); begin Ada.Text_IO.Put_Line ("Last_State=" & State_Index'Image (LR_Tables.Last_State (Table.all))); Anagram.Grammars_Debug.Print_Conflicts (AG, Table.all); for S in 1 .. LR_Tables.Last_State (Table.all) loop Ada.Text_IO.Put (State_Index'Image (S)); if S <= 9 then Ada.Text_IO.Put (' '); end if; for T in 0 .. AG.Last_Terminal loop Print_Action (Table.all, S, T); end loop; Ada.Text_IO.Put (ASCII.HT); for NT in 1 .. AG.Last_Non_Terminal loop Ada.Text_IO.Put (State_Count'Image (LR_Tables.Shift (Table.all, S, NT))); end loop; Ada.Text_IO.New_Line; end loop; LR_Tables.Free (Table); end; end TS_00032;