OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [par-ch5.adb] - Blame information for rev 706

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                         GNAT COMPILER COMPONENTS                         --
4
--                                                                          --
5
--                              P A R . C H 5                               --
6
--                                                                          --
7
--                                 B o d y                                  --
8
--                                                                          --
9
--          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10
--                                                                          --
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.          --
20
--                                                                          --
21
-- GNAT was originally developed  by the GNAT team at  New York University. --
22
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23
--                                                                          --
24
------------------------------------------------------------------------------
25
 
26
pragma Style_Checks (All_Checks);
27
--  Turn off subprogram body ordering check. Subprograms are in order by RM
28
--  section rather than alphabetical.
29
 
30
with Sinfo.CN; use Sinfo.CN;
31
 
32
separate (Par)
33
package body Ch5 is
34
 
35
   --  Local functions, used only in this chapter
36
 
37
   function P_Case_Statement                     return Node_Id;
38
   function P_Case_Statement_Alternative         return Node_Id;
39
   function P_Exit_Statement                     return Node_Id;
40
   function P_Goto_Statement                     return Node_Id;
41
   function P_If_Statement                       return Node_Id;
42
   function P_Label                              return Node_Id;
43
   function P_Null_Statement                     return Node_Id;
44
 
45
   function P_Assignment_Statement (LHS : Node_Id)  return Node_Id;
46
   --  Parse assignment statement. On entry, the caller has scanned the left
47
   --  hand side (passed in as Lhs), and the colon-equal (or some symbol
48
   --  taken to be an error equivalent such as equal).
49
 
50
   function P_Begin_Statement (Block_Name : Node_Id := Empty) return Node_Id;
51
   --  Parse begin-end statement. If Block_Name is non-Empty on entry, it is
52
   --  the N_Identifier node for the label on the block. If Block_Name is
53
   --  Empty on entry (the default), then the block statement is unlabeled.
54
 
55
   function P_Declare_Statement (Block_Name : Node_Id := Empty) return Node_Id;
56
   --  Parse declare block. If Block_Name is non-Empty on entry, it is
57
   --  the N_Identifier node for the label on the block. If Block_Name is
58
   --  Empty on entry (the default), then the block statement is unlabeled.
59
 
60
   function P_For_Statement (Loop_Name : Node_Id := Empty) return Node_Id;
61
   --  Parse for statement. If Loop_Name is non-Empty on entry, it is
62
   --  the N_Identifier node for the label on the loop. If Loop_Name is
63
   --  Empty on entry (the default), then the for statement is unlabeled.
64
 
65
   function P_Iterator_Specification (Def_Id : Node_Id) return Node_Id;
66
   --  Parse an iterator specification. The defining identifier has already
67
   --  been scanned, as it is the common prefix between loop and iterator
68
   --  specification.
69
 
70
   function P_Loop_Statement (Loop_Name : Node_Id := Empty) return Node_Id;
71
   --  Parse loop statement. If Loop_Name is non-Empty on entry, it is
72
   --  the N_Identifier node for the label on the loop. If Loop_Name is
73
   --  Empty on entry (the default), then the loop statement is unlabeled.
74
 
75
   function P_While_Statement (Loop_Name : Node_Id := Empty) return Node_Id;
76
   --  Parse while statement. If Loop_Name is non-Empty on entry, it is
77
   --  the N_Identifier node for the label on the loop. If Loop_Name is
78
   --  Empty on entry (the default), then the while statement is unlabeled.
79
 
80
   function Set_Loop_Block_Name (L : Character) return Name_Id;
81
   --  Given a letter 'L' for a loop or 'B' for a block, returns a name
82
   --  of the form L_nn or B_nn where nn is a serial number obtained by
83
   --  incrementing the variable Loop_Block_Count.
84
 
85
   procedure Then_Scan;
86
   --  Scan past THEN token, testing for illegal junk after it
87
 
88
   ---------------------------------
89
   -- 5.1  Sequence of Statements --
90
   ---------------------------------
91
 
92
   --  SEQUENCE_OF_STATEMENTS ::= STATEMENT {STATEMENT} {LABEL}
93
   --  Note: the final label is an Ada 2012 addition.
94
 
95
   --  STATEMENT ::=
96
   --    {LABEL} SIMPLE_STATEMENT | {LABEL} COMPOUND_STATEMENT
97
 
98
   --  SIMPLE_STATEMENT ::=      NULL_STATEMENT
99
   --  | ASSIGNMENT_STATEMENT  | EXIT_STATEMENT
100
   --  | GOTO_STATEMENT        | PROCEDURE_CALL_STATEMENT
101
   --  | RETURN_STATEMENT      | ENTRY_CALL_STATEMENT
102
   --  | REQUEUE_STATEMENT     | DELAY_STATEMENT
103
   --  | ABORT_STATEMENT       | RAISE_STATEMENT
104
   --  | CODE_STATEMENT
105
 
106
   --  COMPOUND_STATEMENT ::=
107
   --    IF_STATEMENT         | CASE_STATEMENT
108
   --  | LOOP_STATEMENT       | BLOCK_STATEMENT
109
   --  | ACCEPT_STATEMENT     | SELECT_STATEMENT
110
 
111
   --  This procedure scans a sequence of statements. The caller sets SS_Flags
112
   --  to indicate acceptable termination conditions for the sequence:
113
 
114
   --    SS_Flags.Eftm Terminate on ELSIF
115
   --    SS_Flags.Eltm Terminate on ELSE
116
   --    SS_Flags.Extm Terminate on EXCEPTION
117
   --    SS_Flags.Ortm Terminate on OR
118
   --    SS_Flags.Tatm Terminate on THEN ABORT (Token = ABORT on return)
119
   --    SS_Flags.Whtm Terminate on WHEN
120
   --    SS_Flags.Unco Unconditional terminate after scanning one statement
121
 
122
   --  In addition, the scan is always terminated by encountering END or the
123
   --  end of file (EOF) condition. If one of the six above terminators is
124
   --  encountered with the corresponding SS_Flags flag not set, then the
125
   --  action taken is as follows:
126
 
127
   --    If the keyword occurs to the left of the expected column of the end
128
   --    for the current sequence (as recorded in the current end context),
129
   --    then it is assumed to belong to an outer context, and is considered
130
   --    to terminate the sequence of statements.
131
 
132
   --    If the keyword occurs to the right of, or in the expected column of
133
   --    the end for the current sequence, then an error message is output,
134
   --    the keyword together with its associated context is skipped, and
135
   --    the statement scan continues until another terminator is found.
136
 
137
   --  Note that the first action means that control can return to the caller
138
   --  with Token set to a terminator other than one of those specified by the
139
   --  SS parameter. The caller should treat such a case as equivalent to END.
140
 
141
   --  In addition, the flag SS_Flags.Sreq is set to True to indicate that at
142
   --  least one real statement (other than a pragma) is required in the
143
   --  statement sequence. During the processing of the sequence, this
144
   --  flag is manipulated to indicate the current status of the requirement
145
   --  for a statement. For example, it is turned off by the occurrence of a
146
   --  statement, and back on by a label (which requires a following statement)
147
 
148
   --  Error recovery: cannot raise Error_Resync. If an error occurs during
149
   --  parsing a statement, then the scan pointer is advanced past the next
150
   --  semicolon and the parse continues.
151
 
152
   function P_Sequence_Of_Statements (SS_Flags : SS_Rec) return List_Id is
153
 
154
      Statement_Required : Boolean;
155
      --  This flag indicates if a subsequent statement (other than a pragma)
156
      --  is required. It is initialized from the Sreq flag, and modified as
157
      --  statements are scanned (a statement turns it off, and a label turns
158
      --  it back on again since a statement must follow a label).
159
      --  Note : this final requirement is lifted in Ada 2012.
160
 
161
      Statement_Seen : Boolean;
162
      --  In Ada 2012, a label can end a sequence of statements, but the
163
      --  sequence cannot contain only labels. This flag is set whenever a
164
      --  label is encountered, to enforce this rule at the end of a sequence.
165
 
166
      Declaration_Found : Boolean := False;
167
      --  This flag is set True if a declaration is encountered, so that the
168
      --  error message about declarations in the statement part is only
169
      --  given once for a given sequence of statements.
170
 
171
      Scan_State_Label : Saved_Scan_State;
172
      Scan_State       : Saved_Scan_State;
173
 
174
      Statement_List : List_Id;
175
      Block_Label    : Name_Id;
176
      Id_Node        : Node_Id;
177
      Name_Node      : Node_Id;
178
 
179
      procedure Junk_Declaration;
180
      --  Procedure called to handle error of declaration encountered in
181
      --  statement sequence.
182
 
183
      procedure Test_Statement_Required;
184
      --  Flag error if Statement_Required flag set
185
 
186
      ----------------------
187
      -- Junk_Declaration --
188
      ----------------------
189
 
190
      procedure Junk_Declaration is
191
      begin
192
         if (not Declaration_Found) or All_Errors_Mode then
193
            Error_Msg_SC -- CODEFIX
194
              ("declarations must come before BEGIN");
195
            Declaration_Found := True;
196
         end if;
197
 
198
         Skip_Declaration (Statement_List);
199
      end Junk_Declaration;
200
 
201
      -----------------------------
202
      -- Test_Statement_Required --
203
      -----------------------------
204
 
205
      procedure Test_Statement_Required is
206
         function All_Pragmas return Boolean;
207
         --  Return True if statement list is all pragmas
208
 
209
         -----------------
210
         -- All_Pragmas --
211
         -----------------
212
 
213
         function All_Pragmas return Boolean is
214
            S : Node_Id;
215
         begin
216
            S := First (Statement_List);
217
            while Present (S) loop
218
               if Nkind (S) /= N_Pragma then
219
                  return False;
220
               else
221
                  Next (S);
222
               end if;
223
            end loop;
224
 
225
            return True;
226
         end All_Pragmas;
227
 
228
      --  Start of processing for Test_Statement_Required
229
 
230
      begin
231
         if Statement_Required then
232
 
233
            --  Check no statement required after label in Ada 2012, and that
234
            --  it is OK to have nothing but pragmas in a statement sequence.
235
 
236
            if Ada_Version >= Ada_2012
237
              and then not Is_Empty_List (Statement_List)
238
              and then
239
                ((Nkind (Last (Statement_List)) = N_Label
240
                   and then Statement_Seen)
241
                or else All_Pragmas)
242
            then
243
               declare
244
                  Null_Stm : constant Node_Id :=
245
                               Make_Null_Statement (Token_Ptr);
246
               begin
247
                  Set_Comes_From_Source (Null_Stm, False);
248
                  Append_To (Statement_List, Null_Stm);
249
               end;
250
 
251
            --  If not Ada 2012, or not special case above, give error message
252
 
253
            else
254
               Error_Msg_BC -- CODEFIX
255
                 ("statement expected");
256
            end if;
257
         end if;
258
      end Test_Statement_Required;
259
 
260
   --  Start of processing for P_Sequence_Of_Statements
261
 
262
   begin
263
      Statement_List := New_List;
264
      Statement_Required := SS_Flags.Sreq;
265
      Statement_Seen     := False;
266
 
267
      loop
268
         Ignore (Tok_Semicolon);
269
 
270
         begin
271
            if Style_Check then
