annotate gcc/ada/xnmake.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 SYSTEM UTILITIES --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- X N M A K E --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 -- Program to construct the spec and body of the Nmake package
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 -- Input files:
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 -- sinfo.ads Spec of Sinfo package
kono
parents:
diff changeset
31 -- nmake.adt Template for Nmake package
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 -- Output files:
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 -- nmake.ads Spec of Nmake package
kono
parents:
diff changeset
36 -- nmake.adb Body of Nmake package
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -- Note: this program assumes that sinfo.ads has passed the error checks that
kono
parents:
diff changeset
39 -- are carried out by the csinfo utility, so it does not duplicate these
kono
parents:
diff changeset
40 -- checks and assumes that sinfo.ads has the correct form.
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 -- In the absence of any switches, both the ads and adb files are output.
kono
parents:
diff changeset
43 -- The switch -s or /s indicates that only the ads file is to be output.
kono
parents:
diff changeset
44 -- The switch -b or /b indicates that only the adb file is to be output.
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 -- If a file name argument is given, then the output is written to this file
kono
parents:
diff changeset
47 -- rather than to nmake.ads or nmake.adb. A file name can only be given if
kono
parents:
diff changeset
48 -- exactly one of the -s or -b options is present.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
51 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
52 with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO;
kono
parents:
diff changeset
53 with Ada.Strings.Maps; use Ada.Strings.Maps;
kono
parents:
diff changeset
54 with Ada.Strings.Maps.Constants; use Ada.Strings.Maps.Constants;
kono
parents:
diff changeset
55 with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
kono
parents:
diff changeset
56 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 with GNAT.Spitbol; use GNAT.Spitbol;
kono
parents:
diff changeset
59 with GNAT.Spitbol.Patterns; use GNAT.Spitbol.Patterns;
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 with XUtil;
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 procedure XNmake is
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 Err : exception;
kono
parents:
diff changeset
66 -- Raised to terminate execution
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 A : VString := Nul;
kono
parents:
diff changeset
69 Arg : VString := Nul;
kono
parents:
diff changeset
70 Arg_List : VString := Nul;
kono
parents:
diff changeset
71 Comment : VString := Nul;
kono
parents:
diff changeset
72 Default : VString := Nul;
kono
parents:
diff changeset
73 Field : VString := Nul;
kono
parents:
diff changeset
74 Line : VString := Nul;
kono
parents:
diff changeset
75 Node : VString := Nul;
kono
parents:
diff changeset
76 Op_Name : VString := Nul;
kono
parents:
diff changeset
77 Prevl : VString := Nul;
kono
parents:
diff changeset
78 Synonym : VString := Nul;
kono
parents:
diff changeset
79 X : VString := Nul;
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 NWidth : Natural;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 FileS : VString := V ("nmake.ads");
kono
parents:
diff changeset
84 FileB : VString := V ("nmake.adb");
kono
parents:
diff changeset
85 -- Set to null if corresponding file not to be generated
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 Given_File : VString := Nul;
kono
parents:
diff changeset
88 -- File name given by command line argument
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 subtype Sfile is Ada.Streams.Stream_IO.File_Type;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 InS, InT : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
93 OutS, OutB : Sfile;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 wsp : constant Pattern := Span (' ' & ASCII.HT);
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 Body_Only : constant Pattern := BreakX (' ') * X
kono
parents:
diff changeset
98 & Span (' ') & "-- body only";
kono
parents:
diff changeset
99 Spec_Only : constant Pattern := BreakX (' ') * X
kono
parents:
diff changeset
100 & Span (' ') & "-- spec only";
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 Node_Hdr : constant Pattern := wsp & "-- N_" & Rest * Node;
kono
parents:
diff changeset
103 Punc : constant Pattern := BreakX (" .,");
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 Binop : constant Pattern := wsp
kono
parents:
diff changeset
106 & "-- plus fields for binary operator";
kono
parents:
diff changeset
107 Unop : constant Pattern := wsp
kono
parents:
diff changeset
108 & "-- plus fields for unary operator";
kono
parents:
diff changeset
109 Syn : constant Pattern := wsp & "-- " & Break (' ') * Synonym
kono
parents:
diff changeset
110 & " (" & Break (')') * Field
kono
parents:
diff changeset
111 & Rest * Comment;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 Templ : constant Pattern := BreakX ('T') * A & "T e m p l a t e";
kono
parents:
diff changeset
114 Spec : constant Pattern := BreakX ('S') * A & "S p e c";
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 Sem_Field : constant Pattern := BreakX ('-') & "-Sem";
kono
parents:
diff changeset
117 Lib_Field : constant Pattern := BreakX ('-') & "-Lib";
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 Get_Field : constant Pattern := BreakX (Decimal_Digit_Set) * Field;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 Get_Dflt : constant Pattern := BreakX ('(') & "(set to "
kono
parents:
diff changeset
122 & Break (" ") * Default & " if";
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 Next_Arg : constant Pattern := Break (',') * Arg & ',';
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 Op_Node : constant Pattern := "Op_" & Rest * Op_Name;
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 Shft_Rot : constant Pattern := "Shift_" or "Rotate_";
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 No_Ent : constant Pattern := "Or_Else" or "And_Then"
kono
parents:
diff changeset
131 or "In" or "Not_In";
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 M : Match_Result;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 V_String_Id : constant VString := V ("String_Id");
kono
parents:
diff changeset
136 V_Node_Id : constant VString := V ("Node_Id");
kono
parents:
diff changeset
137 V_Name_Id : constant VString := V ("Name_Id");
kono
parents:
diff changeset
138 V_List_Id : constant VString := V ("List_Id");
kono
parents:
diff changeset
139 V_Elist_Id : constant VString := V ("Elist_Id");
kono
parents:
diff changeset
140 V_Boolean : constant VString := V ("Boolean");
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 procedure Put_Line (F : Sfile; S : String) renames XUtil.Put_Line;
kono
parents:
diff changeset
143 procedure Put_Line (F : Sfile; S : VString) renames XUtil.Put_Line;
kono
parents:
diff changeset
144 -- Local version of Put_Line ensures Unix style line endings
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 procedure WriteS (S : String);
kono
parents:
diff changeset
147 procedure WriteB (S : String);
kono
parents:
diff changeset
148 procedure WriteBS (S : String);
kono
parents:
diff changeset
149 procedure WriteS (S : VString);
kono
parents:
diff changeset
150 procedure WriteB (S : VString);
kono
parents:
diff changeset
151 procedure WriteBS (S : VString);
kono
parents:
diff changeset
152 -- Write given line to spec or body file or both if active
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 procedure WriteB (S : String) is
kono
parents:
diff changeset
155 begin
kono
parents:
diff changeset
156 if FileB /= Nul then
kono
parents:
diff changeset
157 Put_Line (OutB, S);
kono
parents:
diff changeset
158 end if;
kono
parents:
diff changeset
159 end WriteB;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 procedure WriteB (S : VString) is
kono
parents:
diff changeset
162 begin
kono
parents:
diff changeset
163 if FileB /= Nul then
kono
parents:
diff changeset
164 Put_Line (OutB, S);
kono
parents:
diff changeset
165 end if;
kono
parents:
diff changeset
166 end WriteB;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 procedure WriteBS (S : String) is
kono
parents:
diff changeset
169 begin
kono
parents:
diff changeset
170 if FileB /= Nul then
kono
parents:
diff changeset
171 Put_Line (OutB, S);
kono
parents:
diff changeset
172 end if;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 if FileS /= Nul then
kono
parents:
diff changeset
175 Put_Line (OutS, S);
kono
parents:
diff changeset
176 end if;
kono
parents:
diff changeset
177 end WriteBS;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 procedure WriteBS (S : VString) is
kono
parents:
diff changeset
180 begin
kono
parents:
diff changeset
181 if FileB /= Nul then
kono
parents:
diff changeset
182 Put_Line (OutB, S);
kono
parents:
diff changeset
183 end if;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 if FileS /= Nul then
kono
parents:
diff changeset
186 Put_Line (OutS, S);
kono
parents:
diff changeset
187 end if;
kono
parents:
diff changeset
188 end WriteBS;
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 procedure WriteS (S : String) is
kono
parents:
diff changeset
191 begin
kono
parents:
diff changeset
192 if FileS /= Nul then
kono
parents:
diff changeset
193 Put_Line (OutS, S);
kono
parents:
diff changeset
194 end if;
kono
parents:
diff changeset
195 end WriteS;
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 procedure WriteS (S : VString) is
kono
parents:
diff changeset
198 begin
kono
parents:
diff changeset
199 if FileS /= Nul then
kono
parents:
diff changeset
200 Put_Line (OutS, S);
kono
parents:
diff changeset
201 end if;
kono
parents:
diff changeset
202 end WriteS;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 -- Start of processing for XNmake
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 begin
kono
parents:
diff changeset
207 NWidth := 28;
kono
parents:
diff changeset
208 Anchored_Mode := True;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 for ArgN in 1 .. Argument_Count loop
kono
parents:
diff changeset
211 declare
kono
parents:
diff changeset
212 Arg : constant String := Argument (ArgN);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 begin
kono
parents:
diff changeset
215 if Arg (1) = '-' then
kono
parents:
diff changeset
216 if Arg'Length = 2
kono
parents:
diff changeset
217 and then (Arg (2) = 'b' or else Arg (2) = 'B')
kono
parents:
diff changeset
218 then
kono
parents:
diff changeset
219 FileS := Nul;
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 elsif Arg'Length = 2
kono
parents:
diff changeset
222 and then (Arg (2) = 's' or else Arg (2) = 'S')
kono
parents:
diff changeset
223 then
kono
parents:
diff changeset
224 FileB := Nul;
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 else
kono
parents:
diff changeset
227 raise Err;
kono
parents:
diff changeset
228 end if;
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 else
kono
parents:
diff changeset
231 if Given_File /= Nul then
kono
parents:
diff changeset
232 raise Err;
kono
parents:
diff changeset
233 else
kono
parents:
diff changeset
234 Given_File := V (Arg);
kono
parents:
diff changeset
235 end if;
kono
parents:
diff changeset
236 end if;
kono
parents:
diff changeset
237 end;
kono
parents:
diff changeset
238 end loop;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 if FileS = Nul and then FileB = Nul then
kono
parents:
diff changeset
241 raise Err;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 elsif Given_File /= Nul then
kono
parents:
diff changeset
244 if FileB = Nul then
kono
parents:
diff changeset
245 FileS := Given_File;
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 elsif FileS = Nul then
kono
parents:
diff changeset
248 FileB := Given_File;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 else
kono
parents:
diff changeset
251 raise Err;
kono
parents:
diff changeset
252 end if;
kono
parents:
diff changeset
253 end if;
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 Open (InS, In_File, "sinfo.ads");
kono
parents:
diff changeset
256 Open (InT, In_File, "nmake.adt");
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if FileS /= Nul then
kono
parents:
diff changeset
259 Create (OutS, Out_File, S (FileS));
kono
parents:
diff changeset
260 end if;
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 if FileB /= Nul then
kono
parents:
diff changeset
263 Create (OutB, Out_File, S (FileB));
kono
parents:
diff changeset
264 end if;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 Anchored_Mode := True;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 -- Copy initial part of template to spec and body
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 loop
kono
parents:
diff changeset
271 Line := Get_Line (InT);
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 -- Skip lines describing the template
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 if Match (Line, "-- This file is a template") then
kono
parents:
diff changeset
276 loop
kono
parents:
diff changeset
277 Line := Get_Line (InT);
kono
parents:
diff changeset
278 exit when Line = "";
kono
parents:
diff changeset
279 end loop;
kono
parents:
diff changeset
280 end if;
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 -- Loop keeps going until "package" keyword written
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 exit when Match (Line, "package");
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 -- Deal with WITH lines, writing to body or spec as appropriate
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 if Match (Line, Body_Only, M) then
kono
parents:
diff changeset
289 Replace (M, X);
kono
parents:
diff changeset
290 WriteB (Line);
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 elsif Match (Line, Spec_Only, M) then
kono
parents:
diff changeset
293 Replace (M, X);
kono
parents:
diff changeset
294 WriteS (Line);
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 -- Change header from Template to Spec and write to spec file
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 else
kono
parents:
diff changeset
299 if Match (Line, Templ, M) then
kono
parents:
diff changeset
300 Replace (M, A & " S p e c ");
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 WriteS (Line);
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 -- Write header line to body file
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 if Match (Line, Spec, M) then
kono
parents:
diff changeset
308 Replace (M, A & "B o d y");
kono
parents:
diff changeset
309 end if;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 WriteB (Line);
kono
parents:
diff changeset
312 end if;
kono
parents:
diff changeset
313 end loop;
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 -- Package line reached
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 WriteS ("package Nmake is");
kono
parents:
diff changeset
318 WriteB ("package body Nmake is");
kono
parents:
diff changeset
319 WriteB ("");
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 -- Copy rest of lines up to template insert point to spec only
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 loop
kono
parents:
diff changeset
324 Line := Get_Line (InT);
kono
parents:
diff changeset
325 exit when Match (Line, "!!TEMPLATE INSERTION POINT");
kono
parents:
diff changeset
326 WriteS (Line);
kono
parents:
diff changeset
327 end loop;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 -- Here we are doing the actual insertions, loop through node types
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 loop
kono
parents:
diff changeset
332 Line := Get_Line (InS);
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 if Match (Line, Node_Hdr)
kono
parents:
diff changeset
335 and then not Match (Node, Punc)
kono
parents:
diff changeset
336 and then Node /= "Unused"
kono
parents:
diff changeset
337 then
kono
parents:
diff changeset
338 exit when Node = "Empty";
kono
parents:
diff changeset
339 Prevl := " function Make_" & Node & " (Sloc : Source_Ptr";
kono
parents:
diff changeset
340 Arg_List := Nul;
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 -- Loop through fields of one node
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 loop
kono
parents:
diff changeset
345 Line := Get_Line (InS);
kono
parents:
diff changeset
346 exit when Line = "";
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 if Match (Line, Binop) then
kono
parents:
diff changeset
349 WriteBS (Prevl & ';');
kono
parents:
diff changeset
350 Append (Arg_List, "Left_Opnd,Right_Opnd,");
kono
parents:
diff changeset
351 WriteBS (
kono
parents:
diff changeset
352 " " & Rpad ("Left_Opnd", NWidth) & " : Node_Id;");
kono
parents:
diff changeset
353 Prevl :=
kono
parents:
diff changeset
354 " " & Rpad ("Right_Opnd", NWidth) & " : Node_Id";
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 elsif Match (Line, Unop) then
kono
parents:
diff changeset
357 WriteBS (Prevl & ';');
kono
parents:
diff changeset
358 Append (Arg_List, "Right_Opnd,");
kono
parents:
diff changeset
359 Prevl := " " & Rpad ("Right_Opnd", NWidth) & " : Node_Id";
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 elsif Match (Line, Syn) then
kono
parents:
diff changeset
362 if Synonym /= "Prev_Ids"
kono
parents:
diff changeset
363 and then Synonym /= "More_Ids"
kono
parents:
diff changeset
364 and then Synonym /= "Comes_From_Source"
kono
parents:
diff changeset
365 and then Synonym /= "Paren_Count"
kono
parents:
diff changeset
366 and then not Match (Field, Sem_Field)
kono
parents:
diff changeset
367 and then not Match (Field, Lib_Field)
kono
parents:
diff changeset
368 then
kono
parents:
diff changeset
369 Match (Field, Get_Field);
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 if Field = "Str" then
kono
parents:
diff changeset
372 Field := V_String_Id;
kono
parents:
diff changeset
373 elsif Field = "Node" then
kono
parents:
diff changeset
374 Field := V_Node_Id;
kono
parents:
diff changeset
375 elsif Field = "Name" then
kono
parents:
diff changeset
376 Field := V_Name_Id;
kono
parents:
diff changeset
377 elsif Field = "List" then
kono
parents:
diff changeset
378 Field := V_List_Id;
kono
parents:
diff changeset
379 elsif Field = "Elist" then
kono
parents:
diff changeset
380 Field := V_Elist_Id;
kono
parents:
diff changeset
381 elsif Field = "Flag" then
kono
parents:
diff changeset
382 Field := V_Boolean;
kono
parents:
diff changeset
383 end if;
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 if Field = "Boolean" then
kono
parents:
diff changeset
386 Default := V ("False");
kono
parents:
diff changeset
387 else
kono
parents:
diff changeset
388 Default := Nul;
kono
parents:
diff changeset
389 end if;
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 Match (Comment, Get_Dflt);
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 WriteBS (Prevl & ';');
kono
parents:
diff changeset
394 Append (Arg_List, Synonym & ',');
kono
parents:
diff changeset
395 Rpad (Synonym, NWidth);
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 if Default = "" then
kono
parents:
diff changeset
398 Prevl := " " & Synonym & " : " & Field;
kono
parents:
diff changeset
399 else
kono
parents:
diff changeset
400 Prevl :=
kono
parents:
diff changeset
401 " " & Synonym & " : " & Field & " := " & Default;
kono
parents:
diff changeset
402 end if;
kono
parents:
diff changeset
403 end if;
kono
parents:
diff changeset
404 end if;
kono
parents:
diff changeset
405 end loop;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 WriteBS (Prevl & ')');
kono
parents:
diff changeset
408 WriteS (" return Node_Id;");
kono
parents:
diff changeset
409 WriteS (" pragma Inline (Make_" & Node & ");");
kono
parents:
diff changeset
410 WriteB (" return Node_Id");
kono
parents:
diff changeset
411 WriteB (" is");
kono
parents:
diff changeset
412 WriteB (" N : constant Node_Id :=");
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 if Match (Node, "Defining_Identifier") or else
kono
parents:
diff changeset
415 Match (Node, "Defining_Character") or else
kono
parents:
diff changeset
416 Match (Node, "Defining_Operator")
kono
parents:
diff changeset
417 then
kono
parents:
diff changeset
418 WriteB (" New_Entity (N_" & Node & ", Sloc);");
kono
parents:
diff changeset
419 else
kono
parents:
diff changeset
420 WriteB (" New_Node (N_" & Node & ", Sloc);");
kono
parents:
diff changeset
421 end if;
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 WriteB (" begin");
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 while Match (Arg_List, Next_Arg, "") loop
kono
parents:
diff changeset
426 if Length (Arg) < NWidth then
kono
parents:
diff changeset
427 WriteB (" Set_" & Arg & " (N, " & Arg & ");");
kono
parents:
diff changeset
428 else
kono
parents:
diff changeset
429 WriteB (" Set_" & Arg);
kono
parents:
diff changeset
430 WriteB (" (N, " & Arg & ");");
kono
parents:
diff changeset
431 end if;
kono
parents:
diff changeset
432 end loop;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 if Match (Node, Op_Node) then
kono
parents:
diff changeset
435 if Node = "Op_Plus" then
kono
parents:
diff changeset
436 WriteB (" Set_Chars (N, Name_Op_Add);");
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 elsif Node = "Op_Minus" then
kono
parents:
diff changeset
439 WriteB (" Set_Chars (N, Name_Op_Subtract);");
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 elsif Match (Op_Name, Shft_Rot) then
kono
parents:
diff changeset
442 WriteB (" Set_Chars (N, Name_" & Op_Name & ");");
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 else
kono
parents:
diff changeset
445 WriteB (" Set_Chars (N, Name_" & Node & ");");
kono
parents:
diff changeset
446 end if;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 if not Match (Op_Name, No_Ent) then
kono
parents:
diff changeset
449 WriteB (" Set_Entity (N, Standard_" & Node & ");");
kono
parents:
diff changeset
450 end if;
kono
parents:
diff changeset
451 end if;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 WriteB (" return N;");
kono
parents:
diff changeset
454 WriteB (" end Make_" & Node & ';');
kono
parents:
diff changeset
455 WriteBS ("");
kono
parents:
diff changeset
456 end if;
kono
parents:
diff changeset
457 end loop;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 WriteBS ("end Nmake;");
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 exception
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 when Err =>
kono
parents:
diff changeset
464 Put_Line (Standard_Error, "usage: xnmake [-b] [-s] [filename]");
kono
parents:
diff changeset
465 Set_Exit_Status (1);
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 end XNmake;