1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 pragma Style_Checks
(All_Checks
);
27 -- Turn off subprogram body ordering check. Subprograms are in order
28 -- by RM section rather than alphabetical
33 -- Local functions, used only in this chapter
35 function P_Component_Clause
return Node_Id
;
36 function P_Mod_Clause
return Node_Id
;
38 --------------------------------------------
39 -- 13.1 Representation Clause (also I.7) --
40 --------------------------------------------
42 -- REPRESENTATION_CLAUSE ::=
43 -- ATTRIBUTE_DEFINITION_CLAUSE
44 -- | ENUMERATION_REPRESENTATION_CLAUSE
45 -- | RECORD_REPRESENTATION_CLAUSE
48 -- ATTRIBUTE_DEFINITION_CLAUSE ::=
49 -- for LOCAL_NAME'ATTRIBUTE_DESIGNATOR use EXPRESSION;
50 -- | for LOCAL_NAME'ATTRIBUTE_DESIGNATOR use NAME;
52 -- Note: in Ada 83, the expression must be a simple expression
54 -- AT_CLAUSE ::= for DIRECT_NAME use at EXPRESSION;
56 -- Note: in Ada 83, the expression must be a simple expression
58 -- ENUMERATION_REPRESENTATION_CLAUSE ::=
59 -- for first_subtype_LOCAL_NAME use ENUMERATION_AGGREGATE;
61 -- ENUMERATION_AGGREGATE ::= ARRAY_AGGREGATE
63 -- RECORD_REPRESENTATION_CLAUSE ::=
64 -- for first_subtype_LOCAL_NAME use
65 -- record [MOD_CLAUSE]
69 -- Note: for now we allow only a direct name as the local name in the
70 -- above constructs. This probably needs changing later on ???
72 -- The caller has checked that the initial token is FOR
74 -- Error recovery: cannot raise Error_Resync, if an error occurs,
75 -- the scan is repositioned past the next semicolon.
77 function P_Representation_Clause
return Node_Id
is
80 Prefix_Node
: Node_Id
;
82 Identifier_Node
: Node_Id
;
83 Rep_Clause_Node
: Node_Id
;
85 Record_Items
: List_Id
;
91 -- Note that the name in a representation clause is always a simple
92 -- name, even in the attribute case, see AI-300 which made this so!
94 Identifier_Node
:= P_Identifier
(C_Use
);
96 -- Check case of qualified name to give good error message
98 if Token
= Tok_Dot
then
100 ("representation clause requires simple name!");
103 exit when Token
/= Tok_Dot
;
105 Discard_Junk_Node
(P_Identifier
);
109 -- Attribute Definition Clause
111 if Token
= Tok_Apostrophe
then
113 -- Allow local names of the form a'b'.... This enables
114 -- us to parse class-wide streams attributes correctly.
116 Name_Node
:= Identifier_Node
;
117 while Token
= Tok_Apostrophe
loop
119 Scan
; -- past apostrophe
121 Identifier_Node
:= Token_Node
;
122 Attr_Name
:= No_Name
;
124 if Token
= Tok_Identifier
then
125 Attr_Name
:= Token_Name
;
127 if not Is_Attribute_Name
(Attr_Name
) then
128 Signal_Bad_Attribute
;
132 Style
.Check_Attribute_Name
(False);
135 -- Here for case of attribute designator is not an identifier
138 if Token
= Tok_Delta
then
139 Attr_Name
:= Name_Delta
;
141 elsif Token
= Tok_Digits
then
142 Attr_Name
:= Name_Digits
;
144 elsif Token
= Tok_Access
then
145 Attr_Name
:= Name_Access
;
148 Error_Msg_AP
("attribute designator expected");
153 Style
.Check_Attribute_Name
(True);
157 -- We come here with an OK attribute scanned, and the
158 -- corresponding Attribute identifier node stored in Ident_Node.
160 Prefix_Node
:= Name_Node
;
161 Name_Node
:= New_Node
(N_Attribute_Reference
, Prev_Token_Ptr
);
162 Set_Prefix
(Name_Node
, Prefix_Node
);
163 Set_Attribute_Name
(Name_Node
, Attr_Name
);
167 Rep_Clause_Node
:= New_Node
(N_Attribute_Definition_Clause
, For_Loc
);
168 Set_Name
(Rep_Clause_Node
, Prefix_Node
);
169 Set_Chars
(Rep_Clause_Node
, Attr_Name
);
172 Expr_Node
:= P_Expression_No_Right_Paren
;
173 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
174 Set_Expression
(Rep_Clause_Node
, Expr_Node
);
178 Rep_Clause_Node
:= Empty
;
180 -- AT follows USE (At Clause)
182 if Token
= Tok_At
then
184 Rep_Clause_Node
:= New_Node
(N_At_Clause
, For_Loc
);
185 Set_Identifier
(Rep_Clause_Node
, Identifier_Node
);
186 Expr_Node
:= P_Expression_No_Right_Paren
;
187 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
188 Set_Expression
(Rep_Clause_Node
, Expr_Node
);
190 -- RECORD follows USE (Record Representation Clause)
192 elsif Token
= Tok_Record
then
193 Record_Items
:= P_Pragmas_Opt
;
195 New_Node
(N_Record_Representation_Clause
, For_Loc
);
196 Set_Identifier
(Rep_Clause_Node
, Identifier_Node
);
199 Scope
.Table
(Scope
.Last
).Etyp
:= E_Record
;
200 Scope
.Table
(Scope
.Last
).Ecol
:= Start_Column
;
201 Scope
.Table
(Scope
.Last
).Sloc
:= Token_Ptr
;
203 Record_Items
:= P_Pragmas_Opt
;
205 -- Possible Mod Clause
207 if Token
= Tok_At
then
208 Set_Mod_Clause
(Rep_Clause_Node
, P_Mod_Clause
);
209 Set_Pragmas_Before
(Mod_Clause
(Rep_Clause_Node
), Record_Items
);
210 Record_Items
:= P_Pragmas_Opt
;
213 if No
(Record_Items
) then
214 Record_Items
:= New_List
;
217 Set_Component_Clauses
(Rep_Clause_Node
, Record_Items
);
219 -- Loop through component clauses
222 if Token
not in Token_Class_Name
then
226 Append
(P_Component_Clause
, Record_Items
);
227 P_Pragmas_Opt
(Record_Items
);
230 -- Left paren follows USE (Enumeration Representation Clause)
232 elsif Token
= Tok_Left_Paren
then
234 New_Node
(N_Enumeration_Representation_Clause
, For_Loc
);
235 Set_Identifier
(Rep_Clause_Node
, Identifier_Node
);
236 Set_Array_Aggregate
(Rep_Clause_Node
, P_Aggregate
);
238 -- Some other token follows FOR (invalid representation clause)
241 Error_Msg_SC
("invalid representation clause");
247 return Rep_Clause_Node
;
251 Resync_Past_Semicolon
;
254 end P_Representation_Clause
;
256 ----------------------
257 -- 13.1 Local Name --
258 ----------------------
260 -- Local name is always parsed by its parent. In the case of its use in
261 -- pragmas, the check for a local name is handled in Par.Prag and allows
262 -- all the possible forms of local name. For the uses in chapter 13, we
263 -- currently only allow a direct name, but this should probably change???
265 ---------------------------
266 -- 13.1 At Clause (I.7) --
267 ---------------------------
269 -- Parsed by P_Representation_Clause (13.1)
271 ---------------------------------------
272 -- 13.3 Attribute Definition Clause --
273 ---------------------------------------
275 -- Parsed by P_Representation_Clause (13.1)
277 ---------------------------------------------
278 -- 13.4 Enumeration Representation Clause --
279 ---------------------------------------------
281 -- Parsed by P_Representation_Clause (13.1)
283 ---------------------------------
284 -- 13.4 Enumeration Aggregate --
285 ---------------------------------
287 -- Parsed by P_Representation_Clause (13.1)
289 ------------------------------------------
290 -- 13.5.1 Record Representation Clause --
291 ------------------------------------------
293 -- Parsed by P_Representation_Clause (13.1)
295 ------------------------------
296 -- 13.5.1 Mod Clause (I.8) --
297 ------------------------------
299 -- MOD_CLAUSE ::= at mod static_EXPRESSION;
301 -- Note: in Ada 83, the expression must be a simple expression
303 -- The caller has checked that the initial Token is AT
305 -- Error recovery: cannot raise Error_Resync
307 -- Note: the caller is responsible for setting the Pragmas_Before field
309 function P_Mod_Clause
return Node_Id
is
314 Mod_Node
:= New_Node
(N_Mod_Clause
, Token_Ptr
);
317 Expr_Node
:= P_Expression_No_Right_Paren
;
318 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
319 Set_Expression
(Mod_Node
, Expr_Node
);
324 ------------------------------
325 -- 13.5.1 Component Clause --
326 ------------------------------
328 -- COMPONENT_CLAUSE ::=
329 -- COMPONENT_CLAUSE_COMPONENT_NAME at POSITION
330 -- range FIRST_BIT .. LAST_BIT;
332 -- COMPONENT_CLAUSE_COMPONENT_NAME ::=
333 -- component_DIRECT_NAME
334 -- | component_DIRECT_NAME'ATTRIBUTE_DESIGNATOR
335 -- | FIRST_SUBTYPE_DIRECT_NAME'ATTRIBUTE_DESIGNATOR
337 -- POSITION ::= static_EXPRESSION
339 -- Note: in Ada 83, the expression must be a simple expression
341 -- FIRST_BIT ::= static_SIMPLE_EXPRESSION
342 -- LAST_BIT ::= static_SIMPLE_EXPRESSION
344 -- Note: the AARM V2.0 grammar has an error at this point, it uses
345 -- EXPRESSION instead of SIMPLE_EXPRESSION for FIRST_BIT and LAST_BIT
347 -- Error recovery: cannot raise Error_Resync
349 function P_Component_Clause
return Node_Id
is
350 Component_Node
: Node_Id
;
355 Component_Node
:= New_Node
(N_Component_Clause
, Token_Ptr
);
358 if Nkind
(Comp_Name
) = N_Identifier
359 or else Nkind
(Comp_Name
) = N_Attribute_Reference
361 Set_Component_Name
(Component_Node
, Comp_Name
);
364 ("component name must be direct name or attribute", Comp_Name
);
365 Set_Component_Name
(Component_Node
, Error
);
368 Set_Sloc
(Component_Node
, Token_Ptr
);
370 Expr_Node
:= P_Expression_No_Right_Paren
;
371 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
372 Set_Position
(Component_Node
, Expr_Node
);
374 Expr_Node
:= P_Expression_No_Right_Paren
;
375 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
376 Set_First_Bit
(Component_Node
, Expr_Node
);
378 Expr_Node
:= P_Expression_No_Right_Paren
;
379 Check_Simple_Expression_In_Ada_83
(Expr_Node
);
380 Set_Last_Bit
(Component_Node
, Expr_Node
);
382 return Component_Node
;
383 end P_Component_Clause
;
385 ----------------------
386 -- 13.5.1 Position --
387 ----------------------
389 -- Parsed by P_Component_Clause (13.5.1)
391 -----------------------
392 -- 13.5.1 First Bit --
393 -----------------------
395 -- Parsed by P_Component_Clause (13.5.1)
397 ----------------------
398 -- 13.5.1 Last Bit --
399 ----------------------
401 -- Parsed by P_Component_Clause (13.5.1)
403 --------------------------
404 -- 13.8 Code Statement --
405 --------------------------
407 -- CODE_STATEMENT ::= QUALIFIED_EXPRESSION
409 -- On entry the caller has scanned the SUBTYPE_MARK (passed in as the
410 -- single argument, and the scan points to the apostrophe.
412 -- Error recovery: can raise Error_Resync
414 function P_Code_Statement
(Subtype_Mark
: Node_Id
) return Node_Id
is
418 Scan
; -- past apostrophe
420 -- If left paren, then we have a possible code statement
422 if Token
= Tok_Left_Paren
then
423 Node1
:= New_Node
(N_Code_Statement
, Sloc
(Subtype_Mark
));
424 Set_Expression
(Node1
, P_Qualified_Expression
(Subtype_Mark
));
428 -- Otherwise we have an illegal range attribute. Note that P_Name
429 -- ensures that Token = Tok_Range is the only possibility left here.
431 else -- Token = Tok_Range
432 Error_Msg_SC
("RANGE attribute illegal here!");
436 end P_Code_Statement
;