272
               Style.Check_Indentation;
273
            end if;
274
 
275
            --  Deal with reserved identifier (in assignment or call)
276
 
277
            if Is_Reserved_Identifier then
278
               Save_Scan_State (Scan_State); -- at possible bad identifier
279
               Scan; -- and scan past it
280
 
281
               --  We have an reserved word which is spelled in identifier
282
               --  style, so the question is whether it really is intended
283
               --  to be an identifier.
284
 
285
               if
286
                  --  If followed by a semicolon, then it is an identifier,
287
                  --  with the exception of the cases tested for below.
288
 
289
                  (Token = Tok_Semicolon
290
                    and then Prev_Token /= Tok_Return
291
                    and then Prev_Token /= Tok_Null
292
                    and then Prev_Token /= Tok_Raise
293
                    and then Prev_Token /= Tok_End
294
                    and then Prev_Token /= Tok_Exit)
295
 
296
                  --  If followed by colon, colon-equal, or dot, then we
297
                  --  definitely  have an identifier (could not be reserved)
298
 
299
                  or else Token = Tok_Colon
300
                  or else Token = Tok_Colon_Equal
301
                  or else Token = Tok_Dot
302
 
303
                  --  Left paren means we have an identifier except for those
304
                  --  reserved words that can legitimately be followed by a
305
                  --  left paren.
306
 
307
                  or else
308
                    (Token = Tok_Left_Paren
309
                      and then Prev_Token /= Tok_Case
310
                      and then Prev_Token /= Tok_Delay
311
                      and then Prev_Token /= Tok_If
312
                      and then Prev_Token /= Tok_Elsif
313
                      and then Prev_Token /= Tok_Return
314
                      and then Prev_Token /= Tok_When
315
                      and then Prev_Token /= Tok_While
316
                      and then Prev_Token /= Tok_Separate)
317
               then
318
                  --  Here we have an apparent reserved identifier and the
319
                  --  token past it is appropriate to this usage (and would
320
                  --  be a definite error if this is not an identifier). What
321
                  --  we do is to use P_Identifier to fix up the identifier,
322
                  --  and then fall into the normal processing.
323
 
324
                  Restore_Scan_State (Scan_State); -- back to the ID
325
                  Scan_Reserved_Identifier (Force_Msg => False);
326
 
327
                  --  Not a reserved identifier after all (or at least we can't
328
                  --  be sure that it is), so reset the scan and continue.
329
 
330
               else
331
                  Restore_Scan_State (Scan_State); -- back to the reserved word
332
               end if;
333
            end if;
334
 
335
            --  Now look to see what kind of statement we have
336
 
337
            case Token is
338
 
339
               --  Case of end or EOF
340
 
341
               when Tok_End | Tok_EOF =>
342
 
343
                  --  These tokens always terminate the statement sequence
344
 
345
                  Test_Statement_Required;
346
                  exit;
347
 
348
               --  Case of ELSIF
349
 
350
               when Tok_Elsif =>
351
 
352
                  --  Terminate if Eftm set or if the ELSIF is to the left
353
                  --  of the expected column of the end for this sequence
354
 
355
                  if SS_Flags.Eftm
356
                     or else Start_Column < Scope.Table (Scope.Last).Ecol
357
                  then
358
                     Test_Statement_Required;
359
                     exit;
360
 
361
                  --  Otherwise complain and skip past ELSIF Condition then
362
 
363
                  else
364
                     Error_Msg_SC ("ELSIF not allowed here");
365
                     Scan; -- past ELSIF
366
                     Discard_Junk_Node (P_Expression_No_Right_Paren);
367
                     Then_Scan;
368
                     Statement_Required := False;
369
                  end if;
370
 
371
               --  Case of ELSE
372
 
373
               when Tok_Else =>
374
 
375
                  --  Terminate if Eltm set or if the else is to the left
376
                  --  of the expected column of the end for this sequence
377
 
378
                  if SS_Flags.Eltm
379
                     or else Start_Column < Scope.Table (Scope.Last).Ecol
380
                  then
381
                     Test_Statement_Required;
382
                     exit;
383
 
384
                  --  Otherwise complain and skip past else
385
 
386
                  else
387
                     Error_Msg_SC ("ELSE not allowed here");
388
                     Scan; -- past ELSE
389
                     Statement_Required := False;
390
                  end if;
391
 
392
               --  Case of exception
393
 
394
               when Tok_Exception =>
395
                  Test_Statement_Required;
396
 
397
                  --  If Extm not set and the exception is not to the left of
398
                  --  the expected column of the end for this sequence, then we
399
                  --  assume it belongs to the current sequence, even though it
400
                  --  is not permitted.
401
 
402
                  if not SS_Flags.Extm and then
403
                     Start_Column >= Scope.Table (Scope.Last).Ecol
404
 
405
                  then
406
                     Error_Msg_SC ("exception handler not permitted here");
407
                     Scan; -- past EXCEPTION
408
                     Discard_Junk_List (Parse_Exception_Handlers);
409
                  end if;
410
 
411
                  --  Always return, in the case where we scanned out handlers
412
                  --  that we did not expect, Parse_Exception_Handlers returned
413
                  --  with Token being either end or EOF, so we are OK.
414
 
415
                  exit;
416
 
417
               --  Case of OR
418
 
419
               when Tok_Or =>
420
 
421
                  --  Terminate if Ortm set or if the or is to the left of the
422
                  --  expected column of the end for this sequence.
423
 
424
                  if SS_Flags.Ortm
425
                     or else Start_Column < Scope.Table (Scope.Last).Ecol
426
                  then
427
                     Test_Statement_Required;
428
                     exit;
429
 
430
                  --  Otherwise complain and skip past or
431
 
432
                  else
433
                     Error_Msg_SC ("OR not allowed here");
434
                     Scan; -- past or
435
                     Statement_Required := False;
436
                  end if;
437
 
438
               --  Case of THEN (deal also with THEN ABORT)
439
 
440
               when Tok_Then =>
441
                  Save_Scan_State (Scan_State); -- at THEN
442
                  Scan; -- past THEN
443
 
444
                  --  Terminate if THEN ABORT allowed (ATC case)
445
 
446
                  exit when SS_Flags.Tatm and then Token = Tok_Abort;
447
 
448
                  --  Otherwise we treat THEN as some kind of mess where we did
449
                  --  not see the associated IF, but we pick up assuming it had
450
                  --  been there!
451
 
452
                  Restore_Scan_State (Scan_State); -- to THEN
453
                  Append_To (Statement_List, P_If_Statement);
454
                  Statement_Required := False;
455
 
456
               --  Case of WHEN (error because we are not in a case)
457
 
458
               when Tok_When | Tok_Others =>
459
 
460
                  --  Terminate if Whtm set or if the WHEN is to the left of
461
                  --  the expected column of the end for this sequence.
462
 
463
                  if SS_Flags.Whtm
464
                     or else Start_Column < Scope.Table (Scope.Last).Ecol
465
                  then
466
                     Test_Statement_Required;
467
                     exit;
468
 
469
                  --  Otherwise complain and skip when Choice {| Choice} =>
470
 
471
                  else
472
                     Error_Msg_SC ("WHEN not allowed here");
473
                     Scan; -- past when
474
                     Discard_Junk_List (P_Discrete_Choice_List);
475
                     TF_Arrow;
476
                     Statement_Required := False;
477
                  end if;
478
 
479
               --  Cases of statements starting with an identifier
480
 
481
               when Tok_Identifier =>
482
                  Check_Bad_Layout;
483
 
484
                  --  Save scan pointers and line number in case block label
485
 
486
                  Id_Node := Token_Node;
487
                  Block_Label := Token_Name;
488
                  Save_Scan_State (Scan_State_Label); -- at possible label
489
                  Scan; -- past Id
490
 
491
                  --  Check for common case of assignment, since it occurs
492
                  --  frequently, and we want to process it efficiently.
493
 
494
                  if Token = Tok_Colon_Equal then
495
                     Scan; -- past the colon-equal
496
                     Append_To (Statement_List,
497
                       P_Assignment_Statement (Id_Node));
498
                     Statement_Required := False;
499
 
500
                  --  Check common case of procedure call, another case that
501
                  --  we want to speed up as much as possible.
502
 
503
                  elsif Token = Tok_Semicolon then
504
                     Change_Name_To_Procedure_Call_Statement (Id_Node);
505
                     Append_To (Statement_List, Id_Node);
506
                     Scan; -- past semicolon
507
                     Statement_Required := False;
508
 
509
                  --  Check for case of "go to" in place of "goto"
510
 
511
                  elsif Token = Tok_Identifier
512
                    and then Block_Label = Name_Go
513
                    and then Token_Name = Name_To
514
                  then
515
                     Error_Msg_SP -- CODEFIX
516
                       ("goto is one word");
517
                     Append_To (Statement_List, P_Goto_Statement);
518
                     Statement_Required := False;
519
 
520
                  --  Check common case of = used instead of :=, just so we
521
                  --  give a better error message for this special misuse.
522
 
523
                  elsif Token = Tok_Equal then
524
                     T_Colon_Equal; -- give := expected message
525
                     Append_To (Statement_List,
526
                       P_Assignment_Statement (Id_Node));
527
                     Statement_Required := False;
528
 
529
                  --  Check case of loop label or block label
530
 
531
                  elsif Token = Tok_Colon
532
                    or else (Token in Token_Class_Labeled_Stmt
533
                              and then not Token_Is_At_Start_Of_Line)
534
                  then
535
                     T_Colon; -- past colon (if there, or msg for missing one)
536
 
537
                     --  Test for more than one label
538
 
539
                     loop
540
                        exit when Token /= Tok_Identifier;
541
                        Save_Scan_State (Scan_State); -- at second Id
542
                        Scan; -- past Id
543
 
544
                        if Token = Tok_Colon then
545
                           Error_Msg_SP
546
                              ("only one label allowed on block or loop");
547
                           Scan; -- past colon on extra label
548
 
549
                           --  Use the second label as the "real" label
550
 
551
                           Scan_State_Label := Scan_State;
552
 
553
                           --  We will set Error_name as the Block_Label since
554
                           --  we really don't know which of the labels might
555
                           --  be used at the end of the loop or block!
556
 
557
                           Block_Label := Error_Name;
558
 
559
                        --  If Id with no colon, then backup to point to the
560
                        --  Id and we will issue the message below when we try
561
                        --  to scan out the statement as some other form.
562
 
563
                        else
564
                           Restore_Scan_State (Scan_State); -- to second Id
565
                           exit;
566
                        end if;
567
                     end loop;
568
 
569
                     --  Loop_Statement (labeled Loop_Statement)
570
 
571
                     if Token = Tok_Loop then
572
                        Append_To (Statement_List,
573
                          P_Loop_Statement (Id_Node));
574
 
575
                     --  While statement (labeled loop statement with WHILE)
576
 
577
                     elsif Token = Tok_While then
578
                        Append_To (Statement_List,
579
                          P_While_Statement (Id_Node));
580
 
581
                     --  Declare statement (labeled block statement with
582
                     --  DECLARE part)
583
 
584
                     elsif Token = Tok_Declare then
585
                        Append_To (Statement_List,
586
                          P_Declare_Statement (Id_Node));
587
 
