@@ -103,6 +103,10 @@ package body VSS.Regular_Expressions.ECMA_Parser is
103
103
procedure Character_Class_Escape
104
104
(Value : out Name_Sets.General_Category_Set; Ok : in out Boolean);
105
105
106
+ procedure Character_Escape
107
+ (Value : out VSS.Characters.Virtual_Character; Ok : in out Boolean)
108
+ with Pre => Ok;
109
+
106
110
Next_Group : Positive := 1 ; -- Group counter
107
111
108
112
-- Implementations
@@ -157,13 +161,34 @@ package body VSS.Regular_Expressions.ECMA_Parser is
157
161
end Alternative ;
158
162
159
163
procedure Atom_Escape (Value : out Node_Or_Class; Ok : in out Boolean) is
160
- Set : Name_Sets.General_Category_Set;
164
+ Set : Name_Sets.General_Category_Set;
165
+ Character : VSS.Characters.Virtual_Character;
161
166
begin
162
- Character_Class_Escape (Set, Ok);
167
+ if not Cursor.Has_Element then
168
+ if Error.Is_Empty then
169
+ Error := " Unexpected end of string in escape." ;
170
+ end if ;
163
171
164
- if Ok then
165
- Value := (Has_Node => False, Category => Set) ;
172
+ Ok := False;
173
+ return ;
166
174
end if ;
175
+
176
+ case Cursor.Element is
177
+ when ' p' | ' P' =>
178
+ Character_Class_Escape (Set, Ok);
179
+
180
+ if Ok then
181
+ Value := (Has_Node => False, Category => Set);
182
+ end if ;
183
+
184
+ when others =>
185
+ Character_Escape (Character, Ok);
186
+
187
+ if Ok then
188
+ Value := From_Node (Create_Character (Character));
189
+ end if ;
190
+
191
+ end case ;
167
192
end Atom_Escape ;
168
193
169
194
procedure Atom_Or_Assertion
@@ -300,6 +325,22 @@ package body VSS.Regular_Expressions.ECMA_Parser is
300
325
end if ;
301
326
end Character_Class_Escape ;
302
327
328
+ procedure Character_Escape
329
+ (Value : out VSS.Characters.Virtual_Character; Ok : in out Boolean) is
330
+ begin
331
+ case Cursor.Element is
332
+ when ' ^' | ' $' | ' \' | ' .' | ' *' | ' +' | ' ?' |
333
+ ' (' | ' )' | ' [' | ' ]' | ' {' | ' }' | ' |'
334
+ =>
335
+
336
+ Value := Cursor.Element;
337
+ Expect (Cursor.Element, Ok);
338
+ when others =>
339
+ Ok := False;
340
+ Error := " Unsupported escape sequence." ;
341
+ end case ;
342
+ end Character_Escape ;
343
+
303
344
procedure Class_Atom
304
345
(Value : out Character_Or_Set;
305
346
Ok : in out Boolean) is
0 commit comments