Skip to content

Commit 7a10327

Browse files
committed
convert some atoms
1 parent 5ca5c4f commit 7a10327

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

Sources/_MatchingEngine/Regex/DSLTree.swift

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ extension DSLTree {
2323

2424
case customCharacterClass(CustomCharacterClass)
2525

26+
case atom(Atom)
27+
2628
/// Comments, non-semantic whitespace, etc
2729
// TODO: Do we want this? Could be interesting
2830
case trivia(String)
@@ -65,13 +67,22 @@ extension DSLTree {
6567

6668
extension DSLTree {
6769
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])
7074

7175
indirect case intersection(Self, Self)
7276
indirect case subtraction(Self, Self)
7377
indirect case symmetricDifference(Self, Self)
7478
}
79+
80+
enum Atom {
81+
case char(Character)
82+
case scalar(Unicode.Scalar)
83+
84+
case unconverted(AST.Atom)
85+
}
7586
}
7687

7788
// CollectionConsumer
@@ -119,7 +130,8 @@ extension DSLTree.Node {
119130

120131
case .trivia, .empty, .stringLiteral, .regexLiteral,
121132
.consumer, .consumerValidator, .characterPredicate,
122-
.customCharacterClass, .unconvertedRegexLiteral:
133+
.customCharacterClass, .unconvertedRegexLiteral,
134+
.atom:
123135
return []
124136
}
125137
}
@@ -230,14 +242,10 @@ extension AST {
230242
if let str = v.literalStringValue {
231243
return .stringLiteral(str)
232244
}
245+
return .atom(v.dslTreeAtom)
233246

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)
241249

242250
case .empty(_):
243251
return .empty
@@ -252,3 +260,46 @@ extension AST {
252260
return wrap(convert())
253261
}
254262
}
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+
}

Sources/_MatchingEngine/Regex/Printing/PrintAsPattern.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,21 @@ extension PrettyPrinter {
9393
printer.printAsPattern(convertedFromAST: child)
9494
}
9595

96+
case let .atom(a):
97+
switch a {
98+
case let .char(c):
99+
print(String(c)._quoted)
100+
101+
case let .scalar(s):
102+
let hex = String(s.value, radix: 16, uppercase: true)
103+
print("\\u{\(hex)}"._quoted)
104+
105+
case let .unconverted(a):
106+
// TODO: is this always right?
107+
// TODO: Convert built-in character classes
108+
print(a._patternBase)
109+
}
110+
96111
case .trivia:
97112
// What should we do? Maybe keep comments, etc?
98113
print("")

0 commit comments

Comments
 (0)