aboutsummaryrefslogtreecommitdiff
path: root/Map/Business/WmapParser/Parser.swift
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-07-09 08:34:19 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2025-07-09 08:34:19 +0200
commit1ec7f2c6deb64f5b13b32fae2bf74ae2d8aaaabb (patch)
tree47b6addedf0bdb18d35774e9b027d07074929d4a /Map/Business/WmapParser/Parser.swift
parent6926feead1a7fadb7f5f974996bef8c30b3bfdbe (diff)
Account for CRLF/CR/LF. Lex note text. Use Wmap Parser for renderer.
Diffstat (limited to 'Map/Business/WmapParser/Parser.swift')
-rw-r--r--Map/Business/WmapParser/Parser.swift87
1 files changed, 45 insertions, 42 deletions
diff --git a/Map/Business/WmapParser/Parser.swift b/Map/Business/WmapParser/Parser.swift
index f04998c..9418263 100644
--- a/Map/Business/WmapParser/Parser.swift
+++ b/Map/Business/WmapParser/Parser.swift
@@ -56,15 +56,15 @@ extension Wmap {
case .vertexLabel:
return try parseVertexOrEdge()
case .noteKeyword:
- return try parseNote()
+ return .note(try parseNote())
case .stageNumber:
- return try parseStage()
+ return .stage(try parseStage())
case .groupKeyword:
- return try parseGroup()
+ return .group(try parseGroup())
case .inertiaKeyword:
- return try parseInertia()
+ return .inertia(try parseInertia())
case .evolutionKeyword:
- return try parseEvolution()
+ return .evolution(try parseEvolution())
case .error:
// Error tokens should cause the line to be ignored
throw ParseError.invalidLine
@@ -97,19 +97,20 @@ extension Wmap {
vertexLabelMap[secondLabel.lowercased()] = secondLabel
advance()
- return Edge(
- from: firstLabel,
- to: secondLabel,
- isDirected: isDirected,
- position: startPos,
- range: SourceRange(
- start: startPos, end: endPos,
- stringRange: firstLabelRange.stringRange
- .lowerBound..<secondLabelRange.stringRange.upperBound),
- fromLabelRange: firstLabelRange,
- edgeTypeRange: edgeTypeRange,
- toLabelRange: secondLabelRange
- )
+ return .edge(
+ Edge(
+ from: firstLabel,
+ to: secondLabel,
+ isDirected: isDirected,
+ position: startPos,
+ range: SourceRange(
+ start: startPos, end: endPos,
+ stringRange: firstLabelRange.stringRange
+ .lowerBound..<secondLabelRange.stringRange.upperBound),
+ fromLabelRange: firstLabelRange,
+ edgeTypeRange: edgeTypeRange,
+ toLabelRange: secondLabelRange
+ ))
} else {
// Parse vertex
let (coordinates, coordRanges) = try parsePositionWithRanges()
@@ -117,24 +118,25 @@ extension Wmap {
let endPos = shapeRange?.end ?? coordRanges.rightParen.end
- return Vertex(
- label: firstLabel,
- position: startPos,
- coordinates: coordinates,
- shape: shape,
- range: SourceRange(
- start: startPos, end: endPos,
- stringRange: firstLabelRange.stringRange
- .lowerBound..<(shapeRange?.stringRange.upperBound
- ?? coordRanges.rightParen.stringRange.upperBound)),
- labelRange: firstLabelRange,
- leftParenRange: coordRanges.leftParen,
- xCoordRange: coordRanges.xCoord,
- commaRange: coordRanges.comma,
- yCoordRange: coordRanges.yCoord,
- rightParenRange: coordRanges.rightParen,
- shapeRange: shapeRange
- )
+ return .vertex(
+ Vertex(
+ label: firstLabel,
+ position: startPos,
+ coordinates: coordinates,
+ shape: shape,
+ range: SourceRange(
+ start: startPos, end: endPos,
+ stringRange: firstLabelRange.stringRange
+ .lowerBound..<(shapeRange?.stringRange.upperBound
+ ?? coordRanges.rightParen.stringRange.upperBound)),
+ labelRange: firstLabelRange,
+ leftParenRange: coordRanges.leftParen,
+ xCoordRange: coordRanges.xCoord,
+ commaRange: coordRanges.comma,
+ yCoordRange: coordRanges.yCoord,
+ rightParenRange: coordRanges.rightParen,
+ shapeRange: shapeRange
+ ))
}
}
@@ -145,12 +147,13 @@ extension Wmap {
let (coordinates, coordRanges) = try parsePositionWithRanges()
- // For notes, we need to scan the remaining text on the line
- let textToken = lexer.scanText()
- let text = textToken.value
- let textRange = makeSourceRange(from: textToken)
- let endPos = textToken.position
- currentToken = lexer.nextToken() // Update current token after scanning text
+ guard currentToken.type == .text else {
+ throw ParseError.expectedText(actual: currentToken)
+ }
+ let text = currentToken.value
+ let textRange = makeSourceRange(from: currentToken)
+ let endPos = currentToken.position
+ advance()
return Note(
coordinates: coordinates,