annotate gcc/ada/scans.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S C A N S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Snames; use Snames;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 package body Scans is
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 -----------------------------
kono
parents:
diff changeset
37 -- Initialize_Ada_Keywords --
kono
parents:
diff changeset
38 -----------------------------
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 procedure Initialize_Ada_Keywords is
kono
parents:
diff changeset
41 procedure Set_Reserved (N : Name_Id; T : Token_Type);
kono
parents:
diff changeset
42 pragma Inline (Set_Reserved);
kono
parents:
diff changeset
43 -- Set given name as a reserved word (T is the corresponding token)
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 ------------------
kono
parents:
diff changeset
46 -- Set_Reserved --
kono
parents:
diff changeset
47 ------------------
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 procedure Set_Reserved (N : Name_Id; T : Token_Type) is
kono
parents:
diff changeset
50 begin
kono
parents:
diff changeset
51 -- Set up Token_Type values in Names table entries for reserved
kono
parents:
diff changeset
52 -- words. We use the Pos value of the Token_Type value. Note that
kono
parents:
diff changeset
53 -- Is_Keyword_Name relies on the fact that Token_Type'Val (0) is not
kono
parents:
diff changeset
54 -- a reserved word.
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 Set_Name_Table_Byte (N, Token_Type'Pos (T));
kono
parents:
diff changeset
57 end Set_Reserved;
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 -- Start of processing for Initialize_Ada_Keywords
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 begin
kono
parents:
diff changeset
62 -- Establish reserved words
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Set_Reserved (Name_Abort, Tok_Abort);
kono
parents:
diff changeset
65 Set_Reserved (Name_Abs, Tok_Abs);
kono
parents:
diff changeset
66 Set_Reserved (Name_Abstract, Tok_Abstract);
kono
parents:
diff changeset
67 Set_Reserved (Name_Accept, Tok_Accept);
kono
parents:
diff changeset
68 Set_Reserved (Name_Access, Tok_Access);
kono
parents:
diff changeset
69 Set_Reserved (Name_And, Tok_And);
kono
parents:
diff changeset
70 Set_Reserved (Name_Aliased, Tok_Aliased);
kono
parents:
diff changeset
71 Set_Reserved (Name_All, Tok_All);
kono
parents:
diff changeset
72 Set_Reserved (Name_Array, Tok_Array);
kono
parents:
diff changeset
73 Set_Reserved (Name_At, Tok_At);
kono
parents:
diff changeset
74 Set_Reserved (Name_Begin, Tok_Begin);
kono
parents:
diff changeset
75 Set_Reserved (Name_Body, Tok_Body);
kono
parents:
diff changeset
76 Set_Reserved (Name_Case, Tok_Case);
kono
parents:
diff changeset
77 Set_Reserved (Name_Constant, Tok_Constant);
kono
parents:
diff changeset
78 Set_Reserved (Name_Declare, Tok_Declare);
kono
parents:
diff changeset
79 Set_Reserved (Name_Delay, Tok_Delay);
kono
parents:
diff changeset
80 Set_Reserved (Name_Delta, Tok_Delta);
kono
parents:
diff changeset
81 Set_Reserved (Name_Digits, Tok_Digits);
kono
parents:
diff changeset
82 Set_Reserved (Name_Do, Tok_Do);
kono
parents:
diff changeset
83 Set_Reserved (Name_Else, Tok_Else);
kono
parents:
diff changeset
84 Set_Reserved (Name_Elsif, Tok_Elsif);
kono
parents:
diff changeset
85 Set_Reserved (Name_End, Tok_End);
kono
parents:
diff changeset
86 Set_Reserved (Name_Entry, Tok_Entry);
kono
parents:
diff changeset
87 Set_Reserved (Name_Exception, Tok_Exception);
kono
parents:
diff changeset
88 Set_Reserved (Name_Exit, Tok_Exit);
kono
parents:
diff changeset
89 Set_Reserved (Name_For, Tok_For);
kono
parents:
diff changeset
90 Set_Reserved (Name_Function, Tok_Function);
kono
parents:
diff changeset
91 Set_Reserved (Name_Generic, Tok_Generic);
kono
parents:
diff changeset
92 Set_Reserved (Name_Goto, Tok_Goto);
kono
parents:
diff changeset
93 Set_Reserved (Name_If, Tok_If);
kono
parents:
diff changeset
94 Set_Reserved (Name_In, Tok_In);
kono
parents:
diff changeset
95 Set_Reserved (Name_Is, Tok_Is);
kono
parents:
diff changeset
96 Set_Reserved (Name_Limited, Tok_Limited);
kono
parents:
diff changeset
97 Set_Reserved (Name_Loop, Tok_Loop);
kono
parents:
diff changeset
98 Set_Reserved (Name_Mod, Tok_Mod);
kono
parents:
diff changeset
99 Set_Reserved (Name_New, Tok_New);
kono
parents:
diff changeset
100 Set_Reserved (Name_Not, Tok_Not);
kono
parents:
diff changeset
101 Set_Reserved (Name_Null, Tok_Null);
kono
parents:
diff changeset
102 Set_Reserved (Name_Of, Tok_Of);
kono
parents:
diff changeset
103 Set_Reserved (Name_Or, Tok_Or);
kono
parents:
diff changeset
104 Set_Reserved (Name_Others, Tok_Others);
kono
parents:
diff changeset
105 Set_Reserved (Name_Out, Tok_Out);
kono
parents:
diff changeset
106 Set_Reserved (Name_Package, Tok_Package);
kono
parents:
diff changeset
107 Set_Reserved (Name_Pragma, Tok_Pragma);
kono
parents:
diff changeset
108 Set_Reserved (Name_Private, Tok_Private);
kono
parents:
diff changeset
109 Set_Reserved (Name_Procedure, Tok_Procedure);
kono
parents:
diff changeset
110 Set_Reserved (Name_Protected, Tok_Protected);
kono
parents:
diff changeset
111 Set_Reserved (Name_Raise, Tok_Raise);
kono
parents:
diff changeset
112 Set_Reserved (Name_Range, Tok_Range);
kono
parents:
diff changeset
113 Set_Reserved (Name_Record, Tok_Record);
kono
parents:
diff changeset
114 Set_Reserved (Name_Rem, Tok_Rem);
kono
parents:
diff changeset
115 Set_Reserved (Name_Renames, Tok_Renames);
kono
parents:
diff changeset
116 Set_Reserved (Name_Requeue, Tok_Requeue);
kono
parents:
diff changeset
117 Set_Reserved (Name_Return, Tok_Return);
kono
parents:
diff changeset
118 Set_Reserved (Name_Reverse, Tok_Reverse);
kono
parents:
diff changeset
119 Set_Reserved (Name_Select, Tok_Select);
kono
parents:
diff changeset
120 Set_Reserved (Name_Separate, Tok_Separate);
kono
parents:
diff changeset
121 Set_Reserved (Name_Subtype, Tok_Subtype);
kono
parents:
diff changeset
122 Set_Reserved (Name_Tagged, Tok_Tagged);
kono
parents:
diff changeset
123 Set_Reserved (Name_Task, Tok_Task);
kono
parents:
diff changeset
124 Set_Reserved (Name_Terminate, Tok_Terminate);
kono
parents:
diff changeset
125 Set_Reserved (Name_Then, Tok_Then);
kono
parents:
diff changeset
126 Set_Reserved (Name_Type, Tok_Type);
kono
parents:
diff changeset
127 Set_Reserved (Name_Until, Tok_Until);
kono
parents:
diff changeset
128 Set_Reserved (Name_Use, Tok_Use);
kono
parents:
diff changeset
129 Set_Reserved (Name_When, Tok_When);
kono
parents:
diff changeset
130 Set_Reserved (Name_While, Tok_While);
kono
parents:
diff changeset
131 Set_Reserved (Name_With, Tok_With);
kono
parents:
diff changeset
132 Set_Reserved (Name_Xor, Tok_Xor);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 -- Ada 2005 reserved words
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 Set_Reserved (Name_Interface, Tok_Interface);
kono
parents:
diff changeset
137 Set_Reserved (Name_Overriding, Tok_Overriding);
kono
parents:
diff changeset
138 Set_Reserved (Name_Synchronized, Tok_Synchronized);
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 -- Ada 2012 reserved words
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 Set_Reserved (Name_Some, Tok_Some);
kono
parents:
diff changeset
143 end Initialize_Ada_Keywords;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 ------------------
kono
parents:
diff changeset
146 -- Keyword_Name --
kono
parents:
diff changeset
147 ------------------
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 function Keyword_Name (Token : Token_Type) return Name_Id is
kono
parents:
diff changeset
150 Tok : String := Token'Img;
kono
parents:
diff changeset
151 pragma Assert (Tok (1 .. 4) = "TOK_");
kono
parents:
diff changeset
152 Name : String renames Tok (5 .. Tok'Last);
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 begin
kono
parents:
diff changeset
155 -- Convert to lower case. We don't want to add a dependence on a
kono
parents:
diff changeset
156 -- general-purpose To_Lower routine, so we convert "by hand" here.
kono
parents:
diff changeset
157 -- All keywords use 7-bit ASCII letters only, so this works.
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 for J in Name'Range loop
kono
parents:
diff changeset
160 pragma Assert (Name (J) in 'A' .. 'Z');
kono
parents:
diff changeset
161 Name (J) :=
kono
parents:
diff changeset
162 Character'Val (Character'Pos (Name (J)) +
kono
parents:
diff changeset
163 (Character'Pos ('a') - Character'Pos ('A')));
kono
parents:
diff changeset
164 end loop;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 return Name_Find (Name);
kono
parents:
diff changeset
167 end Keyword_Name;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 ------------------------
kono
parents:
diff changeset
170 -- Restore_Scan_State --
kono
parents:
diff changeset
171 ------------------------
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 procedure Restore_Scan_State (Saved_State : Saved_Scan_State) is
kono
parents:
diff changeset
174 begin
kono
parents:
diff changeset
175 Scan_Ptr := Saved_State.Save_Scan_Ptr;
kono
parents:
diff changeset
176 Token := Saved_State.Save_Token;
kono
parents:
diff changeset
177 Token_Ptr := Saved_State.Save_Token_Ptr;
kono
parents:
diff changeset
178 Current_Line_Start := Saved_State.Save_Current_Line_Start;
kono
parents:
diff changeset
179 Start_Column := Saved_State.Save_Start_Column;
kono
parents:
diff changeset
180 Checksum := Saved_State.Save_Checksum;
kono
parents:
diff changeset
181 First_Non_Blank_Location := Saved_State.Save_First_Non_Blank_Location;
kono
parents:
diff changeset
182 Token_Node := Saved_State.Save_Token_Node;
kono
parents:
diff changeset
183 Token_Name := Saved_State.Save_Token_Name;
kono
parents:
diff changeset
184 Prev_Token := Saved_State.Save_Prev_Token;
kono
parents:
diff changeset
185 Prev_Token_Ptr := Saved_State.Save_Prev_Token_Ptr;
kono
parents:
diff changeset
186 end Restore_Scan_State;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 ---------------------
kono
parents:
diff changeset
189 -- Save_Scan_State --
kono
parents:
diff changeset
190 ---------------------
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 procedure Save_Scan_State (Saved_State : out Saved_Scan_State) is
kono
parents:
diff changeset
193 begin
kono
parents:
diff changeset
194 Saved_State.Save_Scan_Ptr := Scan_Ptr;
kono
parents:
diff changeset
195 Saved_State.Save_Token := Token;
kono
parents:
diff changeset
196 Saved_State.Save_Token_Ptr := Token_Ptr;
kono
parents:
diff changeset
197 Saved_State.Save_Current_Line_Start := Current_Line_Start;
kono
parents:
diff changeset
198 Saved_State.Save_Start_Column := Start_Column;
kono
parents:
diff changeset
199 Saved_State.Save_Checksum := Checksum;
kono
parents:
diff changeset
200 Saved_State.Save_First_Non_Blank_Location := First_Non_Blank_Location;
kono
parents:
diff changeset
201 Saved_State.Save_Token_Node := Token_Node;
kono
parents:
diff changeset
202 Saved_State.Save_Token_Name := Token_Name;
kono
parents:
diff changeset
203 Saved_State.Save_Prev_Token := Prev_Token;
kono
parents:
diff changeset
204 Saved_State.Save_Prev_Token_Ptr := Prev_Token_Ptr;
kono
parents:
diff changeset
205 end Save_Scan_State;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 end Scans;