annotate gcc/ada/par-ch8.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- P A R . C H 8 --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 pragma Style_Checks (All_Checks);
kono
parents:
diff changeset
27 -- Turn off subprogram body ordering check. Subprograms are in order
kono
parents:
diff changeset
28 -- by RM section rather than alphabetical
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 separate (Par)
kono
parents:
diff changeset
31 package body Ch8 is
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 -----------------------
kono
parents:
diff changeset
34 -- Local Subprograms --
kono
parents:
diff changeset
35 -----------------------
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 procedure Append_Use_Clause
kono
parents:
diff changeset
38 (Item_List : List_Id;
kono
parents:
diff changeset
39 Use_Node : Node_Id;
kono
parents:
diff changeset
40 Is_First : in out Boolean;
kono
parents:
diff changeset
41 Is_Last : in out Boolean);
kono
parents:
diff changeset
42 -- Append a use_clause to the Item_List, appropriately setting the Prev_Ids
kono
parents:
diff changeset
43 -- and More_Ids flags for each split use node. The flags Is_First and
kono
parents:
diff changeset
44 -- Is_Last track position of subtype_marks or names within the original
kono
parents:
diff changeset
45 -- use_clause.
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 procedure P_Use_Package_Clause (Item_List : List_Id);
kono
parents:
diff changeset
48 procedure P_Use_Type_Clause (Item_List : List_Id);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 -----------------------
kono
parents:
diff changeset
51 -- Append_Use_Clause --
kono
parents:
diff changeset
52 -----------------------
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 procedure Append_Use_Clause
kono
parents:
diff changeset
55 (Item_List : List_Id;
kono
parents:
diff changeset
56 Use_Node : Node_Id;
kono
parents:
diff changeset
57 Is_First : in out Boolean;
kono
parents:
diff changeset
58 Is_Last : in out Boolean)
kono
parents:
diff changeset
59 is
kono
parents:
diff changeset
60 begin
kono
parents:
diff changeset
61 if Token /= Tok_Comma then
kono
parents:
diff changeset
62 if not Is_First then
kono
parents:
diff changeset
63 Set_Prev_Ids (Use_Node);
kono
parents:
diff changeset
64 end if;
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 Append (Use_Node, Item_List);
kono
parents:
diff changeset
67 Is_Last := True;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 else
kono
parents:
diff changeset
70 Set_More_Ids (Use_Node);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 if not Is_First then
kono
parents:
diff changeset
73 Set_Prev_Ids (Use_Node);
kono
parents:
diff changeset
74 else
kono
parents:
diff changeset
75 Is_First := False;
kono
parents:
diff changeset
76 end if;
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 Append (Use_Node, Item_List);
kono
parents:
diff changeset
79 Scan; -- Past comma
kono
parents:
diff changeset
80 end if;
kono
parents:
diff changeset
81 end Append_Use_Clause;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 ---------------------
kono
parents:
diff changeset
84 -- 8.4 Use Clause --
kono
parents:
diff changeset
85 ---------------------
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 -- USE_CLAUSE ::= USE_PACKAGE_CLAUSE | USE_TYPE_CLAUSE
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 -- The caller has checked that the initial token is USE
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 procedure P_Use_Clause (Item_List : List_Id) is
kono
parents:
diff changeset
94 begin
kono
parents:
diff changeset
95 Scan; -- past USE
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 if Token = Tok_Type or else Token = Tok_All then
kono
parents:
diff changeset
98 P_Use_Type_Clause (Item_List);
kono
parents:
diff changeset
99 else
kono
parents:
diff changeset
100 P_Use_Package_Clause (Item_List);
kono
parents:
diff changeset
101 end if;
kono
parents:
diff changeset
102 end P_Use_Clause;
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 -----------------------------
kono
parents:
diff changeset
105 -- 8.4 Use Package Clause --
kono
parents:
diff changeset
106 -----------------------------
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 -- USE_PACKAGE_CLAUSE ::= use package_NAME {, package_NAME};
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 -- The caller has scanned out the USE keyword
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 procedure P_Use_Package_Clause (Item_List : List_Id) is
kono
parents:
diff changeset
115 Is_First : Boolean := True;
kono
parents:
diff changeset
116 Is_Last : Boolean := False;
kono
parents:
diff changeset
117 Use_Node : Node_Id;
kono
parents:
diff changeset
118 Use_Sloc : constant Source_Ptr := Prev_Token_Ptr;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 begin
kono
parents:
diff changeset
121 if Token = Tok_Package then
kono
parents:
diff changeset
122 Error_Msg_SC ("PACKAGE should not appear here");
kono
parents:
diff changeset
123 Scan; -- Past PACKAGE
kono
parents:
diff changeset
124 end if;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 -- Loop through names in a single use_package_clause, generating an
kono
parents:
diff changeset
127 -- N_Use_Package_Clause node for each name encountered.
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 loop
kono
parents:
diff changeset
130 Use_Node := New_Node (N_Use_Package_Clause, Use_Sloc);
kono
parents:
diff changeset
131 Set_Name (Use_Node, P_Qualified_Simple_Name);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 -- Locally chain each name's use-package node
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 Append_Use_Clause (Item_List, Use_Node, Is_First, Is_Last);
kono
parents:
diff changeset
136 exit when Is_Last;
kono
parents:
diff changeset
137 end loop;
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 TF_Semicolon;
kono
parents:
diff changeset
140 end P_Use_Package_Clause;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 --------------------------
kono
parents:
diff changeset
143 -- 8.4 Use Type Clause --
kono
parents:
diff changeset
144 --------------------------
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 -- USE_TYPE_CLAUSE ::= use [ALL] type SUBTYPE_MARK {, SUBTYPE_MARK};
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 -- The caller has checked that the initial token is USE, scanned it out
kono
parents:
diff changeset
149 -- and that the current token is either ALL or TYPE.
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 -- Note: Use of ALL is an Ada 2012 feature
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 -- Error recovery: cannot raise Error_Resync
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 procedure P_Use_Type_Clause (Item_List : List_Id) is
kono
parents:
diff changeset
156 Use_Sloc : constant Source_Ptr := Prev_Token_Ptr;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 All_Present : Boolean;
kono
parents:
diff changeset
159 Is_First : Boolean := True;
kono
parents:
diff changeset
160 Is_Last : Boolean := False;
kono
parents:
diff changeset
161 Use_Node : Node_Id;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 begin
kono
parents:
diff changeset
164 if Token = Tok_All then
kono
parents:
diff changeset
165 Error_Msg_Ada_2012_Feature ("|`USE ALL TYPE`", Token_Ptr);
kono
parents:
diff changeset
166 All_Present := True;
kono
parents:
diff changeset
167 Scan; -- Past ALL
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 if Token /= Tok_Type then
kono
parents:
diff changeset
170 Error_Msg_SC ("TYPE expected");
kono
parents:
diff changeset
171 end if;
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 else
kono
parents:
diff changeset
174 pragma Assert (Token = Tok_Type);
kono
parents:
diff changeset
175 All_Present := False;
kono
parents:
diff changeset
176 end if;
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 if Ada_Version = Ada_83 then
kono
parents:
diff changeset
179 Error_Msg_SC ("(Ada 83) use type not allowed!");
kono
parents:
diff changeset
180 end if;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 Scan; -- Past TYPE
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 -- Loop through subtype_marks in one use_type_clause, generating a
kono
parents:
diff changeset
185 -- separate N_Use_Type_Clause node for each subtype_mark encountered.
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 loop
kono
parents:
diff changeset
188 Use_Node := New_Node (N_Use_Type_Clause, Use_Sloc);
kono
parents:
diff changeset
189 Set_All_Present (Use_Node, All_Present);
kono
parents:
diff changeset
190 Set_Used_Operations (Use_Node, No_Elist);
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 Set_Subtype_Mark (Use_Node, P_Subtype_Mark);
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 No_Constraint;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 -- Locally chain each subtype_mark's use-type node
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 Append_Use_Clause (Item_List, Use_Node, Is_First, Is_Last);
kono
parents:
diff changeset
199 exit when Is_Last;
kono
parents:
diff changeset
200 end loop;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 TF_Semicolon;
kono
parents:
diff changeset
203 end P_Use_Type_Clause;
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 -------------------------------
kono
parents:
diff changeset
206 -- 8.5 Renaming Declaration --
kono
parents:
diff changeset
207 -------------------------------
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 -- Object renaming declarations and exception renaming declarations
kono
parents:
diff changeset
210 -- are parsed by P_Identifier_Declaration (3.3.1)
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 -- Subprogram renaming declarations are parsed by P_Subprogram (6.1)
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 -- Package renaming declarations are parsed by P_Package (7.1)
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 -- Generic renaming declarations are parsed by P_Generic (12.1)
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 ----------------------------------------
kono
parents:
diff changeset
219 -- 8.5.1 Object Renaming Declaration --
kono
parents:
diff changeset
220 ----------------------------------------
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 -- Parsed by P_Identifier_Declarations (3.3.1)
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 -------------------------------------------
kono
parents:
diff changeset
225 -- 8.5.2 Exception Renaming Declaration --
kono
parents:
diff changeset
226 -------------------------------------------
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 -- Parsed by P_Identifier_Declarations (3.3.1)
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 -----------------------------------------
kono
parents:
diff changeset
231 -- 8.5.3 Package Renaming Declaration --
kono
parents:
diff changeset
232 -----------------------------------------
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 -- Parsed by P_Package (7.1)
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 --------------------------------------------
kono
parents:
diff changeset
237 -- 8.5.4 Subprogram Renaming Declaration --
kono
parents:
diff changeset
238 --------------------------------------------
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 -- Parsed by P_Subprogram (6.1)
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 -----------------------------------------
kono
parents:
diff changeset
243 -- 8.5.2 Generic Renaming Declaration --
kono
parents:
diff changeset
244 -----------------------------------------
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 -- Parsed by P_Generic (12.1)
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 end Ch8;