@@ -21,6 +21,8 @@ extension DSLTree {
21
21
AST . Quantification . Kind ,
22
22
Node )
23
23
24
+ case customCharacterClass( CustomCharacterClass )
25
+
24
26
/// Comments, non-semantic whitespace, etc
25
27
// TODO: Do we want this? Could be interesting
26
28
case trivia( String )
@@ -34,11 +36,16 @@ extension DSLTree {
34
36
/// An embedded literal
35
37
case regexLiteral( AST )
36
38
39
+ // MARK: - Tree conversions
40
+
37
41
/// The target of AST conversion.
38
42
///
39
43
/// Keeps original AST around for rich syntatic and source information
40
44
case convertedRegexLiteral( Node , AST )
41
45
46
+ // Fall-back for when conversion fails
47
+ case unconvertedRegexLiteral( AST )
48
+
42
49
// MARK: - Extensibility points
43
50
44
51
/// A capturing group (TODO: is it?) with a transformation function
@@ -51,7 +58,19 @@ extension DSLTree {
51
58
52
59
case consumerValidator( _ConsumerValidatorInterface )
53
60
54
- case customCharacterClass( _CharacterPredicateInterface )
61
+ // TODO: Would this just boil down to a consumer?
62
+ case characterPredicate( _CharacterPredicateInterface )
63
+ }
64
+ }
65
+
66
+ extension DSLTree {
67
+ enum CustomCharacterClass {
68
+ // TODO: Still need to convert atoms
69
+ case members( [ AST . Atom ] )
70
+
71
+ indirect case intersection( Self , Self )
72
+ indirect case subtraction( Self , Self )
73
+ indirect case symmetricDifference( Self , Self )
55
74
}
56
75
}
57
76
@@ -99,8 +118,8 @@ extension DSLTree.Node {
99
118
case let . conditional( _, t, f) : return [ t, f]
100
119
101
120
case . trivia, . empty, . stringLiteral, . regexLiteral,
102
- . consumer, . consumerValidator,
103
- . customCharacterClass:
121
+ . consumer, . consumerValidator, . characterPredicate ,
122
+ . customCharacterClass, . unconvertedRegexLiteral :
104
123
return [ ]
105
124
}
106
125
}
@@ -109,7 +128,8 @@ extension DSLTree.Node {
109
128
extension DSLTree . Node {
110
129
var ast : AST ? {
111
130
switch self {
112
- case let . regexLiteral( ast) : return ast
131
+ case let . regexLiteral( ast) : return ast
132
+ case let . unconvertedRegexLiteral( ast) : return ast
113
133
case let . convertedRegexLiteral( _, ast) : return ast
114
134
default : return nil
115
135
}
@@ -180,6 +200,7 @@ extension AST {
180
200
children. append ( . stringLiteral( str) )
181
201
} else {
182
202
children. append ( astChildren [ curIdx] . dslTreeNode)
203
+ children. formIndex ( after: & curIdx)
183
204
}
184
205
}
185
206
return . concatenation( children)
@@ -210,15 +231,13 @@ extension AST {
210
231
return . stringLiteral( str)
211
232
}
212
233
213
- // TODO: Should we bottom out here or do something
214
- // else? We probably want to rewrite built-in
215
- // character classes, etc
234
+ // TODO: More conversions
235
+ return . unconvertedRegexLiteral( self )
216
236
217
- return . regexLiteral ( self )
237
+ case . customCharacterClass ( _ ) :
218
238
219
- case let . customCharacterClass( v) :
220
- // FIXME: What should we do here?
221
- fatalError ( " TODO \( v) " )
239
+ // TODO: More conversions
240
+ return . unconvertedRegexLiteral( self )
222
241
223
242
case . empty( _) :
224
243
return . empty
0 commit comments