588
                     --  Begin statement (labeled block statement with no
589
                     --  DECLARE part)
590
 
591
                     elsif Token = Tok_Begin then
592
                        Append_To (Statement_List,
593
                          P_Begin_Statement (Id_Node));
594
 
595
                     --  For statement (labeled loop statement with FOR)
596
 
597
                     elsif Token = Tok_For then
598
                        Append_To (Statement_List,
599
                          P_For_Statement (Id_Node));
600
 
601
                     --  Improper statement follows label. If we have an
602
                     --  expression token, then assume the colon was part
603
                     --  of a misplaced declaration.
604
 
605
                     elsif Token not in Token_Class_Eterm then
606
                        Restore_Scan_State (Scan_State_Label);
607
                        Junk_Declaration;
608
 
609
                     --  Otherwise complain we have inappropriate statement
610
 
611
                     else
612
                        Error_Msg_AP
613
                          ("loop or block statement must follow label");
614
                     end if;
615
 
616
                     Statement_Required := False;
617
 
618
                  --  Here we have an identifier followed by something
619
                  --  other than a colon, semicolon or assignment symbol.
620
                  --  The only valid possibility is a name extension symbol
621
 
622
                  elsif Token in Token_Class_Namext then
623
                     Restore_Scan_State (Scan_State_Label); -- to Id
624
                     Name_Node := P_Name;
625
 
626
                     --  Skip junk right parens in this context
627
 
628
                     Ignore (Tok_Right_Paren);
629
 
630
                     --  Check context following call
631
 
632
                     if Token = Tok_Colon_Equal then
633
                        Scan; -- past colon equal
634
                        Append_To (Statement_List,
635
                          P_Assignment_Statement (Name_Node));
636
                        Statement_Required := False;
637
 
638
                     --  Check common case of = used instead of :=
639
 
640
                     elsif Token = Tok_Equal then
641
                        T_Colon_Equal; -- give := expected message
642
                        Append_To (Statement_List,
643
                          P_Assignment_Statement (Name_Node));
644
                        Statement_Required := False;
645
 
646
                     --  Check apostrophe cases
647
 
648
                     elsif Token = Tok_Apostrophe then
649
                        Append_To (Statement_List,
650
                          P_Code_Statement (Name_Node));
651
                        Statement_Required := False;
652
 
653
                     --  The only other valid item after a name is ; which
654
                     --  means that the item we just scanned was a call.
655
 
656
                     elsif Token = Tok_Semicolon then
657
                        Change_Name_To_Procedure_Call_Statement (Name_Node);
658
                        Append_To (Statement_List, Name_Node);
659
                        Scan; -- past semicolon
660
                        Statement_Required := False;
661
 
662
                     --  A slash following an identifier or a selected
663
                     --  component in this situation is most likely a period
664
                     --  (see location of keys on keyboard).
665
 
666
                     elsif Token = Tok_Slash
667
                       and then (Nkind (Name_Node) = N_Identifier
668
                                   or else
669
                                 Nkind (Name_Node) = N_Selected_Component)
670
                     then
671
                        Error_Msg_SC -- CODEFIX
672
                          ("""/"" should be "".""");
673
                        Statement_Required := False;
674
                        raise Error_Resync;
675
 
676
                     --  Else we have a missing semicolon
677
 
678
                     else
679
                        TF_Semicolon;
680
                        Statement_Required := False;
681
                     end if;
682
 
683
                  --  If junk after identifier, check if identifier is an
684
                  --  instance of an incorrectly spelled keyword. If so, we
685
                  --  do nothing. The Bad_Spelling_Of will have reset Token
686
                  --  to the appropriate keyword, so the next time round the
687
                  --  loop we will process the modified token. Note that we
688
                  --  check for ELSIF before ELSE here. That's not accidental.
689
                  --  We don't want to identify a misspelling of ELSE as
690
                  --  ELSIF, and in particular we do not want to treat ELSEIF
691
                  --  as ELSE IF.
692
 
693
                  else
694
                     Restore_Scan_State (Scan_State_Label); -- to identifier
695
 
696
                     if Bad_Spelling_Of (Tok_Abort)
697
                       or else Bad_Spelling_Of (Tok_Accept)
698
                       or else Bad_Spelling_Of (Tok_Case)
699
                       or else Bad_Spelling_Of (Tok_Declare)
700
                       or else Bad_Spelling_Of (Tok_Delay)
701
                       or else Bad_Spelling_Of (Tok_Elsif)
702
                       or else Bad_Spelling_Of (Tok_Else)
703
                       or else Bad_Spelling_Of (Tok_End)
704
                       or else Bad_Spelling_Of (Tok_Exception)
705
                       or else Bad_Spelling_Of (Tok_Exit)
706
                       or else Bad_Spelling_Of (Tok_For)
707
                       or else Bad_Spelling_Of (Tok_Goto)
708
                       or else Bad_Spelling_Of (Tok_If)
709
                       or else Bad_Spelling_Of (Tok_Loop)
710
                       or else Bad_Spelling_Of (Tok_Or)
711
                       or else Bad_Spelling_Of (Tok_Pragma)
712
                       or else Bad_Spelling_Of (Tok_Raise)
713
                       or else Bad_Spelling_Of (Tok_Requeue)
714
                       or else Bad_Spelling_Of (Tok_Return)
715
                       or else Bad_Spelling_Of (Tok_Select)
716
                       or else Bad_Spelling_Of (Tok_When)
717
                       or else Bad_Spelling_Of (Tok_While)
718
                     then
719
                        null;
720
 
721
                     --  If not a bad spelling, then we really have junk
722
 
723
                     else
724
                        Scan; -- past identifier again
725
 
726
                        --  If next token is first token on line, then we
727
                        --  consider that we were missing a semicolon after
728
                        --  the identifier, and process it as a procedure
729
                        --  call with no parameters.
730
 
731
                        if Token_Is_At_Start_Of_Line then
732
                           Change_Name_To_Procedure_Call_Statement (Id_Node);
733
                           Append_To (Statement_List, Id_Node);
734
                           T_Semicolon; -- to give error message
735
                           Statement_Required := False;
736
 
737
                        --  Otherwise we give a missing := message and
738
                        --  simply abandon the junk that is there now.
739
 
740
                        else
741
                           T_Colon_Equal; -- give := expected message
742
                           raise Error_Resync;
743
                        end if;
744
 
745
                     end if;
746
                  end if;
747
 
748
               --  Statement starting with operator symbol. This could be
749
               --  a call, a name starting an assignment, or a qualified
750
               --  expression.
751
 
752
               when Tok_Operator_Symbol =>
753
                  Check_Bad_Layout;
754
                  Name_Node := P_Name;
755
 
756
                  --  An attempt at a range attribute or a qualified expression
757
                  --  must be illegal here (a code statement cannot possibly
758
                  --  allow qualification by a function name).
759
 
760
                  if Token = Tok_Apostrophe then
761
                     Error_Msg_SC ("apostrophe illegal here");
762
                     raise Error_Resync;
763
                  end if;
764
 
765
                  --  Scan possible assignment if we have a name
766
 
767
                  if Expr_Form = EF_Name
768
                    and then Token = Tok_Colon_Equal
769
                  then
770
                     Scan; -- past colon equal
771
                     Append_To (Statement_List,
772
                       P_Assignment_Statement (Name_Node));
773
                  else
774
                     Change_Name_To_Procedure_Call_Statement (Name_Node);
775
                     Append_To (Statement_List, Name_Node);
776
                  end if;
777
 
778
                  TF_Semicolon;
779
                  Statement_Required := False;
780
 
781
               --  Label starting with << which must precede real statement
782
               --  Note: in Ada 2012, the label may end the sequence.
783
 
784
               when Tok_Less_Less =>
785
                  if Present (Last (Statement_List))
786
                    and then Nkind (Last (Statement_List)) /= N_Label
787
                  then
788
                     Statement_Seen := True;
789
                  end if;
790
 
791
                  Append_To (Statement_List, P_Label);
792
                  Statement_Required := True;
793
 
794
               --  Pragma appearing as a statement in a statement sequence
795
 
796
               when Tok_Pragma =>
797
                  Check_Bad_Layout;
798
                  Append_To (Statement_List, P_Pragma);
799
 
800
               --  Abort_Statement
801
 
802
               when Tok_Abort =>
803
                  Check_Bad_Layout;
804
                  Append_To (Statement_List, P_Abort_Statement);
805
                  Statement_Required := False;
806
 
807
               --  Accept_Statement
808
 
809
               when Tok_Accept =>
810
                  Check_Bad_Layout;
811
                  Append_To (Statement_List, P_Accept_Statement);
812
                  Statement_Required := False;
813
 
814
               --  Begin_Statement (Block_Statement with no declare, no label)
815
 
816
               when Tok_Begin =>
817
                  Check_Bad_Layout;
818
                  Append_To (Statement_List, P_Begin_Statement);
819
                  Statement_Required := False;
820
 
821
               --  Case_Statement
822
 
823
               when Tok_Case =>
824
                  Check_Bad_Layout;
825
                  Append_To (Statement_List, P_Case_Statement);
826
                  Statement_Required := False;
827
 
828
               --  Block_Statement with DECLARE and no label
829
 
830
               when Tok_Declare =>
831
                  Check_Bad_Layout;
832
                  Append_To (Statement_List, P_Declare_Statement);
833
                  Statement_Required := False;
834
 
835
               --  Delay_Statement
836
 
837
               when Tok_Delay =>
838
                  Check_Bad_Layout;
839
                  Append_To (Statement_List, P_Delay_Statement);
840
                  Statement_Required := False;
841
 
842
               --  Exit_Statement
843
 
844
               when Tok_Exit =>
845
                  Check_Bad_Layout;
846
                  Append_To (Statement_List, P_Exit_Statement);
847
                  Statement_Required := False;
848
 
849
               --  Loop_Statement with FOR and no label
850
 
851
               when Tok_For =>
852
                  Check_Bad_Layout;
853
                  Append_To (Statement_List, P_For_Statement);
854
                  Statement_Required := False;
855
 
856
               --  Goto_Statement
857
 
858
               when Tok_Goto =>
859
                  Check_Bad_Layout;
860
                  Append_To (Statement_List, P_Goto_Statement);
861
                  Statement_Required := False;
862
 
863
               --  If_Statement
864
 
865
               when Tok_If =>
866
                  Check_Bad_Layout;
867
                  Append_To (Statement_List, P_If_Statement);
868
                  Statement_Required := False;
869
 
870
               --  Loop_Statement
871
 
872
               when Tok_Loop =>
873
                  Check_Bad_Layout;
874
                  Append_To (Statement_List, P_Loop_Statement);
875
                  Statement_Required := False;
876
 
877
               --  Null_Statement
878
 
879
               when Tok_Null =>
880
                  Check_Bad_Layout;
881
                  Append_To (Statement_List, P_Null_Statement);
882
                  Statement_Required := False;
883
 
884
               --  Raise_Statement
885
 
886
               when Tok_Raise =>
887
                  Check_Bad_Layout;
888
                  Append_To (Statement_List, P_Raise_Statement);
889
                  Statement_Required := False;
890
 
891
               --  Requeue_Statement
892
 
893
               when Tok_Requeue =>
894
                  Check_Bad_Layout;
