this repo has no description www.jonmsterling.com/01HC/
dependent-types proof-assistant swift
at main 72 lines 2.0 kB view raw
1// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers 2// SPDX-FileCopyrightText: 2026 The Project Pterodactyl Developers 3// 4// SPDX-License-Identifier: MPL-2.0 5 6public struct SyntaxTreeBuilder { 7 private enum Event: Equatable { 8 case open 9 case close(kind: SyntaxTreeKind, metadata: SyntaxTreeMetadata?) 10 case advance(token: Token, metadata: TokenMetadata?) 11 } 12 13 private var events: [Event] = [] 14 15 public init() {} 16 17 public struct Checkpoint { 18 fileprivate let position: Int 19 } 20 21 public var checkpoint: Checkpoint { 22 Checkpoint(position: events.count) 23 } 24 25 public mutating func openAtCheckpoint(_ checkpoint: Checkpoint) { 26 events.insert(.open, at: checkpoint.position) 27 } 28 29 public mutating func open() { 30 events.append(.open) 31 } 32 33 public mutating func close(kind: SyntaxTreeKind, metadata: SyntaxTreeMetadata? = nil) { 34 events.append(.close(kind: kind, metadata: metadata)) 35 } 36 37 public mutating func advance(token: Token, metadata: TokenMetadata?) { 38 events.append(.advance(token: token, metadata: metadata)) 39 } 40 41 public var tree: SyntaxTree { 42 var stack: [SyntaxTree.MutableTree] = [] 43 44 for event in events { 45 switch event { 46 case .open: 47 stack.append(SyntaxTree.MutableTree(kind: .error, metadata: nil, children: [])) 48 49 case .close(let kind, let metadata): 50 guard var node = stack.popLast() else { fatalError("More close events than open events") } 51 node.kind = kind 52 node.metadata = metadata 53 guard let parentIndex = stack.indices.last else { return node.tree } 54 stack[parentIndex].children.append(.tree(node.tree)) 55 56 case .advance(let token, let metadata): 57 guard let parentIndex = stack.indices.last else { 58 fatalError("Attempted to insert token at root of parse tree") 59 } 60 stack[parentIndex] 61 .children 62 .append(.token(token, metadata: metadata)) 63 } 64 } 65 66 if !stack.isEmpty { 67 fatalError("More open events than close events") 68 } 69 70 return SyntaxTree(kind: .error, children: []) 71 } 72}