annotate gcc/ada/repinfo-input.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 -- R E P I N F O - I N P U T --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 -- B o d y --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 -- Copyright (C) 2018-2019, Free Software Foundation, Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 with Alloc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 with Csets; use Csets;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 with Hostparm; use Hostparm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 with Namet; use Namet;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 with Output; use Output;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 with Snames; use Snames;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 with Table;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 package body Repinfo.Input is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 SSU : constant := 8;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 -- Value for Storage_Unit, we do not want to get this from TTypes, since
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 -- this introduces problematic dependencies in ASIS, and in any case this
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 -- value is assumed to be 8 for the implementation of the DDA.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 type JSON_Entity_Kind is (JE_Record_Type, JE_Array_Type, JE_Other);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 -- Kind of an entiy
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 type JSON_Entity_Node (Kind : JSON_Entity_Kind := JE_Other) is record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 Esize : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 RM_Size : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 case Kind is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 when JE_Record_Type => Variant : Nat;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 when JE_Array_Type => Component_Size : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 when JE_Other => Dummy : Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 end record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 pragma Unchecked_Union (JSON_Entity_Node);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 -- Record to represent an entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 package JSON_Entity_Table is new Table.Table (
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 Table_Component_Type => JSON_Entity_Node,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 Table_Index_Type => Nat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 Table_Low_Bound => 1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 Table_Initial => Alloc.Rep_JSON_Table_Initial,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 Table_Increment => Alloc.Rep_JSON_Table_Increment,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 Table_Name => "JSON_Entity_Table");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 -- Table of entities
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 type JSON_Component_Node is record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 Bit_Offset : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 Esize : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 end record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 -- Record to represent a component
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 package JSON_Component_Table is new Table.Table (
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 Table_Component_Type => JSON_Component_Node,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 Table_Index_Type => Nat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 Table_Low_Bound => 1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 Table_Initial => Alloc.Rep_JSON_Table_Initial,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 Table_Increment => Alloc.Rep_JSON_Table_Increment,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 Table_Name => "JSON_Component_Table");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 -- Table of components
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 type JSON_Variant_Node is record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 Present : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 Variant : Nat;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 Next : Nat;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 end record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 -- Record to represent a variant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 package JSON_Variant_Table is new Table.Table (
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 Table_Component_Type => JSON_Variant_Node,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 Table_Index_Type => Nat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 Table_Low_Bound => 1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 Table_Initial => Alloc.Rep_JSON_Table_Initial,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 Table_Increment => Alloc.Rep_JSON_Table_Increment,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 Table_Name => "JSON_Variant_Table");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 -- Table of variants
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 -------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 -- Get_JSON_Component_Bit_Offset --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 -------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 function Get_JSON_Component_Bit_Offset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 (Name : String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 Record_Name : String) return Node_Ref_Or_Val
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 Namid : constant Valid_Name_Id := Name_Find (Record_Name & '.' & Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 Index : constant Int := Get_Name_Table_Int (Namid);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 -- Return No_Uint if no information is available for the component
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 if Index = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 return No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 return JSON_Component_Table.Table (Index).Bit_Offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 end Get_JSON_Component_Bit_Offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 -------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 -- Get_JSON_Component_Size --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 -------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 function Get_JSON_Component_Size (Name : String) return Node_Ref_Or_Val is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 Namid : constant Valid_Name_Id := Name_Find (Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 Index : constant Int := Get_Name_Table_Int (Namid);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 -- Return No_Uint if no information is available for the component
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 if Index = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 return No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 return JSON_Entity_Table.Table (Index).Component_Size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 end Get_JSON_Component_Size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 -- Get_JSON_Esize --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 function Get_JSON_Esize (Name : String) return Node_Ref_Or_Val is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 Namid : constant Valid_Name_Id := Name_Find (Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 Index : constant Int := Get_Name_Table_Int (Namid);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 -- Return No_Uint if no information is available for the entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 if Index = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 return No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 return JSON_Entity_Table.Table (Index).Esize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 end Get_JSON_Esize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 -- Get_JSON_Esize --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 function Get_JSON_Esize
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 (Name : String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 Record_Name : String) return Node_Ref_Or_Val
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 Namid : constant Valid_Name_Id := Name_Find (Record_Name & '.' & Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 Index : constant Int := Get_Name_Table_Int (Namid);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 -- Return No_Uint if no information is available for the entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 if Index = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 return No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 return JSON_Component_Table.Table (Index).Esize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 end Get_JSON_Esize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 -- Get_JSON_RM_Size --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 function Get_JSON_RM_Size (Name : String) return Node_Ref_Or_Val is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 Namid : constant Valid_Name_Id := Name_Find (Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 Index : constant Int := Get_Name_Table_Int (Namid);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 -- Return No_Uint if no information is available for the entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 if Index = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 return No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 return JSON_Entity_Table.Table (Index).RM_Size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 end Get_JSON_RM_Size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 -----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 -- Read_JSON_Stream --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 -----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 procedure Read_JSON_Stream (Text : Text_Buffer; File_Name : String) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 type Text_Position is record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 Index : Text_Ptr := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 Line : Natural := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 Column : Natural := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 end record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 -- Record to represent position in the text
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 type Token_Kind is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 (J_NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 J_TRUE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 J_FALSE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 J_NUMBER,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 J_INTEGER,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 J_STRING,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 J_ARRAY,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 J_OBJECT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 J_ARRAY_END,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 J_OBJECT_END,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 J_COMMA,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 J_COLON,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 J_EOF);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 -- JSON Token kind. Note that in ECMA 404 there is no notion of integer.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 -- Only numbers are supported. In our implementation we return J_INTEGER
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 -- if there is no decimal part in the number. The semantic is that this
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 -- is a J_NUMBER token that might be represented as an integer. Special
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 -- token J_EOF means that end of stream has been reached.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 function Decode_Integer (Lo, Hi : Text_Ptr) return Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 -- Decode and return the integer in Text (Lo .. Hi)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 function Decode_Name (Lo, Hi : Text_Ptr) return Valid_Name_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 -- Decode and return the name in Text (Lo .. Hi)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 function Decode_Symbol (Lo, Hi : Text_Ptr) return TCode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 -- Decode and return the expression symbol in Text (Lo .. Hi)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 procedure Error (Msg : String);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 pragma No_Return (Error);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 -- Print an error message and raise an exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 procedure Read_Entity;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 -- Read an entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 function Read_Name return Valid_Name_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 -- Read a name
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 function Read_Name_With_Prefix return Valid_Name_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 -- Read a name and prepend a prefix
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 function Read_Number return Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 -- Read a number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 function Read_Numerical_Expr return Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 -- Read a numerical expression
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 procedure Read_Record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 -- Read a record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 function Read_String return Valid_Name_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 -- Read a string
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 procedure Read_Token
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 (Kind : out Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 Token_Start : out Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 Token_End : out Text_Position);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 -- Read a token and return it (this is a standard JSON lexer)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 procedure Read_Token_And_Error
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 (TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 Token_Start : out Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 Token_End : out Text_Position);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 pragma Inline (Read_Token_And_Error);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 -- Read a specified token and error out on failure
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 function Read_Variant_Part return Nat;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 -- Read a variant part
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 procedure Skip_Value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 -- Skip a value
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 Pos : Text_Position := (Text'First, 1, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 -- The current position in the text buffer
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 Name_Buffer : Bounded_String (4 * Max_Name_Length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 -- The buffer used to build full qualifed names
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 Prefix_Len : Natural := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 -- The length of the prefix present in Name_Buffer
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 -- Decode_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 function Decode_Integer (Lo, Hi : Text_Ptr) return Uint is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 Len : constant Nat := Int (Hi) - Int (Lo) + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 -- Decode up to 9 characters manually, otherwise call into Uint
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 if Len < 10 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 Val : Int := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 for J in Lo .. Hi loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 Val := Val * 10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 + Character'Pos (Text (J)) - Character'Pos ('0');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 return UI_From_Int (Val);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 Val : Uint := Uint_0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 for J in Lo .. Hi loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 Val := Val * 10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 + Character'Pos (Text (J)) - Character'Pos ('0');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 return Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 end Decode_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 -- Decode_Name --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 function Decode_Name (Lo, Hi : Text_Ptr) return Valid_Name_Id is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 -- Names are stored in lower case so fold them if need be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 if Is_Upper_Case_Letter (Text (Lo)) then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 S : String (Integer (Lo) .. Integer (Hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 for J in Lo .. Hi loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 S (Integer (J)) := Fold_Lower (Text (J));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 return Name_Find (S);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 S : String (Integer (Lo) .. Integer (Hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 for S'Address use Text (Lo)'Address;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 return Name_Find (S);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 end Decode_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 -- Decode_Symbol --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 function Decode_Symbol (Lo, Hi : Text_Ptr) return TCode is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 function Cmp12 (A, B : Character) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 pragma Inline (Cmp12);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 -- Compare Text (Lo + 1 .. Lo + 2) with A & B.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 -------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 -- Cmp12 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 -------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 function Cmp12 (A, B : Character) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 return Text (Lo + 1) = A and then Text (Lo + 2) = B;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 end Cmp12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 Len : constant Nat := Int (Hi) - Int (Lo) + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 -- Start of processing for Decode_Symbol
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 case Len is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 when 1 =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 case Text (Lo) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 when '+' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 return Plus_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 when '-' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 return Minus_Expr; -- or Negate_Expr
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 when '*' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 return Mult_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 when '<' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 return Lt_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 when '>' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 return Gt_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 when '&' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 return Bit_And_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 when '#' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 return Discrim_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 when 2 =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 if Text (Lo) = '/' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 case Text (Lo + 1) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 when 't' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 return Trunc_Div_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 when 'c' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 return Ceil_Div_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 when 'f' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 return Floor_Div_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 when 'e' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 return Exact_Div_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 elsif Text (Lo + 1) = '=' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 case Text (Lo) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 when '<' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 return Le_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 when '>' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 return Ge_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 when '=' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 return Eq_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 when '!' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 return Ne_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 elsif Text (Lo) = 'o' and then Text (Lo + 1) = 'r' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 return Truth_Or_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 when 3 =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 case Text (Lo) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 when '?' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 if Cmp12 ('<', '>') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 return Cond_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 when 'a' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 if Cmp12 ('b', 's') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 return Abs_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 elsif Cmp12 ('n', 'd') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 return Truth_And_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 when 'm' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 if Cmp12 ('a', 'x') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 return Max_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 elsif Cmp12 ('i', 'n') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 return Min_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 when 'n' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 if Cmp12 ('o', 't') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 return Truth_Not_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 when 'x' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 if Cmp12 ('o', 'r') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 return Truth_Xor_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 when 'v' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 if Cmp12 ('a', 'r') then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 return Dynamic_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 when 4 =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 if Text (Lo) = 'm'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 and then Text (Lo + 1) = 'o'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 and then Text (Lo + 2) = 'd'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 case Text (Lo + 3) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 when 't' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 return Trunc_Mod_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 when 'c' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 return Ceil_Mod_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 when 'f' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 return Floor_Mod_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 pragma Annotate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 (CodePeer, Intentional,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 "condition predetermined", "Error called as defensive code");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 Error ("unknown symbol");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 end Decode_Symbol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 -- Error --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 procedure Error (Msg : String) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 L : constant String := Pos.Line'Img;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 C : constant String := Pos.Column'Img;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 Set_Standard_Error;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 Write_Str (File_Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 Write_Char (':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 Write_Str (L (L'First + 1 .. L'Last));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 Write_Char (':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 Write_Str (C (C'First + 1 .. C'Last));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 Write_Char (':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 Write_Line (Msg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 raise Invalid_JSON_Stream;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 end Error;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 -- Read_Entity --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 procedure Read_Entity is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 Ent : JSON_Entity_Node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 Nam : Name_Id := No_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 Siz : Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 Ent.Esize := No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 Ent.RM_Size := No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 Ent.Component_Size := No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 -- Read the members as string : value pairs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 case Read_String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 when Name_Name =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 Nam := Read_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 when Name_Record =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 if Nam = No_Name then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 Error ("name expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 Ent.Variant := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 Prefix_Len := Natural (Length_Of_Name (Nam));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 Name_Buffer.Chars (1 .. Prefix_Len) := Get_Name_String (Nam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 Read_Record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 when Name_Variant =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 Ent.Variant := Read_Variant_Part;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 when Name_Size =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 Siz := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 Ent.Esize := Siz;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 Ent.RM_Size := Siz;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 when Name_Object_Size =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 Ent.Esize := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 when Name_Value_Size =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 Ent.RM_Size := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 when Name_Component_Size =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 Ent.Component_Size := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 Skip_Value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 if TK = J_OBJECT_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 -- Store the entity into the table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 JSON_Entity_Table.Append (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 -- Associate the name with the entity
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 if Nam = No_Name then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 Error ("name expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 Set_Name_Table_Int (Nam, JSON_Entity_Table.Last);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 end Read_Entity;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 -- Read_Name --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 function Read_Name return Valid_Name_Id is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 -- Read a single string
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 Read_Token_And_Error (J_STRING, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 return Decode_Name (Token_Start.Index + 1, Token_End.Index - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 end Read_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 -----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 -- Read_Name_With_Prefix --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 -----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 function Read_Name_With_Prefix return Valid_Name_Id is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 Len : Natural;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 Lo, Hi : Text_Ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 -- Read a single string
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 Read_Token_And_Error (J_STRING, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 Lo := Token_Start.Index + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 Hi := Token_End.Index - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 -- Prepare for the concatenation with the prefix
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 Len := Integer (Hi) - Integer (Lo) + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 if Prefix_Len + 1 + Len > Name_Buffer.Max_Length then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 Error ("Name buffer too small");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 Name_Buffer.Length := Prefix_Len + 1 + Len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 Name_Buffer.Chars (Prefix_Len + 1) := '.';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 -- Names are stored in lower case so fold them if need be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 if Is_Upper_Case_Letter (Text (Lo)) then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 for J in Lo .. Hi loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 Name_Buffer.Chars (Prefix_Len + 2 + Integer (J - Lo)) :=
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 Fold_Lower (Text (J));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 S : String (Integer (Lo) .. Integer (Hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 for S'Address use Text (Lo)'Address;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 Name_Buffer.Chars (Prefix_Len + 2 .. Prefix_Len + 1 + Len) := S;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 return Name_Find (Name_Buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 end Read_Name_With_Prefix;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 -- Read_Number --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 function Read_Number return Uint is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 -- Only integers are to be expected here
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 Read_Token_And_Error (J_INTEGER, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 return Decode_Integer (Token_Start.Index, Token_End.Index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 end Read_Number;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 -- Read_Numerical_Expr --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 function Read_Numerical_Expr return Node_Ref_Or_Val is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 Code : TCode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 Nop : Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 Ops : array (1 .. 3) of Node_Ref_Or_Val;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 -- Read either an integer or an expression
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 if TK = J_INTEGER then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 return Decode_Integer (Token_Start.Index, Token_End.Index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 elsif TK = J_OBJECT then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 -- Read the code of the expression and decode it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 if Read_String /= Name_Code then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 Error ("name expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 Read_Token_And_Error (J_STRING, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 Code := Decode_Symbol (Token_Start.Index + 1, Token_End.Index - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 Read_Token_And_Error (J_COMMA, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 -- Read the array of operands
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 if Read_String /= Name_Operands then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 Error ("operands expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 Read_Token_And_Error (J_ARRAY, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 Nop := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 Ops := (others => No_Uint);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 Nop := Nop + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 Ops (Nop) := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 if TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 Read_Token_And_Error (J_OBJECT_END, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 -- Resolve the ambiguity for '-' now
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 if Code = Minus_Expr and then Nop = 1 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 Code := Negate_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 return Create_Node (Code, Ops (1), Ops (2), Ops (3));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 Error ("numerical expression expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 end Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 -- Read_Record --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 procedure Read_Record is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 Comp : JSON_Component_Node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 First_Bit : Node_Ref_Or_Val := No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 Is_First : Boolean := True;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 Nam : Name_Id := No_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 Position : Node_Ref_Or_Val := No_Uint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 -- Read a possibly empty array of components
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 Read_Token_And_Error (J_ARRAY, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 if Is_First and then TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 elsif TK /= J_OBJECT then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 Error ("object expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 -- Read the members as string : value pairs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 case Read_String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 when Name_Name =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 Nam := Read_Name_With_Prefix;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 when Name_Discriminant =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 Skip_Value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765 when Name_Position =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 Position := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 when Name_First_Bit =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 First_Bit := Read_Number;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 when Name_Size =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 Comp.Esize := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 Error ("invalid component");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 if TK = J_OBJECT_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 -- Compute Component_Bit_Offset from Position and First_Bit,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 -- either symbolically or literally depending on Position.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 if Position = No_Uint or else First_Bit = No_Uint then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 Error ("bit offset expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 if Position < Uint_0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 Bit_Position : constant Node_Ref_Or_Val :=
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 Create_Node (Mult_Expr, Position, UI_From_Int (SSU));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 if First_Bit = Uint_0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 Comp.Bit_Offset := Bit_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 Comp.Bit_Offset :=
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 Create_Node (Plus_Expr, Bit_Position, First_Bit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 Comp.Bit_Offset := Position * SSU + First_Bit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 -- Store the component into the table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 JSON_Component_Table.Append (Comp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 -- Associate the name with the component
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 if Nam = No_Name then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 Error ("name expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 Set_Name_Table_Int (Nam, JSON_Component_Table.Last);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 if TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825 Is_First := False;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 end Read_Record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 -- Read_String --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 function Read_String return Valid_Name_Id is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 Nam : Valid_Name_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 -- Read the string and the following colon
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 Read_Token_And_Error (J_STRING, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 Nam := Decode_Name (Token_Start.Index + 1, Token_End.Index - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 Read_Token_And_Error (J_COLON, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 return Nam;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846 end Read_String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 -- Read_Token --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 procedure Read_Token
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 (Kind : out Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 Token_Start : out Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 Token_End : out Text_Position)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 procedure Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858 -- Update Pos to point to next char
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 function Is_Whitespace return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 pragma Inline (Is_Whitespace);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 -- Return True of current character is a whitespace
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 function Is_Structural_Token return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 pragma Inline (Is_Structural_Token);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866 -- Return True if current character is one of the structural tokens
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868 function Is_Token_Sep return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 pragma Inline (Is_Token_Sep);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 -- Return True if current character is a token separator
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 procedure Delimit_Keyword (Kw : String);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 -- Helper function to parse tokens such as null, false and true
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876 -- Next_Char --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 procedure Next_Char is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
880 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
881 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
882 Pos.Column := Pos.Column + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
883 elsif Text (Pos.Index) = ASCII.LF then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
884 Pos.Column := 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
885 Pos.Line := Pos.Line + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
886 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
887 Pos.Column := Pos.Column + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
888 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
889 Pos.Index := Pos.Index + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
890 end Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
891
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
892 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
893 -- Is_Whitespace --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
894 -------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
895
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
896 function Is_Whitespace return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
897 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
898 return
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
899 Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
900 and then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
901 (Text (Pos.Index) = ASCII.LF
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
902 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
903 Text (Pos.Index) = ASCII.CR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
904 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
905 Text (Pos.Index) = ASCII.HT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
906 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
907 Text (Pos.Index) = ' ');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
908 end Is_Whitespace;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
909
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
910 -------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
911 -- Is_Structural_Token --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
912 -------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
913
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
914 function Is_Structural_Token return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
915 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
916 return
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
917 Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
918 and then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
919 (Text (Pos.Index) = '['
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
920 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
921 Text (Pos.Index) = ']'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
922 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
923 Text (Pos.Index) = '{'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
924 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
925 Text (Pos.Index) = '}'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
926 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
927 Text (Pos.Index) = ','
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
928 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
929 Text (Pos.Index) = ':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
930 end Is_Structural_Token;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
931
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
932 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
933 -- Is_Token_Sep --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
934 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
935
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
936 function Is_Token_Sep return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
937 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
938 return
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
939 Pos.Index > Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
940 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
941 Is_Whitespace
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
942 or else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
943 Is_Structural_Token;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
944 end Is_Token_Sep;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
945
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
946 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
947 -- Delimit_Keyword --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
948 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
949
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
950 procedure Delimit_Keyword (Kw : String) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
951 pragma Unreferenced (Kw);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
952 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
953 while not Is_Token_Sep loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
954 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
955 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
956 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
957 end Delimit_Keyword;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
958
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
959 CC : Character;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
960 Can_Be_Integer : Boolean := True;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
961
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
962 -- Start of processing for Read_Token
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
963
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
964 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
965 -- Skip leading whitespaces
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
966
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
967 while Is_Whitespace loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
968 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
969 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
970
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
971 -- Initialize token delimiters
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
972
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
973 Token_Start := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
974 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
975
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
976 -- End of stream reached
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
977
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
978 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
979 Kind := J_EOF;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
980 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
981 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
982
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
983 CC := Text (Pos.Index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
984
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
985 if CC = '[' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
986 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
987 Kind := J_ARRAY;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
988 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
989 elsif CC = ']' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
990 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
991 Kind := J_ARRAY_END;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
992 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
993 elsif CC = '{' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
994 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
995 Kind := J_OBJECT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
996 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
997 elsif CC = '}' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
998 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
999 Kind := J_OBJECT_END;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1000 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1001 elsif CC = ',' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1002 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1003 Kind := J_COMMA;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1004 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1005 elsif CC = ':' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1006 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1007 Kind := J_COLON;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1008 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1009 elsif CC = 'n' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1010 Delimit_Keyword ("null");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1011 Kind := J_NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1012 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1013 elsif CC = 'f' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1014 Delimit_Keyword ("false");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1015 Kind := J_FALSE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1016 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1017 elsif CC = 't' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1018 Delimit_Keyword ("true");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1019 Kind := J_TRUE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1020 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1021 elsif CC = '"' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1022 -- We expect a string
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1023 -- Just scan till the end the of the string but do not attempt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1024 -- to decode it. This means that even if we get a string token
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1025 -- it might not be a valid string from the ECMA 404 point of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1026 -- view.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1027
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1028 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1029 while Pos.Index <= Text'Last and then Text (Pos.Index) /= '"' loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1030 if Text (Pos.Index) in ASCII.NUL .. ASCII.US then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1031 Error ("control character not allowed in string");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1032 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1033
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1034 if Text (Pos.Index) = '\' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1035 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1036 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1037 Error ("non terminated string token");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1038 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1039
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1040 case Text (Pos.Index) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1041 when 'u' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1042 for Idx in 1 .. 4 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1043 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1044 if Pos.Index > Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1045 or else (Text (Pos.Index) not in 'a' .. 'f'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1046 and then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1047 Text (Pos.Index) not in 'A' .. 'F'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1048 and then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1049 Text (Pos.Index) not in '0' .. '9')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1050 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1051 Error ("invalid unicode escape sequence");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1052 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1053 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1054 when '\' | '/' | '"' | 'b' | 'f' | 'n' | 'r' | 't' =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1055 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1056 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1057 Error ("invalid escape sequence");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1058 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1059 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1060 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1061 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1062
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1063 -- No quote found report and error
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1064
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1065 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1066 Error ("non terminated string token");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1067 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1068
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1069 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1070
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1071 -- Go to next char and ensure that this is separator. Indeed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1072 -- construction such as "string1""string2" are not allowed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1073
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1074 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1075 if not Is_Token_Sep then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1076 Error ("invalid syntax");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1077 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1078 Kind := J_STRING;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1079 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1080 elsif CC = '-' or else CC in '0' .. '9' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1081 -- We expect a number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1082 if CC = '-' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1083 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1084 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1085
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1086 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1087 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1088 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1089
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1090 -- Parse integer part of a number. Superfluous leading zeros are
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1091 -- not allowed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1092
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1093 if Text (Pos.Index) = '0' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1094 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1095 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1096 elsif Text (Pos.Index) in '1' .. '9' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1097 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1098 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1099 while Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1100 and then Text (Pos.Index) in '0' .. '9'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1101 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1102 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1103 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1104 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1105 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1106 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1107 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1109 if Is_Token_Sep then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1110 -- Valid integer number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1112 Kind := J_INTEGER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1113 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1114 elsif Text (Pos.Index) /= '.'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1115 and then Text (Pos.Index) /= 'e'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1116 and then Text (Pos.Index) /= 'E'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1117 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1118 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1119 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1120
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1121 -- Check for a fractional part
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1122
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1123 if Text (Pos.Index) = '.' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1124 Can_Be_Integer := False;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1125 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1126 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1127 if Pos.Index > Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1128 or else Text (Pos.Index) not in '0' .. '9'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1129 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1130 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1131 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1132
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1133 while Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1134 and then Text (Pos.Index) in '0' .. '9'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1135 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1136 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1137 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1138 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1140 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1142 -- Check for exponent part
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1143
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1144 if Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1145 and then (Text (Pos.Index) = 'e' or else Text (Pos.Index) = 'E')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1146 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1147 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1148 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1149 if Pos.Index > Text'Last then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1150 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1151 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1152
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1153 if Text (Pos.Index) = '-' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1154 -- Also a few corner cases can lead to an integer, assume
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1155 -- that the number is not an integer.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1157 Can_Be_Integer := False;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1158 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1160 if Text (Pos.Index) = '-' or else Text (Pos.Index) = '+' then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1161 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1162 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1163
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1164 if Pos.Index > Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1165 or else Text (Pos.Index) not in '0' .. '9'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1166 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1167 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1168 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1170 while Pos.Index <= Text'Last
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1171 and then Text (Pos.Index) in '0' .. '9'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1172 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1173 Token_End := Pos;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1174 Next_Char;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1175 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1176 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1177
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1178 if Is_Token_Sep then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1179 -- Valid decimal number
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1180
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1181 if Can_Be_Integer then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1182 Kind := J_INTEGER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1183 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1184 Kind := J_NUMBER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1185 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1186 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1187 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1188 Error ("invalid number");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1189 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1190 elsif CC = EOF then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1191 Kind := J_EOF;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1192 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1193 Error ("Unexpected character");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1194 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1195 end Read_Token;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1196
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1197 ----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1198 -- Read_Token_And_Error --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1199 ----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1201 procedure Read_Token_And_Error
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1202 (TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1203 Token_Start : out Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1204 Token_End : out Text_Position)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1205 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1206 Kind : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1207
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1208 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1209 -- Read a token and errout out if not of the expected kind
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1211 Read_Token (Kind, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1212 if Kind /= TK then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1213 Error ("specific token expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1214 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1215 end Read_Token_And_Error;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1217 -------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1218 -- Read_Variant_Part --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1219 -------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1220
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1221 function Read_Variant_Part return Nat is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1222 Next : Nat := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1223 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1224 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1225 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1226 Var : JSON_Variant_Node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1227
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1228 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1229 -- Read a non-empty array of components
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1230
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1231 Read_Token_And_Error (J_ARRAY, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1232
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1233 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1234 Read_Token_And_Error (J_OBJECT, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1235
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1236 Var.Variant := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1237
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1238 -- Read the members as string : value pairs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1240 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1241 case Read_String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1242 when Name_Present =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1243 Var.Present := Read_Numerical_Expr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1244 when Name_Record =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1245 Read_Record;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1246 when Name_Variant =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1247 Var.Variant := Read_Variant_Part;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1248 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1249 Error ("invalid variant");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1250 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1251
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1252 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1253 if TK = J_OBJECT_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1254 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1255 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1256 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1257 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1258 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1259
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1260 -- Chain the variant and store it into the table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1261
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1262 Var.Next := Next;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1263 JSON_Variant_Table.Append (Var);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1264 Next := JSON_Variant_Table.Last;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1265
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1266 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1267 if TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1268 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1269 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1270 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1271 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1272 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1273
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1274 return Next;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1275 end Read_Variant_Part;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1277 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1278 -- Skip_Value --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1279 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1280
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1281 procedure Skip_Value is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1282 Array_Depth : Natural := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1283 Object_Depth : Natural := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1284 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1285 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1286 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1287
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1288 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1289 -- Read a value without recursing
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1291 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1292 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1293
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1294 case TK is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1295 when J_STRING | J_INTEGER | J_NUMBER =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1296 null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1297 when J_ARRAY =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1298 Array_Depth := Array_Depth + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1299 when J_ARRAY_END =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1300 Array_Depth := Array_Depth - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1301 when J_OBJECT =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1302 Object_Depth := Object_Depth + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1303 when J_OBJECT_END =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1304 Object_Depth := Object_Depth - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1305 when J_COLON | J_COMMA =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1306 if Array_Depth = 0 and then Object_Depth = 0 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1307 Error ("value expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1308 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1309 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1310 Error ("value expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1311 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1312
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1313 exit when Array_Depth = 0 and then Object_Depth = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1314 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1315 end Skip_Value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1316
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1317 Token_Start : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1318 Token_End : Text_Position;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1319 TK : Token_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1320 Is_First : Boolean := True;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1321
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1322 -- Start of processing for Read_JSON_Stream
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1323
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1324 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1325 -- Read a possibly empty array of entities
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1326
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1327 Read_Token_And_Error (J_ARRAY, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1328
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1329 loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1330 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1331 if Is_First and then TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1332 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1333 elsif TK /= J_OBJECT then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1334 Error ("object expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1335 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1336
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1337 Read_Entity;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1338
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1339 Read_Token (TK, Token_Start, Token_End);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1340 if TK = J_ARRAY_END then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1341 exit;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1342 elsif TK /= J_COMMA then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1343 Error ("comma expected");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1344 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1345
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1346 Is_First := False;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1347 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1348 end Read_JSON_Stream;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1349
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1350 end Repinfo.Input;