Skip to content

Commit 4e6ecf6

Browse files
committed
Rough printing parity with what we had before
1 parent 7a10327 commit 4e6ecf6

File tree

2 files changed

+60
-34
lines changed

2 files changed

+60
-34
lines changed

Sources/_MatchingEngine/Regex/DSLTree.swift

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,19 @@ extension DSLTree {
6666
}
6767

6868
extension DSLTree {
69-
enum CustomCharacterClass {
70-
case atom(Atom)
71-
case range(Atom, Atom)
72-
73-
indirect case sequence([Self])
74-
75-
indirect case intersection(Self, Self)
76-
indirect case subtraction(Self, Self)
77-
indirect case symmetricDifference(Self, Self)
69+
struct CustomCharacterClass {
70+
var members: [Member]
71+
var isInverted: Bool
72+
73+
enum Member {
74+
case atom(Atom)
75+
case range(Atom, Atom)
76+
case custom(CustomCharacterClass)
77+
78+
indirect case intersection(CustomCharacterClass, CustomCharacterClass)
79+
indirect case subtraction(CustomCharacterClass, CustomCharacterClass)
80+
indirect case symmetricDifference(CustomCharacterClass, CustomCharacterClass)
81+
}
7882
}
7983

8084
enum Atom {
@@ -263,12 +267,13 @@ extension AST {
263267

264268
extension AST.CustomCharacterClass {
265269
var dslTreeClass: DSLTree.CustomCharacterClass {
266-
func mapMember(
270+
// TODO: Not quite 1-1
271+
func convert(
267272
_ member: Member
268-
) -> DSLTree.CustomCharacterClass {
273+
) -> DSLTree.CustomCharacterClass.Member {
269274
switch member {
270275
case let .custom(ccc):
271-
return ccc.dslTreeClass
276+
return .custom(ccc.dslTreeClass)
272277

273278
case let .range(r):
274279
return .range(
@@ -278,15 +283,33 @@ extension AST.CustomCharacterClass {
278283
return .atom(a.dslTreeAtom)
279284

280285
case let .quote(q):
281-
return .sequence(q.literal.map { .atom(.char($0)) })
286+
// TODO: Probably should flatten instead of nest
287+
return .custom(.init(
288+
members: q.literal.map { .atom(.char($0)) },
289+
isInverted: false))
282290

283291
case let .setOperation(lhs, op, rhs):
284-
fatalError("TODO: set operations")
292+
let lhs = DSLTree.CustomCharacterClass(
293+
members: lhs.map(convert),
294+
isInverted: false)
295+
let rhs = DSLTree.CustomCharacterClass(
296+
members: rhs.map(convert),
297+
isInverted: false)
298+
299+
switch op.value {
300+
case .subtraction:
301+
return .subtraction(lhs, rhs)
302+
case .intersection:
303+
return .intersection(lhs, rhs)
304+
case .symmetricDifference:
305+
return .symmetricDifference(lhs, rhs)
306+
}
285307
}
286308
}
287309

288-
// TODO: Coalesce?
289-
return .sequence(members.map(mapMember))
310+
return .init(
311+
members: members.map(convert),
312+
isInverted: self.isInverted)
290313
}
291314
}
292315

Sources/_MatchingEngine/Regex/Printing/PrintAsPattern.swift

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ extension PrettyPrinter {
130130
// label is a lie.
131131
printAsPattern(convertedFromAST: n)
132132

133-
case .customCharacterClass:
134-
print("/* TODO: custom character class */")
133+
case let .customCharacterClass(ccc):
134+
printAsPattern(ccc)
135135

136136
case .groupTransform:
137137
print("/* TODO: group transforms */")
@@ -146,38 +146,41 @@ extension PrettyPrinter {
146146
}
147147

148148
// TODO: Some way to integrate this with conversion...
149-
mutating func printAsPattern(_ ccc: AST.CustomCharacterClass) {
149+
mutating func printAsPattern(
150+
_ ccc: DSLTree.CustomCharacterClass
151+
) {
150152
let inv = ccc.isInverted ? "inverted: true" : ""
151153
printBlock("CharacterClass(\(inv))") { printer in
152154
ccc.members.forEach { printer.printAsPattern($0) }
153155
}
154156
}
155157

156158
// TODO: Some way to integrate this with conversion...
157-
mutating func printAsPattern(_ member: AST.CustomCharacterClass.Member) {
159+
mutating func printAsPattern(
160+
_ member: DSLTree.CustomCharacterClass.Member
161+
) {
158162
switch member {
159-
case .custom(let ccc):
163+
case let .custom(ccc):
160164
printAsPattern(ccc)
161-
case .range(let r):
162-
if let lhs = r.lhs.literalStringValue,
163-
let rhs = r.rhs.literalStringValue {
165+
case let .range(lhs, rhs):
166+
if case let .char(lhs) = lhs,
167+
case let .char(rhs) = rhs {
164168
indent()
165-
output(lhs._quoted)
169+
output(String(lhs)._quoted)
166170
output("...")
167-
output(rhs._quoted)
171+
output(String(rhs)._quoted)
168172
terminateLine()
169173
} else {
170-
print("// TODO: Range \(r.lhs) to \(r.rhs)")
174+
print("// TODO: Range \(lhs) to \(rhs)")
171175
}
172-
case .atom(let a):
173-
if let s = a.literalStringValue {
174-
print(s._quoted)
176+
case let .atom(a):
177+
if case let .char(c) = a {
178+
print(String(c)._quoted)
175179
} else {
176-
print(a._patternBase)
180+
print(" // TODO: Atom \(a) ")
177181
}
178-
case .quote(let q):
179-
print("// TODO: quote \(q.literal._quoted) in custom character classes (should we split it?)")
180-
case .setOperation:
182+
183+
case .symmetricDifference, .intersection, .subtraction:
181184
print("// TODO: Set operation: \(member)")
182185
}
183186
}

0 commit comments

Comments
 (0)