895
                  Append_To (Statement_List, P_Requeue_Statement);
896
                  Statement_Required := False;
897
 
898
               --  Return_Statement
899
 
900
               when Tok_Return =>
901
                  Check_Bad_Layout;
902
                  Append_To (Statement_List, P_Return_Statement);
903
                  Statement_Required := False;
904
 
905
               --  Select_Statement
906
 
907
               when Tok_Select =>
908
                  Check_Bad_Layout;
909
                  Append_To (Statement_List, P_Select_Statement);
910
                  Statement_Required := False;
911
 
912
               --  While_Statement (Block_Statement with while and no loop)
913
 
914
               when Tok_While =>
915
                  Check_Bad_Layout;
916
                  Append_To (Statement_List, P_While_Statement);
917
                  Statement_Required := False;
918
 
919
               --  Anything else is some kind of junk, signal an error message
920
               --  and then raise Error_Resync, to merge with the normal
921
               --  handling of a bad statement.
922
 
923
               when others =>
924
 
925
                  if Token in Token_Class_Declk then
926
                     Junk_Declaration;
927
 
928
                  else
929
                     Error_Msg_BC -- CODEFIX
930
                       ("statement expected");
931
                     raise Error_Resync;
932
                  end if;
933
            end case;
934
 
935
         --  On error resynchronization, skip past next semicolon, and, since
936
         --  we are still in the statement loop, look for next statement. We
937
         --  set Statement_Required False to avoid an unnecessary error message
938
         --  complaining that no statement was found (i.e. we consider the
939
         --  junk to satisfy the requirement for a statement being present).
940
 
941
         exception
942
            when Error_Resync =>
943
               Resync_Past_Semicolon_Or_To_Loop_Or_Then;
944
               Statement_Required := False;
945
         end;
946
 
947
         exit when SS_Flags.Unco;
948
 
949
      end loop;
950
 
951
      return Statement_List;
952
 
953
   end P_Sequence_Of_Statements;
954
 
955
   --------------------
956
   -- 5.1  Statement --
957
   --------------------
958
 
959
   ---------------------------
960
   -- 5.1  Simple Statement --
961
   ---------------------------
962
 
963
   --  Parsed by P_Sequence_Of_Statements (5.1)
964
 
965
   -----------------------------
966
   -- 5.1  Compound Statement --
967
   -----------------------------
968
 
969
   --  Parsed by P_Sequence_Of_Statements (5.1)
970
 
971
   -------------------------
972
   -- 5.1  Null Statement --
973
   -------------------------
974
 
975
   --  NULL_STATEMENT ::= null;
976
 
977
   --  The caller has already checked that the current token is null
978
 
979
   --  Error recovery: cannot raise Error_Resync
980
 
981
   function P_Null_Statement return Node_Id is
982
      Null_Stmt_Node : Node_Id;
983
 
984
   begin
985
      Null_Stmt_Node := New_Node (N_Null_Statement, Token_Ptr);
986
      Scan; -- past NULL
987
      TF_Semicolon;
988
      return Null_Stmt_Node;
989
   end P_Null_Statement;
990
 
991
   ----------------
992
   -- 5.1  Label --
993
   ----------------
994
 
995
   --  LABEL ::= <<label_STATEMENT_IDENTIFIER>>
996
 
997
   --  STATEMENT_IDENTIFIER ::= DIRECT_NAME
998
 
999
   --  The IDENTIFIER of a STATEMENT_IDENTIFIER shall be an identifier
1000
   --  (not an OPERATOR_SYMBOL)
1001
 
1002
   --  The caller has already checked that the current token is <<
1003
 
1004
   --  Error recovery: can raise Error_Resync
1005
 
1006
   function P_Label return Node_Id is
1007
      Label_Node : Node_Id;
1008
 
1009
   begin
1010
      Label_Node := New_Node (N_Label, Token_Ptr);
1011
      Scan; -- past <<
1012
      Set_Identifier (Label_Node, P_Identifier (C_Greater_Greater));
1013
      T_Greater_Greater;
1014
      Append_Elmt (Label_Node, Label_List);
1015
      return Label_Node;
1016
   end P_Label;
1017
 
1018
   -------------------------------
1019
   -- 5.1  Statement Identifier --
1020
   -------------------------------
1021
 
1022
   --  Statement label is parsed by P_Label (5.1)
1023
 
1024
   --  Loop label is parsed by P_Loop_Statement (5.5), P_For_Statement (5.5)
1025
   --   or P_While_Statement (5.5)
1026
 
1027
   --  Block label is parsed by P_Begin_Statement (5.6) or
1028
   --   P_Declare_Statement (5.6)
1029
 
1030
   -------------------------------
1031
   -- 5.2  Assignment Statement --
1032
   -------------------------------
1033
 
1034
   --  ASSIGNMENT_STATEMENT ::=
1035
   --    variable_NAME := EXPRESSION;
1036
 
1037
   --  Error recovery: can raise Error_Resync
1038
 
1039
   function P_Assignment_Statement (LHS : Node_Id) return Node_Id is
1040
      Assign_Node : Node_Id;
1041
 
1042
   begin
1043
      Assign_Node := New_Node (N_Assignment_Statement, Prev_Token_Ptr);
1044
      Set_Name (Assign_Node, LHS);
1045
      Set_Expression (Assign_Node, P_Expression_No_Right_Paren);
1046
      TF_Semicolon;
1047
      return Assign_Node;
1048
   end P_Assignment_Statement;
1049
 
1050
   -----------------------
1051
   -- 5.3  If Statement --
1052
   -----------------------
1053
 
1054
   --  IF_STATEMENT ::=
1055
   --    if CONDITION then
1056
   --      SEQUENCE_OF_STATEMENTS
1057
   --    {elsif CONDITION then
1058
   --      SEQUENCE_OF_STATEMENTS}
1059
   --    [else
1060
   --      SEQUENCE_OF_STATEMENTS]
1061
   --    end if;
1062
 
1063
   --  The caller has checked that the initial token is IF (or in the error
1064
   --  case of a mysterious THEN, the initial token may simply be THEN, in
1065
   --  which case, no condition (or IF) was scanned).
1066
 
1067
   --  Error recovery: can raise Error_Resync
1068
 
1069
   function P_If_Statement return Node_Id is
1070
      If_Node    : Node_Id;
1071
      Elsif_Node : Node_Id;
1072
      Loc        : Source_Ptr;
1073
 
1074
      procedure Add_Elsif_Part;
1075
      --  An internal procedure used to scan out a single ELSIF part. On entry
1076
      --  the ELSIF (or an ELSE which has been determined should be ELSIF) is
1077
      --  scanned out and is in Prev_Token.
1078
 
1079
      procedure Check_If_Column;
1080
      --  An internal procedure used to check that THEN, ELSE, or ELSIF
1081
      --  appear in the right place if column checking is enabled (i.e. if
1082
      --  they are the first token on the line, then they must appear in
1083
      --  the same column as the opening IF).
1084
 
1085
      procedure Check_Then_Column;
1086
      --  This procedure carries out the style checks for a THEN token
1087
      --  Note that the caller has set Loc to the Source_Ptr value for
1088
      --  the previous IF or ELSIF token. These checks apply only to a
1089
      --  THEN at the start of a line.
1090
 
1091
      function Else_Should_Be_Elsif return Boolean;
1092
      --  An internal routine used to do a special error recovery check when
1093
      --  an ELSE is encountered. It determines if the ELSE should be treated
