@@ -23,6 +23,8 @@ extension DSLTree {
23
23
24
24
case customCharacterClass( CustomCharacterClass )
25
25
26
+ case atom( Atom )
27
+
26
28
/// Comments, non-semantic whitespace, etc
27
29
// TODO: Do we want this? Could be interesting
28
30
case trivia( String )
@@ -65,13 +67,22 @@ extension DSLTree {
65
67
66
68
extension DSLTree {
67
69
enum CustomCharacterClass {
68
- // TODO: Still need to convert atoms
69
- case members( [ AST . Atom ] )
70
+ case atom( Atom )
71
+ case range( Atom , Atom )
72
+
73
+ indirect case sequence( [ Self ] )
70
74
71
75
indirect case intersection( Self , Self )
72
76
indirect case subtraction( Self , Self )
73
77
indirect case symmetricDifference( Self , Self )
74
78
}
79
+
80
+ enum Atom {
81
+ case char( Character )
82
+ case scalar( Unicode . Scalar )
83
+
84
+ case unconverted( AST . Atom )
85
+ }
75
86
}
76
87
77
88
// CollectionConsumer
@@ -119,7 +130,8 @@ extension DSLTree.Node {
119
130
120
131
case . trivia, . empty, . stringLiteral, . regexLiteral,
121
132
. consumer, . consumerValidator, . characterPredicate,
122
- . customCharacterClass, . unconvertedRegexLiteral:
133
+ . customCharacterClass, . unconvertedRegexLiteral,
134
+ . atom:
123
135
return [ ]
124
136
}
125
137
}
@@ -230,14 +242,10 @@ extension AST {
230
242
if let str = v. literalStringValue {
231
243
return . stringLiteral( str)
232
244
}
245
+ return . atom( v. dslTreeAtom)
233
246
234
- // TODO: More conversions
235
- return . unconvertedRegexLiteral( self )
236
-
237
- case . customCharacterClass( _) :
238
-
239
- // TODO: More conversions
240
- return . unconvertedRegexLiteral( self )
247
+ case let . customCharacterClass( ccc) :
248
+ return . customCharacterClass( ccc. dslTreeClass)
241
249
242
250
case . empty( _) :
243
251
return . empty
@@ -252,3 +260,46 @@ extension AST {
252
260
return wrap ( convert ( ) )
253
261
}
254
262
}
263
+
264
+ extension AST . CustomCharacterClass {
265
+ var dslTreeClass : DSLTree . CustomCharacterClass {
266
+ func mapMember(
267
+ _ member: Member
268
+ ) -> DSLTree . CustomCharacterClass {
269
+ switch member {
270
+ case let . custom( ccc) :
271
+ return ccc. dslTreeClass
272
+
273
+ case let . range( r) :
274
+ return . range(
275
+ r. lhs. dslTreeAtom, r. rhs. dslTreeAtom)
276
+
277
+ case let . atom( a) :
278
+ return . atom( a. dslTreeAtom)
279
+
280
+ case let . quote( q) :
281
+ return . sequence( q. literal. map { . atom( . char( $0) ) } )
282
+
283
+ case let . setOperation( lhs, op, rhs) :
284
+ fatalError ( " TODO: set operations " )
285
+ }
286
+ }
287
+
288
+ // TODO: Coalesce?
289
+ return . sequence( members. map ( mapMember) )
290
+ }
291
+ }
292
+
293
+ extension AST . Atom {
294
+ var dslTreeAtom : DSLTree . Atom {
295
+ if case let . scalar( s) = kind {
296
+ return . scalar( s)
297
+ }
298
+ if case let . char( c) = kind {
299
+ return . char( c)
300
+ }
301
+
302
+ // TODO: More conversions
303
+ return . unconverted( self )
304
+ }
305
+ }
0 commit comments