1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 | -- 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;
|