1094
      --  as an ELSIF. A positive decision (TRUE returned, is made if the ELSE
1095
      --  is followed by a sequence of tokens, starting on the same line as
1096
      --  the ELSE, which are not expression terminators, followed by a THEN.
1097
      --  On entry, the ELSE has been scanned out.
1098
 
1099
      procedure Add_Elsif_Part is
1100
      begin
1101
         if No (Elsif_Parts (If_Node)) then
1102
            Set_Elsif_Parts (If_Node, New_List);
1103
         end if;
1104
 
1105
         Elsif_Node := New_Node (N_Elsif_Part, Prev_Token_Ptr);
1106
         Loc := Prev_Token_Ptr;
1107
         Set_Condition (Elsif_Node, P_Condition);
1108
         Check_Then_Column;
1109
         Then_Scan;
1110
         Set_Then_Statements
1111
           (Elsif_Node, P_Sequence_Of_Statements (SS_Eftm_Eltm_Sreq));
1112
         Append (Elsif_Node, Elsif_Parts (If_Node));
1113
      end Add_Elsif_Part;
1114
 
1115
      procedure Check_If_Column is
1116
      begin
1117
         if RM_Column_Check and then Token_Is_At_Start_Of_Line
1118
           and then Start_Column /= Scope.Table (Scope.Last).Ecol
1119
         then
1120
            Error_Msg_Col := Scope.Table (Scope.Last).Ecol;
1121
            Error_Msg_SC ("(style) this token should be@");
1122
         end if;
1123
      end Check_If_Column;
1124
 
1125
      procedure Check_Then_Column is
1126
      begin
1127
         if Token_Is_At_Start_Of_Line and then Token = Tok_Then then
1128
            Check_If_Column;
1129
 
1130
            if Style_Check then
1131
               Style.Check_Then (Loc);
1132
            end if;
1133
         end if;
1134
      end Check_Then_Column;
1135
 
1136
      function Else_Should_Be_Elsif return Boolean is
1137
         Scan_State : Saved_Scan_State;
1138
 
1139
      begin
1140
         if Token_Is_At_Start_Of_Line then
1141
            return False;
1142
 
1143
         else
1144
            Save_Scan_State (Scan_State);
1145
 
1146
            loop
1147
               if Token in Token_Class_Eterm then
1148
                  Restore_Scan_State (Scan_State);
1149
                  return False;
1150
               else
1151
                  Scan; -- past non-expression terminating token
1152
 
1153
                  if Token = Tok_Then then
1154
                     Restore_Scan_State (Scan_State);
1155
                     return True;
1156
                  end if;
1157
               end if;
1158
            end loop;
1159
         end if;
1160
      end Else_Should_Be_Elsif;
1161
 
1162
   --  Start of processing for P_If_Statement
1163
 
1164
   begin
1165
      If_Node := New_Node (N_If_Statement, Token_Ptr);
1166
 
1167
      Push_Scope_Stack;
1168
      Scope.Table (Scope.Last).Etyp := E_If;
1169
      Scope.Table (Scope.Last).Ecol := Start_Column;
1170
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1171
      Scope.Table (Scope.Last).Labl := Error;
1172
      Scope.Table (Scope.Last).Node := If_Node;
1173
 
1174
      if Token = Tok_If then
1175
         Loc := Token_Ptr;
1176
         Scan; -- past IF
1177
         Set_Condition (If_Node, P_Condition);
1178
 
1179
         --  Deal with misuse of IF expression => used instead
1180
         --  of WHEN expression =>
1181
 
1182
         if Token = Tok_Arrow then
1183
            Error_Msg_SC -- CODEFIX
1184
              ("THEN expected");
1185
            Scan; -- past the arrow
1186
            Pop_Scope_Stack; -- remove unneeded entry
1187
            raise Error_Resync;
1188
         end if;
1189
 
1190
         Check_Then_Column;
1191
 
1192
      else
1193
         Error_Msg_SC ("no IF for this THEN");
1194
         Set_Condition (If_Node, Error);
1195
      end if;
1196
 
1197
      Then_Scan;
1198
 
1199
      Set_Then_Statements
1200
        (If_Node, P_Sequence_Of_Statements (SS_Eftm_Eltm_Sreq));
1201
 
1202
      --  This loop scans out else and elsif parts
1203
 
1204
      loop
1205
         if Token = Tok_Elsif then
1206
            Check_If_Column;
1207
 
1208
            if Present (Else_Statements (If_Node)) then
1209
               Error_Msg_SP ("ELSIF cannot appear after ELSE");
1210
            end if;
1211
 
1212
            Scan; -- past ELSIF
1213
            Add_Elsif_Part;
1214
 
1215
         elsif Token = Tok_Else then
1216
            Check_If_Column;
1217
            Scan; -- past ELSE
1218
 
1219
            if Else_Should_Be_Elsif then
1220
               Error_Msg_SP -- CODEFIX
1221
                 ("ELSE should be ELSIF");
1222
               Add_Elsif_Part;
1223
 
1224
            else
1225
               --  Here we have an else that really is an else
1226
 
1227
               if Present (Else_Statements (If_Node)) then
1228
                  Error_Msg_SP ("only one ELSE part allowed");
1229
                  Append_List
1230
                    (P_Sequence_Of_Statements (SS_Eftm_Eltm_Sreq),
1231
                     Else_Statements (If_Node));
1232
               else
1233
                  Set_Else_Statements
1234
                    (If_Node, P_Sequence_Of_Statements (SS_Eftm_Eltm_Sreq));
1235
               end if;
1236
            end if;
1237
 
1238
         --  If anything other than ELSE or ELSIF, exit the loop. The token
1239
         --  had better be END (and in fact it had better be END IF), but
1240
         --  we will let End_Statements take care of checking that.
1241
 
1242
         else
1243
            exit;
1244
         end if;
1245
      end loop;
1246
 
1247
      End_Statements;
1248
      return If_Node;
1249
 
1250
   end P_If_Statement;
1251
 
1252
   --------------------
1253
   -- 5.3  Condition --
1254
   --------------------
1255
 
1256
   --  CONDITION ::= boolean_EXPRESSION
1257
 
1258
   function P_Condition return Node_Id is
1259
      Cond : Node_Id;
1260
 
1261
   begin
1262
      Cond := P_Expression_No_Right_Paren;
1263
 
1264
      --  It is never possible for := to follow a condition, so if we get
1265
      --  a := we assume it is a mistyped equality. Note that we do not try
1266
      --  to reconstruct the tree correctly in this case, but we do at least
1267
      --  give an accurate error message.
1268
 
1269
      if Token = Tok_Colon_Equal then
1270
         while Token = Tok_Colon_Equal loop
1271
            Error_Msg_SC -- CODEFIX
1272
              (""":="" should be ""=""");
1273
            Scan; -- past junk :=
1274
            Discard_Junk_Node (P_Expression_No_Right_Paren);
1275
         end loop;
1276
 
1277
         return Cond;
1278
 
1279
      --  Otherwise check for redundant parens
1280
 
1281
      else
1282
         if Style_Check
1283
           and then Paren_Count (Cond) > 0
1284
         then
1285
            Style.Check_Xtra_Parens (First_Sloc (Cond));
1286
         end if;
1287
 
1288
         --  And return the result
1289
 
1290
         return Cond;
1291
      end if;
1292
   end P_Condition;
1293
 
1294
   -------------------------
1295
   -- 5.4  Case Statement --
1296
   -------------------------
1297
 
1298
   --  CASE_STATEMENT ::=
1299
   --    case EXPRESSION is
1300
   --      CASE_STATEMENT_ALTERNATIVE
1301
   --      {CASE_STATEMENT_ALTERNATIVE}
1302
   --    end case;
1303
 
1304
   --  The caller has checked that the first token is CASE
1305
 
1306
   --  Can raise Error_Resync
1307
 
1308
   function P_Case_Statement return Node_Id is
1309
      Case_Node         : Node_Id;
1310
      Alternatives_List : List_Id;
1311
      First_When_Loc    : Source_Ptr;
1312
 
1313
   begin
1314
      Case_Node := New_Node (N_Case_Statement, Token_Ptr);
1315
 
1316
      Push_Scope_Stack;
1317
      Scope.Table (Scope.Last).Etyp := E_Case;
1318
      Scope.Table (Scope.Last).Ecol := Start_Column;
1319
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1320
      Scope.Table (Scope.Last).Labl := Error;
1321
      Scope.Table (Scope.Last).Node := Case_Node;
1322
 
1323
      Scan; -- past CASE
1324
      Set_Expression (Case_Node, P_Expression_No_Right_Paren);
1325
      TF_Is;
1326
 
1327
      --  Prepare to parse case statement alternatives
1328
 
1329
      Alternatives_List := New_List;
1330
      P_Pragmas_Opt (Alternatives_List);
1331
      First_When_Loc := Token_Ptr;
1332
 
1333
      --  Loop through case statement alternatives
1334
 
1335
      loop
1336
         --  If we have a WHEN or OTHERS, then that's fine keep going. Note
1337
         --  that it is a semantic check to ensure the proper use of OTHERS
1338
 
1339
         if Token = Tok_When or else Token = Tok_Others then
1340
            Append (P_Case_Statement_Alternative, Alternatives_List);
1341
 
1342
         --  If we have an END, then probably we are at the end of the case
1343
         --  but we only exit if Check_End thinks the END was reasonable.
1344
 
1345
         elsif Token = Tok_End then
1346
            exit when Check_End;
1347
 
1348
         --  Here if token is other than WHEN, OTHERS or END. We definitely
1349
         --  have an error, but the question is whether or not to get out of
1350
         --  the case statement. We don't want to get out early, or we will
1351
         --  get a slew of junk error messages for subsequent when tokens.
1352
 
1353
         --  If the token is not at the start of the line, or if it is indented
1354
         --  with respect to the current case statement, then the best guess is
1355
         --  that we are still supposed to be inside the case statement. We
1356
         --  complain about the missing WHEN, and discard the junk statements.
1357
 
1358
         elsif not Token_Is_At_Start_Of_Line
1359
           or else Start_Column > Scope.Table (Scope.Last).Ecol
1360
         then
1361
            Error_Msg_BC ("WHEN (case statement alternative) expected");
1362
 
1363
            --  Here is a possibility for infinite looping if we don't make
1364
            --  progress. So try to process statements, otherwise exit
1365
 
1366
            declare
1367
               Error_Ptr : constant Source_Ptr := Scan_Ptr;
1368
            begin
1369
               Discard_Junk_List (P_Sequence_Of_Statements (SS_Whtm));
1370
               exit when Scan_Ptr = Error_Ptr and then Check_End;
1371
            end;
1372
 
1373
         --  Here we have a junk token at the start of the line and it is
1374
         --  not indented. If Check_End thinks there is a missing END, then
1375
         --  we will get out of the case, otherwise we keep going.
1376
 
1377
         else
1378
            exit when Check_End;
1379
         end if;
1380
      end loop;
1381
 
1382
      --  Make sure we have at least one alternative
1383
 
1384
      if No (First_Non_Pragma (Alternatives_List)) then
1385
         Error_Msg
1386
            ("WHEN expected, must have at least one alternative in case",
1387
             First_When_Loc);
1388
         return Error;
1389
 
1390
      else
1391
         Set_Alternatives (Case_Node, Alternatives_List);
1392
         return Case_Node;
1393
      end if;
1394
   end P_Case_Statement;
1395
 
1396
   -------------------------------------
1397
   -- 5.4  Case Statement Alternative --
1398
   -------------------------------------
1399
 
1400
   --  CASE_STATEMENT_ALTERNATIVE ::=
1401
   --    when DISCRETE_CHOICE_LIST =>
1402
   --      SEQUENCE_OF_STATEMENTS
1403
 
1404
   --  The caller has checked that the initial token is WHEN or OTHERS
1405
   --  Error recovery: can raise Error_Resync
1406
 
1407
   function P_Case_Statement_Alternative return Node_Id is
1408
      Case_Alt_Node : Node_Id;
1409
 
1410
   begin
1411
      if Style_Check then
1412
         Style.Check_Indentation;
1413
      end if;
1414
 
1415
      Case_Alt_Node := New_Node (N_Case_Statement_Alternative, Token_Ptr);
1416
      T_When; -- past WHEN (or give error in OTHERS case)
1417
      Set_Discrete_Choices (Case_Alt_Node, P_Discrete_Choice_List);
1418
      TF_Arrow;
1419
      Set_Statements (Case_Alt_Node, P_Sequence_Of_Statements (SS_Sreq_Whtm));
1420
      return Case_Alt_Node;
1421
   end P_Case_Statement_Alternative;
1422
 
1423
   -------------------------
1424
   -- 5.5  Loop Statement --
1425
   -------------------------
1426
 
1427
   --  LOOP_STATEMENT ::=
1428
   --    [LOOP_STATEMENT_IDENTIFIER:]
1429
   --      [ITERATION_SCHEME] loop
1430
   --        SEQUENCE_OF_STATEMENTS
1431
   --      end loop [loop_IDENTIFIER];
1432
 
1433
   --  ITERATION_SCHEME ::=
1434
   --    while CONDITION
1435
   --  | for LOOP_PARAMETER_SPECIFICATION
1436
 
1437
   --  The parsing of loop statements is handled by one of three functions
1438
   --  P_Loop_Statement, P_For_Statement or P_While_Statement depending
1439
   --  on the initial keyword in the construct (excluding the identifier)
1440
 
1441
   --  P_Loop_Statement
1442
 
1443
   --  This function parses the case where no iteration scheme is present
1444
 
1445
   --  The caller has checked that the initial token is LOOP. The parameter
1446
   --  is the node identifiers for the loop label if any (or is set to Empty
1447
   --  if there is no loop label).
1448
 
1449
   --  Error recovery : cannot raise Error_Resync
1450
 
1451
   function P_Loop_Statement (Loop_Name : Node_Id := Empty) return Node_Id is
1452
      Loop_Node    : Node_Id;
1453
      Created_Name : Node_Id;
1454
 
1455
   begin
1456
      Push_Scope_Stack;
1457
      Scope.Table (Scope.Last).Labl := Loop_Name;
1458
      Scope.Table (Scope.Last).Ecol := Start_Column;
1459
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1460
      Scope.Table (Scope.Last).Etyp := E_Loop;
1461
 
1462
      Loop_Node := New_Node (N_Loop_Statement, Token_Ptr);
1463
      TF_Loop;
1464
 
1465
      if No (Loop_Name) then
1466
         Created_Name :=
1467
           Make_Identifier (Sloc (Loop_Node), Set_Loop_Block_Name ('L'));
1468
         Set_Comes_From_Source (Created_Name, False);
1469
         Set_Has_Created_Identifier (Loop_Node, True);
1470
         Set_Identifier (Loop_Node, Created_Name);
1471
         Scope.Table (Scope.Last).Labl := Created_Name;
1472
      else
1473
         Set_Identifier (Loop_Node, Loop_Name);
1474
      end if;
1475
 
1476
      Append_Elmt (Loop_Node, Label_List);
1477
      Set_Statements (Loop_Node, P_Sequence_Of_Statements (SS_Sreq));
1478
      End_Statements (Loop_Node);
1479
      return Loop_Node;
1480
   end P_Loop_Statement;
1481
 
1482
   --  P_For_Statement
1483
 
1484
   --  This function parses a loop statement with a FOR iteration scheme
1485
 
1486
   --  The caller has checked that the initial token is FOR. The parameter
1487
   --  is the node identifier for the block label if any (or is set to Empty
1488
   --  if there is no block label).
1489
 
1490
   --  Note: the caller fills in the Identifier field if a label was present
1491
 
1492
   --  Error recovery: can raise Error_Resync
1493
 
1494
   function P_For_Statement (Loop_Name : Node_Id := Empty) return Node_Id is
1495
      Loop_Node        : Node_Id;
1496
      Iter_Scheme_Node : Node_Id;
1497
      Loop_For_Flag    : Boolean;
1498
      Created_Name     : Node_Id;
1499
      Spec             : Node_Id;
1500
 
1501
   begin
1502
      Push_Scope_Stack;
1503
      Scope.Table (Scope.Last).Labl := Loop_Name;
1504
      Scope.Table (Scope.Last).Ecol := Start_Column;
1505
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1506
      Scope.Table (Scope.Last).Etyp := E_Loop;
1507
 
1508
      Loop_For_Flag := (Prev_Token = Tok_Loop);
1509
      Scan; -- past FOR
1510
      Iter_Scheme_Node := New_Node (N_Iteration_Scheme, Token_Ptr);
1511
      Spec := P_Loop_Parameter_Specification;
1512
 
1513
      if Nkind (Spec) = N_Loop_Parameter_Specification then
1514
         Set_Loop_Parameter_Specification (Iter_Scheme_Node, Spec);
1515
      else
1516
         Set_Iterator_Specification (Iter_Scheme_Node, Spec);
1517
      end if;
1518
 
1519
      --  The following is a special test so that a miswritten for loop such
1520
      --  as "loop for I in 1..10;" is handled nicely, without making an extra
1521
      --  entry in the scope stack. We don't bother to actually fix up the
1522
      --  tree in this case since it's not worth the effort. Instead we just
1523
      --  eat up the loop junk, leaving the entry for what now looks like an
1524
      --  unmodified loop intact.
1525
 
1526
      if Loop_For_Flag and then Token = Tok_Semicolon then
1527
         Error_Msg_SC ("LOOP belongs here, not before FOR");
1528
         Pop_Scope_Stack;
1529
         return Error;
1530
 
1531
      --  Normal case
1532
 
1533
      else
1534
         Loop_Node := New_Node (N_Loop_Statement, Token_Ptr);
1535
 
1536
         if No (Loop_Name) then
1537
            Created_Name :=
1538
              Make_Identifier (Sloc (Loop_Node), Set_Loop_Block_Name ('L'));
1539
            Set_Comes_From_Source (Created_Name, False);
1540
            Set_Has_Created_Identifier (Loop_Node, True);
1541
            Set_Identifier (Loop_Node, Created_Name);
1542
            Scope.Table (Scope.Last).Labl := Created_Name;
1543
         else
1544
            Set_Identifier (Loop_Node, Loop_Name);
1545
         end if;
1546
 
1547
         TF_Loop;
1548
         Set_Statements (Loop_Node, P_Sequence_Of_Statements (SS_Sreq));
1549
         End_Statements (Loop_Node);
1550
         Set_Iteration_Scheme (Loop_Node, Iter_Scheme_Node);
1551
         Append_Elmt (Loop_Node, Label_List);
1552
         return Loop_Node;
1553
      end if;
1554
   end P_For_Statement;
1555
 
1556
   --  P_While_Statement
1557
 
1558
   --  This procedure scans a loop statement with a WHILE iteration scheme
1559
 
1560
   --  The caller has checked that the initial token is WHILE. The parameter
1561
   --  is the node identifier for the block label if any (or is set to Empty
1562
   --  if there is no block label).
1563
 
1564
   --  Error recovery: cannot raise Error_Resync
1565
 
1566
   function P_While_Statement (Loop_Name : Node_Id := Empty) return Node_Id is
1567
      Loop_Node        : Node_Id;
1568
      Iter_Scheme_Node : Node_Id;
1569
      Loop_While_Flag  : Boolean;
1570
      Created_Name     : Node_Id;
1571
 
1572
   begin
1573
      Push_Scope_Stack;
1574
      Scope.Table (Scope.Last).Labl := Loop_Name;
1575
      Scope.Table (Scope.Last).Ecol := Start_Column;
1576
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1577
      Scope.Table (Scope.Last).Etyp := E_Loop;
1578
 
1579
      Loop_While_Flag := (Prev_Token = Tok_Loop);
1580
      Iter_Scheme_Node := New_Node (N_Iteration_Scheme, Token_Ptr);
1581
      Scan; -- past WHILE
1582
      Set_Condition (Iter_Scheme_Node, P_Condition);
1583
 
1584
      --  The following is a special test so that a miswritten for loop such
1585
      --  as "loop while I > 10;" is handled nicely, without making an extra
1586
      --  entry in the scope stack. We don't bother to actually fix up the
1587
      --  tree in this case since it's not worth the effort. Instead we just
1588
      --  eat up the loop junk, leaving the entry for what now looks like an
1589
      --  unmodified loop intact.
1590
 
1591
      if Loop_While_Flag and then Token = Tok_Semicolon then
1592
         Error_Msg_SC ("LOOP belongs here, not before WHILE");
1593
         Pop_Scope_Stack;
1594
         return Error;
1595
 
1596
      --  Normal case
1597
 
1598
      else
1599
         Loop_Node := New_Node (N_Loop_Statement, Token_Ptr);
1600
         TF_Loop;
1601
 
1602
         if No (Loop_Name) then
1603
            Created_Name :=
1604
              Make_Identifier (Sloc (Loop_Node), Set_Loop_Block_Name ('L'));
1605
            Set_Comes_From_Source (Created_Name, False);
1606
            Set_Has_Created_Identifier (Loop_Node, True);
1607
            Set_Identifier (Loop_Node, Created_Name);
1608
            Scope.Table (Scope.Last).Labl := Created_Name;
1609
         else
1610
            Set_Identifier (Loop_Node, Loop_Name);
1611
         end if;
1612
 
1613
         Set_Statements (Loop_Node, P_Sequence_Of_Statements (SS_Sreq));
1614
         End_Statements (Loop_Node);
1615
         Set_Iteration_Scheme (Loop_Node, Iter_Scheme_Node);
1616
         Append_Elmt (Loop_Node, Label_List);
1617
         return Loop_Node;
1618
      end if;
1619
   end P_While_Statement;
1620
 
1621
   ---------------------------------------
1622
   -- 5.5  Loop Parameter Specification --
1623
   ---------------------------------------
1624
 
1625
   --  LOOP_PARAMETER_SPECIFICATION ::=
1626
   --    DEFINING_IDENTIFIER in [reverse] DISCRETE_SUBTYPE_DEFINITION
1627
 
1628
   --  Error recovery: cannot raise Error_Resync
1629
 
1630
   function P_Loop_Parameter_Specification return Node_Id is
1631
      Loop_Param_Specification_Node : Node_Id;
1632
 
1633
      ID_Node    : Node_Id;
1634
      Scan_State : Saved_Scan_State;
1635
 
1636
   begin
1637
 
1638
      Save_Scan_State (Scan_State);
1639
      ID_Node := P_Defining_Identifier (C_In);
1640
 
1641
      --  If the next token is OF, it indicates an Ada 2012 iterator. If the
1642
      --  next token is a colon, this is also an Ada 2012 iterator, including
1643
      --  a subtype indication for the loop parameter. Otherwise we parse the
1644
      --  construct as a loop parameter specification. Note that the form
1645
      --  "for A in B" is ambiguous, and must be resolved semantically: if B
1646
      --  is a discrete subtype this is a loop specification, but if it is an
1647
      --  expression it is an iterator specification. Ambiguity is resolved
1648
      --  during analysis of the loop parameter specification.
1649
 
1650
      if Token = Tok_Of or else Token = Tok_Colon then
1651
         if Ada_Version < Ada_2012 then
1652
            Error_Msg_SC ("iterator is an Ada 2012 feature");
1653
         end if;
1654
 
1655
         return P_Iterator_Specification (ID_Node);
1656
      end if;
1657
 
1658
      --  The span of the Loop_Parameter_Specification starts at the
1659
      --  defining identifier.
1660
 
1661
      Loop_Param_Specification_Node :=
1662
        New_Node (N_Loop_Parameter_Specification, Sloc (ID_Node));
1663
      Set_Defining_Identifier (Loop_Param_Specification_Node, ID_Node);
1664
 
1665
      if Token = Tok_Left_Paren then
1666
         Error_Msg_SC ("subscripted loop parameter not allowed");
1667
         Restore_Scan_State (Scan_State);
1668
         Discard_Junk_Node (P_Name);
1669
 
1670
      elsif Token = Tok_Dot then
1671
         Error_Msg_SC ("selected loop parameter not allowed");
1672
         Restore_Scan_State (Scan_State);
1673
         Discard_Junk_Node (P_Name);
1674
      end if;
1675
 
1676
      T_In;
1677
 
1678
      if Token = Tok_Reverse then
1679
         Scan; -- past REVERSE
1680
         Set_Reverse_Present (Loop_Param_Specification_Node, True);
1681
      end if;
1682
 
1683
      Set_Discrete_Subtype_Definition
1684
        (Loop_Param_Specification_Node, P_Discrete_Subtype_Definition);
1685
      return Loop_Param_Specification_Node;
1686
 
1687
   exception
1688
      when Error_Resync =>
1689
         return Error;
1690
   end P_Loop_Parameter_Specification;
1691
 
1692
   ----------------------------------
1693
   -- 5.5.1 Iterator_Specification --
1694
   ----------------------------------
1695
 
1696
   function P_Iterator_Specification (Def_Id : Node_Id) return Node_Id is
1697
      Node1 : Node_Id;
1698
 
1699
   begin
1700
      Node1 :=  New_Node (N_Iterator_Specification, Sloc (Def_Id));
1701
      Set_Defining_Identifier (Node1, Def_Id);
1702
 
1703
      if Token = Tok_Colon then
1704
         Scan;  --  past :
1705
         Set_Subtype_Indication (Node1, P_Subtype_Indication);
1706
      end if;
1707
 
1708
      if Token = Tok_Of then
1709
         Set_Of_Present (Node1);
1710
         Scan;  --  past OF
1711
 
1712
      elsif Token = Tok_In then
1713
         Scan;  --  past IN
1714
 
1715
      else
1716
         return Error;
1717
      end if;
1718
 
1719
      if Token = Tok_Reverse then
1720
         Scan; -- past REVERSE
1721
         Set_Reverse_Present (Node1, True);
1722
      end if;
1723
 
1724
      Set_Name (Node1, P_Name);
1725
      return Node1;
1726
   end P_Iterator_Specification;
1727
 
1728
   --------------------------
1729
   -- 5.6  Block Statement --
1730
   --------------------------
1731
 
1732
   --  BLOCK_STATEMENT ::=
1733
   --    [block_STATEMENT_IDENTIFIER:]
1734
   --      [declare
1735
   --        DECLARATIVE_PART]
1736
   --      begin
1737
   --        HANDLED_SEQUENCE_OF_STATEMENTS
1738
   --      end [block_IDENTIFIER];
1739
 
1740
   --  The parsing of block statements is handled by one of the two functions
1741
   --  P_Declare_Statement or P_Begin_Statement depending on whether or not
1742
   --  a declare section is present
1743
 
1744
   --  P_Declare_Statement
1745
 
1746
   --  This function parses a block statement with DECLARE present
1747
 
1748
   --  The caller has checked that the initial token is DECLARE
1749
 
1750
   --  Error recovery: cannot raise Error_Resync
1751
 
1752
   function P_Declare_Statement
1753
     (Block_Name : Node_Id := Empty)
1754
      return       Node_Id
1755
   is
1756
      Block_Node   : Node_Id;
1757
      Created_Name : Node_Id;
1758
 
1759
   begin
1760
      Block_Node := New_Node (N_Block_Statement, Token_Ptr);
1761
 
1762
      Push_Scope_Stack;
1763
      Scope.Table (Scope.Last).Etyp := E_Name;
1764
      Scope.Table (Scope.Last).Lreq := Present (Block_Name);
1765
      Scope.Table (Scope.Last).Ecol := Start_Column;
1766
      Scope.Table (Scope.Last).Labl := Block_Name;
1767
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1768
 
1769
      Scan; -- past DECLARE
1770
 
1771
      if No (Block_Name) then
1772
         Created_Name :=
1773
           Make_Identifier (Sloc (Block_Node), Set_Loop_Block_Name ('B'));
1774
         Set_Comes_From_Source (Created_Name, False);
1775
         Set_Has_Created_Identifier (Block_Node, True);
1776
         Set_Identifier (Block_Node, Created_Name);
1777
         Scope.Table (Scope.Last).Labl := Created_Name;
1778
      else
1779
         Set_Identifier (Block_Node, Block_Name);
1780
      end if;
1781
 
1782
      Append_Elmt (Block_Node, Label_List);
1783
      Parse_Decls_Begin_End (Block_Node);
1784
      return Block_Node;
1785
   end P_Declare_Statement;
1786
 
1787
   --  P_Begin_Statement
1788
 
1789
   --  This function parses a block statement with no DECLARE present
1790
 
1791
   --  The caller has checked that the initial token is BEGIN
1792
 
1793
   --  Error recovery: cannot raise Error_Resync
1794
 
1795
   function P_Begin_Statement
1796
     (Block_Name : Node_Id := Empty)
1797
      return       Node_Id
1798
   is
1799
      Block_Node   : Node_Id;
1800
      Created_Name : Node_Id;
1801
 
1802
   begin
1803
      Block_Node := New_Node (N_Block_Statement, Token_Ptr);
1804
 
1805
      Push_Scope_Stack;
1806
      Scope.Table (Scope.Last).Etyp := E_Name;
1807
      Scope.Table (Scope.Last).Lreq := Present (Block_Name);
1808
      Scope.Table (Scope.Last).Ecol := Start_Column;
1809
      Scope.Table (Scope.Last).Labl := Block_Name;
1810
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1811
 
1812
      if No (Block_Name) then
1813
         Created_Name :=
1814
           Make_Identifier (Sloc (Block_Node), Set_Loop_Block_Name ('B'));
1815
         Set_Comes_From_Source (Created_Name, False);
1816
         Set_Has_Created_Identifier (Block_Node, True);
1817
         Set_Identifier (Block_Node, Created_Name);
1818
         Scope.Table (Scope.Last).Labl := Created_Name;
1819
      else
1820
         Set_Identifier (Block_Node, Block_Name);
1821
      end if;
1822
 
1823
      Append_Elmt (Block_Node, Label_List);
1824
 
1825
      Scope.Table (Scope.Last).Ecol := Start_Column;
1826
      Scope.Table (Scope.Last).Sloc := Token_Ptr;
1827
      Scan; -- past BEGIN
1828
      Set_Handled_Statement_Sequence
1829
        (Block_Node, P_Handled_Sequence_Of_Statements);
1830
      End_Statements (Handled_Statement_Sequence (Block_Node));
1831
      return Block_Node;
1832
   end P_Begin_Statement;
1833
 
1834
   -------------------------
1835
   -- 5.7  Exit Statement --
1836
   -------------------------
1837
 
1838
   --  EXIT_STATEMENT ::=
1839
   --    exit [loop_NAME] [when CONDITION];
1840
 
1841
   --  The caller has checked that the initial token is EXIT
1842
 
1843
   --  Error recovery: can raise Error_Resync
1844
 
1845
   function P_Exit_Statement return Node_Id is
1846
      Exit_Node : Node_Id;
1847
 
1848
      function Missing_Semicolon_On_Exit return Boolean;
1849
      --  This function deals with the following specialized situation
1850
      --
1851
      --    when 'x' =>
1852
      --       exit [identifier]
1853
      --    when 'y' =>
1854
      --
1855
      --  This looks like a messed up EXIT WHEN, when in fact the problem
1856
      --  is a missing semicolon. It is called with Token pointing to the
1857
      --  WHEN token, and returns True if a semicolon is missing before
1858
      --  the WHEN as in the above example.
1859
 
1860
      -------------------------------
1861
      -- Missing_Semicolon_On_Exit --
1862
      -------------------------------
1863
 
1864
      function Missing_Semicolon_On_Exit return Boolean is
1865
         State : Saved_Scan_State;
1866
 
1867
      begin
1868
         if not Token_Is_At_Start_Of_Line then
1869
            return False;
1870
 
1871
         elsif Scope.Table (Scope.Last).Etyp /= E_Case then
1872
            return False;
1873
 
1874
         else
1875
            Save_Scan_State (State);
1876
            Scan; -- past WHEN
1877
            Scan; -- past token after WHEN
1878
 
1879
            if Token = Tok_Arrow then
1880
               Restore_Scan_State (State);
1881
               return True;
1882
            else
1883
               Restore_Scan_State (State);
1884
               return False;
1885
            end if;
1886
         end if;
1887
      end Missing_Semicolon_On_Exit;
1888
 
1889
   --  Start of processing for P_Exit_Statement
1890
 
1891
   begin
1892
      Exit_Node := New_Node (N_Exit_Statement, Token_Ptr);
1893
      Scan; -- past EXIT
1894
 
1895
      if Token = Tok_Identifier then
1896
         Set_Name (Exit_Node, P_Qualified_Simple_Name);
1897
 
1898
      elsif Style_Check then
1899
         --  This EXIT has no name, so check that
1900
         --  the innermost loop is unnamed too.
1901
 
1902
         Check_No_Exit_Name :
1903
         for J in reverse 1 .. Scope.Last loop
1904
            if Scope.Table (J).Etyp = E_Loop then
1905
               if Present (Scope.Table (J).Labl)
1906
                 and then Comes_From_Source (Scope.Table (J).Labl)
1907
               then
1908
                  --  Innermost loop in fact had a name, style check fails
1909
 
1910
                  Style.No_Exit_Name (Scope.Table (J).Labl);
1911
               end if;
1912
 
1913
               exit Check_No_Exit_Name;
1914
            end if;
1915
         end loop Check_No_Exit_Name;
1916
      end if;
1917
 
1918
      if Token = Tok_When and then not Missing_Semicolon_On_Exit then
1919
         Scan; -- past WHEN
1920
         Set_Condition (Exit_Node, P_Condition);
1921
 
1922
      --  Allow IF instead of WHEN, giving error message
1923
 
1924
      elsif Token = Tok_If then
1925
         T_When;
1926
         Scan; -- past IF used in place of WHEN
1927
         Set_Condition (Exit_Node, P_Expression_No_Right_Paren);
1928
      end if;
1929
 
1930
      TF_Semicolon;
1931
      return Exit_Node;
1932
   end P_Exit_Statement;
1933
 
1934
   -------------------------
1935
   -- 5.8  Goto Statement --
1936
   -------------------------
1937
 
1938
   --  GOTO_STATEMENT ::= goto label_NAME;
1939
 
1940
   --  The caller has checked that the initial token is GOTO  (or TO in the
1941
   --  error case where GO and TO were incorrectly separated).
1942
 
1943
   --  Error recovery: can raise Error_Resync
1944
 
1945
   function P_Goto_Statement return Node_Id is
1946
      Goto_Node : Node_Id;
1947
 
1948
   begin
1949
      Goto_Node := New_Node (N_Goto_Statement, Token_Ptr);
1950
      Scan; -- past GOTO (or TO)
1951
      Set_Name (Goto_Node, P_Qualified_Simple_Name_Resync);
1952
      Append_Elmt (Goto_Node, Goto_List);
1953
      No_Constraint;
1954
      TF_Semicolon;
1955
      return Goto_Node;
1956
   end P_Goto_Statement;
1957
 
1958
   ---------------------------
1959
   -- Parse_Decls_Begin_End --
1960
   ---------------------------
1961
 
1962
   --  This function parses the construct:
1963
 
1964
   --      DECLARATIVE_PART
1965
   --    begin
1966
   --      HANDLED_SEQUENCE_OF_STATEMENTS
1967
   --    end [NAME];
1968
 
1969
   --  The caller has built the scope stack entry, and created the node to
1970
   --  whose Declarations and Handled_Statement_Sequence fields are to be
1971
   --  set. On return these fields are filled in (except in the case of a
1972
   --  task body, where the handled statement sequence is optional, and may
1973
   --  thus be Empty), and the scan is positioned past the End sequence.
1974
 
1975
   --  If the BEGIN is missing, then the parent node is used to help construct
1976
   --  an appropriate missing BEGIN message. Possibilities for the parent are:
1977
 
1978
   --    N_Block_Statement     declare block
1979
   --    N_Entry_Body          entry body
1980
   --    N_Package_Body        package body (begin part optional)
1981
   --    N_Subprogram_Body     procedure or function body
1982
   --    N_Task_Body           task body
1983
 
1984
   --  Note: in the case of a block statement, there is definitely a DECLARE
1985
   --  present (because a Begin statement without a DECLARE is handled by the
1986
   --  P_Begin_Statement procedure, which does not call Parse_Decls_Begin_End.
1987
 
1988
   --  Error recovery: cannot raise Error_Resync
1989
 
1990
   procedure Parse_Decls_Begin_End (Parent : Node_Id) is
1991
      Body_Decl    : Node_Id;
1992
      Decls        : List_Id;
1993
      Parent_Nkind : Node_Kind;
1994
      Spec_Node    : Node_Id;
1995
      HSS          : Node_Id;
1996
 
1997
      procedure Missing_Begin (Msg : String);
1998
      --  Called to post a missing begin message. In the normal case this is
1999
      --  posted at the start of the current token. A special case arises when
2000
      --  P_Declarative_Items has previously found a missing begin, in which
2001
      --  case we replace the original error message.
2002
 
2003
      procedure Set_Null_HSS (Parent : Node_Id);
2004
      --  Construct an empty handled statement sequence and install in Parent
2005
      --  Leaves HSS set to reference the newly constructed statement sequence.
2006
 
2007
      -------------------
2008
      -- Missing_Begin --
2009
      -------------------
2010
 
2011
      procedure Missing_Begin (Msg : String) is
2012
      begin
2013
         if Missing_Begin_Msg = No_Error_Msg then
2014
            Error_Msg_BC (Msg);
2015
         else
2016
            Change_Error_Text (Missing_Begin_Msg, Msg);
2017
 
2018
            --  Purge any messages issued after than, since a missing begin
2019
            --  can cause a lot of havoc, and it is better not to dump these
2020
            --  cascaded messages on the user.
2021
 
2022
            Purge_Messages (Get_Location (Missing_Begin_Msg), Prev_Token_Ptr);
2023
         end if;
2024
      end Missing_Begin;
2025
 
2026
      ------------------
2027
      -- Set_Null_HSS --
2028
      ------------------
2029
 
2030
      procedure Set_Null_HSS (Parent : Node_Id) is
2031
         Null_Stm : Node_Id;
2032
 
2033
      begin
2034
         Null_Stm :=
2035
           Make_Null_Statement (Token_Ptr);
2036
         Set_Comes_From_Source (Null_Stm, False);
2037
 
2038
         HSS :=
2039
           Make_Handled_Sequence_Of_Statements (Token_Ptr,
2040
             Statements => New_List (Null_Stm));
2041
         Set_Comes_From_Source (HSS, False);
2042
 
2043
         Set_Handled_Statement_Sequence (Parent, HSS);
2044
      end Set_Null_HSS;
2045
 
2046
   --  Start of processing for Parse_Decls_Begin_End
2047
 
2048
   begin
2049
      Decls := P_Declarative_Part;
2050
 
2051
      if Ada_Version = Ada_83 then
2052
         Check_Later_Vs_Basic_Declarations (Decls, During_Parsing => True);
2053
      end if;
2054
 
2055
      --  Here is where we deal with the case of IS used instead of semicolon.
2056
      --  Specifically, if the last declaration in the declarative part is a
2057
      --  subprogram body still marked as having a bad IS, then this is where
2058
      --  we decide that the IS should really have been a semicolon and that
2059
      --  the body should have been a declaration. Note that if the bad IS
2060
      --  had turned out to be OK (i.e. a decent begin/end was found for it),
2061
      --  then the Bad_Is_Detected flag would have been reset by now.
2062
 
2063
      Body_Decl := Last (Decls);
2064
 
2065
      if Present (Body_Decl)
2066
        and then Nkind (Body_Decl) = N_Subprogram_Body
2067
        and then Bad_Is_Detected (Body_Decl)
2068
      then
2069
         --  OK, we have the case of a bad IS, so we need to fix up the tree.
2070
         --  What we have now is a subprogram body with attached declarations
2071
         --  and a possible statement sequence.
2072
 
2073
         --  First step is to take the declarations that were part of the bogus
2074
         --  subprogram body and append them to the outer declaration chain.
2075
         --  In other words we append them past the body (which we will later
2076
         --  convert into a declaration).
2077
 
2078
         Append_List (Declarations (Body_Decl), Decls);
2079
 
2080
         --  Now take the handled statement sequence of the bogus body and
2081
         --  set it as the statement sequence for the outer construct. Note
2082
         --  that it may be empty (we specially allowed a missing BEGIN for
2083
         --  a subprogram body marked as having a bad IS -- see below).
2084
 
2085
         Set_Handled_Statement_Sequence (Parent,
2086
           Handled_Statement_Sequence (Body_Decl));
2087
 
2088
         --  Next step is to convert the old body node to a declaration node
2089
 
2090
         Spec_Node := Specification (Body_Decl);
2091
         Change_Node (Body_Decl, N_Subprogram_Declaration);
2092
         Set_Specification (Body_Decl, Spec_Node);
2093
 
2094
         --  Final step is to put the declarations for the parent where
2095
         --  they belong, and then fall through the IF to scan out the
2096
         --  END statements.
2097
 
2098
         Set_Declarations (Parent, Decls);
2099
 
2100
      --  This is the normal case (i.e. any case except the bad IS case)
2101
      --  If we have a BEGIN, then scan out the sequence of statements, and
2102
      --  also reset the expected column for the END to match the BEGIN.
2103
 
2104
      else
2105
         Set_Declarations (Parent, Decls);
2106
 
2107
         if Token = Tok_Begin then
2108
            if Style_Check then
2109
               Style.Check_Indentation;
2110
            end if;
2111
 
2112
            Error_Msg_Col := Scope.Table (Scope.Last).Ecol;
2113
 
2114
            if RM_Column_Check
2115
              and then Token_Is_At_Start_Of_Line
2116
              and then Start_Column /= Error_Msg_Col
2117
            then
2118
               Error_Msg_SC ("(style) BEGIN in wrong column, should be@");
2119
 
2120
            else
2121
               Scope.Table (Scope.Last).Ecol := Start_Column;
2122
            end if;
2123
 
2124
            Scope.Table (Scope.Last).Sloc := Token_Ptr;
2125
            Scan; -- past BEGIN
2126
            Set_Handled_Statement_Sequence (Parent,
2127
              P_Handled_Sequence_Of_Statements);
2128
 
2129
         --  No BEGIN present
2130
 
2131
         else
2132
            Parent_Nkind := Nkind (Parent);
2133
 
2134
            --  A special check for the missing IS case. If we have a
2135
            --  subprogram body that was marked as having a suspicious
2136
            --  IS, and the current token is END, then we simply confirm
2137
            --  the suspicion, and do not require a BEGIN to be present
2138
 
2139
            if Parent_Nkind = N_Subprogram_Body
2140
              and then Token  = Tok_End
2141
              and then Scope.Table (Scope.Last).Etyp = E_Suspicious_Is
2142
            then
2143
               Scope.Table (Scope.Last).Etyp := E_Bad_Is;
2144
 
2145
            --  Otherwise BEGIN is not required for a package body, so we
2146
            --  don't mind if it is missing, but we do construct a dummy
2147
            --  one (so that we have somewhere to set End_Label).
2148
 
2149
            --  However if we have something other than a BEGIN which
2150
            --  looks like it might be statements, then we signal a missing
2151
            --  BEGIN for these cases as well. We define "something which
2152
            --  looks like it might be statements" as a token other than
2153
            --  END, EOF, or a token which starts declarations.
2154
 
2155
            elsif Parent_Nkind = N_Package_Body
2156
              and then (Token = Tok_End
2157
                          or else Token = Tok_EOF
2158
                          or else Token in Token_Class_Declk)
2159
            then
2160
               Set_Null_HSS (Parent);
2161
 
2162
            --  These are cases in which a BEGIN is required and not present
2163
 
2164
            else
2165
               Set_Null_HSS (Parent);
2166
 
2167
               --  Prepare to issue error message
2168
 
2169
               Error_Msg_Sloc := Scope.Table (Scope.Last).Sloc;
2170
               Error_Msg_Node_1 := Scope.Table (Scope.Last).Labl;
2171
 
2172
               --  Now issue appropriate message
2173
 
2174
               if Parent_Nkind = N_Block_Statement then
2175
                  Missing_Begin ("missing BEGIN for DECLARE#!");
2176
 
2177
               elsif Parent_Nkind = N_Entry_Body then
2178
                  Missing_Begin ("missing BEGIN for ENTRY#!");
2179
 
2180
               elsif Parent_Nkind = N_Subprogram_Body then
2181
                  if Nkind (Specification (Parent))
2182
                               = N_Function_Specification
2183
                  then
2184
                     Missing_Begin ("missing BEGIN for function&#!");
2185
                  else
2186
                     Missing_Begin ("missing BEGIN for procedure&#!");
2187
                  end if;
2188
 
2189
               --  The case for package body arises only when
2190
               --  we have possible statement junk present.
2191
 
2192
               elsif Parent_Nkind = N_Package_Body then
2193
                  Missing_Begin ("missing BEGIN for package body&#!");
2194
 
2195
               else
2196
                  pragma Assert (Parent_Nkind = N_Task_Body);
2197
                  Missing_Begin ("missing BEGIN for task body&#!");
2198
               end if;
2199
 
2200
               --  Here we pick up the statements after the BEGIN that
2201
               --  should have been present but was not. We don't insist
2202
               --  on statements being present if P_Declarative_Part had
2203
               --  already found a missing BEGIN, since it might have
2204
               --  swallowed a lone statement into the declarative part.
2205
 
2206
               if Missing_Begin_Msg /= No_Error_Msg
2207
                 and then Token = Tok_End
2208
               then
2209
                  null;
2210
               else
2211
                  Set_Handled_Statement_Sequence (Parent,
2212
                    P_Handled_Sequence_Of_Statements);
2213
               end if;
2214
            end if;
2215
         end if;
2216
      end if;
2217
 
2218
      --  Here with declarations and handled statement sequence scanned
2219
 
2220
      if Present (Handled_Statement_Sequence (Parent)) then
2221
         End_Statements (Handled_Statement_Sequence (Parent));
2222
      else
2223
         End_Statements;
2224
      end if;
2225
 
2226
      --  We know that End_Statements removed an entry from the scope stack
2227
      --  (because it is required to do so under all circumstances). We can
2228
      --  therefore reference the entry it removed one past the stack top.
2229
      --  What we are interested in is whether it was a case of a bad IS.
2230
 
2231
      if Scope.Table (Scope.Last + 1).Etyp = E_Bad_Is then
2232
         Error_Msg -- CODEFIX
2233
           ("|IS should be "";""", Scope.Table (Scope.Last + 1).S_Is);
2234
         Set_Bad_Is_Detected (Parent, True);
2235
      end if;
2236
 
2237
   end Parse_Decls_Begin_End;
2238
 
2239
   -------------------------
2240
   -- Set_Loop_Block_Name --
2241
   -------------------------
2242
 
2243
   function Set_Loop_Block_Name (L : Character) return Name_Id is
2244
   begin
2245
      Name_Buffer (1) := L;
2246
      Name_Buffer (2) := '_';
2247
      Name_Len := 2;
2248
      Loop_Block_Count := Loop_Block_Count + 1;
2249
      Add_Nat_To_Name_Buffer (Loop_Block_Count);
2250
      return Name_Find;
2251
   end Set_Loop_Block_Name;
2252
 
2253
   ---------------
2254
   -- Then_Scan --
2255
   ---------------
2256
 
2257
   procedure Then_Scan is
2258
   begin
2259
      TF_Then;
2260
 
2261
      while Token = Tok_Then loop
2262
         Error_Msg_SC -- CODEFIX
2263
           ("redundant THEN");
2264
         TF_Then;
2265
      end loop;
2266
 
2267
      if Token = Tok_And or else Token = Tok_Or then
2268
         Error_Msg_SC ("unexpected logical operator");
2269
         Scan; -- past logical operator
2270
 
2271
         if (Prev_Token = Tok_And and then Token = Tok_Then)
2272
              or else
2273
            (Prev_Token = Tok_Or  and then Token = Tok_Else)
2274
         then
2275
            Scan;
2276
         end if;
2277
 
2278
         Discard_Junk_Node (P_Expression);
2279
      end if;
2280
 
2281
      if Token = Tok_Then then
2282
         Scan;
2283
      end if;
2284
   end Then_Scan;
2285
 
2286
end Ch5;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.