Skip to content

Commit d491d1d

Browse files
committed
line and column
1 parent 769b695 commit d491d1d

13 files changed

+118
-120
lines changed

Package.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ let package = Package(
2727
],
2828
targets: [
2929
.target(
30-
name: "Coder"),
30+
name: "Coder",
31+
dependencies: [
32+
.product(name: "Binary", package: "swift-binary")
33+
]
34+
),
3135
.testTarget(
3236
name: "CoderTests",
3337
dependencies: ["Coder"]),

Sources/Coder/Coder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1+
@_exported import Binary

Sources/StringDecoder/Combinators/StringDecoder+Chain.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,16 @@ public extension StringDecoder {
1212

1313
return flatMap(rest)
1414
}
15+
16+
func chainRight(_ op: StringDecoder<(Element, Element) -> Element, Failure>) -> Self {
17+
func rest(_ x: Element) -> Self {
18+
op.flatMap { f in
19+
self.chainRight(op).map { y in
20+
f(x, y)
21+
}
22+
}.or(pure(x))
23+
}
24+
25+
return self.flatMap(rest)
26+
}
1527
}

Sources/StringDecoder/Combinators/StringDecoder+LookAhead.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public extension StringDecoder {
77
case .success:
88
return self.decode(input)
99
case .failure:
10-
return self.decode(State(string: "", offset: input.offset))
10+
return self.decode(State(string: "", offset: input.offset, line: input.line, column: input.column))
1111
}
1212
}
1313
}

Sources/StringDecoder/Combinators/StringDecoder+TryAhead.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public extension StringDecoder {
55
StringDecoder { input in
66
switch forwardEncoder(input) {
77
case .success:
8-
return self.decode(State(string: "", offset: input.offset))
8+
return self.decode(State(string: "", offset: input.offset, line: input.line, column: input.column))
99
case .failure:
1010
return self.decode(input)
1111
}

Sources/StringDecoder/Decoders/StringDecoder+Indent.swift

Lines changed: 0 additions & 24 deletions
This file was deleted.

Sources/StringDecoder/Decoders/StringDecoder+Parentheses.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,16 @@ import Foundation
33
public let leftParentheses: StringDecoder<Character, StringDecoderFailure> = match(Character("("))
44

55
public let rightParentheses: StringDecoder<Character, StringDecoderFailure> = match(Character(")"))
6+
7+
8+
public let leftCurlyBracket: StringDecoder<Character, StringDecoderFailure> = match(Character("{"))
9+
public let rightCurlyBracket: StringDecoder<Character, StringDecoderFailure> = match(Character("}"))
10+
11+
public extension StringDecoder where Failure == StringDecoderFailure {
12+
var insideCurlyBrackets: Self {
13+
self.between(
14+
open: leftCurlyBracket.discard(whitespace()),
15+
close: whitespace().discardThen(rightCurlyBracket)
16+
)
17+
}
18+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Foundation
2+
3+
public func isSigil(_ c: Character) -> Bool {
4+
c == "$"
5+
}

Sources/StringDecoder/Decoders/StringDecoder+Whitespace.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,11 @@ public func space() -> StringDecoder<String, StringDecoderFailure> {
1515
public func newline() -> StringDecoder<String, StringDecoderFailure> {
1616
match("\n")
1717
}
18+
19+
public let horizontalWhitespace: StringDecoder<String, StringDecoderFailure> = tab().or(space()).many.map { String($0.flatMap { $0 }) }
20+
21+
public extension StringDecoder where Failure == StringDecoderFailure {
22+
var insideHorizontalWhitespace: Self {
23+
self.between(horizontalWhitespace)
24+
}
25+
}

Sources/StringDecoder/State.swift

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,66 @@ import Foundation
33
public struct State: Equatable {
44
public let string: String
55
public var offset: UInt64
6-
public internal(set) var indentation: Int
7-
8-
public init(string: String, offset: UInt64, indentation: Int = 0) {
6+
public var line: UInt
7+
public var column: UInt
8+
9+
public init(string: String, offset: UInt64, line: UInt, column: UInt) {
910
self.string = string
1011
self.offset = offset
11-
self.indentation = indentation
12+
self.line = line
13+
self.column = column
1214
}
13-
15+
1416
public var head: Character? {
1517
guard string.characters.indices.contains(Int(offset)) else { return nil }
1618
return string.characters[Int(offset)]
1719
}
18-
20+
1921
public var next: State {
2022
advanced(by: 1)
2123
}
22-
24+
2325
public func advanced(by count: Int) -> State {
24-
State(string: string, offset: offset + UInt64(count), indentation: indentation)
26+
var newLine = line
27+
var newColumn = column
28+
var newOffset = offset
29+
30+
for _ in 0..<count {
31+
if let character = head {
32+
if character == "\n" {
33+
newLine += 1
34+
newColumn = 1
35+
} else {
36+
newColumn += 1
37+
}
38+
newOffset += 1
39+
} else {
40+
break
41+
}
42+
}
43+
44+
return State(string: string, offset: newOffset, line: newLine, column: newColumn)
2545
}
26-
27-
public func indent(by count: Int) -> State {
28-
State(string: string, offset: offset, indentation: indentation + count)
46+
47+
public var positionMetadata: PositionMetadata {
48+
PositionMetadata(offset: offset, line: line, column: column)
2949
}
3050
}
3151

3252
extension State: ExpressibleByArrayLiteral {
3353
public init(arrayLiteral elements: Character...) {
34-
self = State(string: String(elements), offset: 0)
54+
self = State(string: String(elements), offset: 0, line: 1, column: 1)
55+
}
56+
}
57+
58+
public struct PositionMetadata: Equatable {
59+
public let offset: UInt64
60+
public let line: UInt
61+
public let column: UInt
62+
63+
public init(offset: UInt64, line: UInt, column: UInt) {
64+
self.offset = offset
65+
self.line = line
66+
self.column = column
3567
}
3668
}

0 commit comments

Comments
 (0)