1// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers 2// 3// SPDX-License-Identifier: MPL-2.0 4 5import Foundation 6 7enum Declaration: Grammar { 8 enum Kinds { 9 static let claim = SyntaxTreeKind(name: "decl.claim") 10 static let refine = SyntaxTreeKind(name: "decl.refine") 11 static let define = SyntaxTreeKind(name: "decl.define") 12 } 13 14 static let kinds = [Kinds.claim, Kinds.refine, Kinds.define] 15 16 static func precondition(_ parser: inout Parser) -> Bool { 17 Lhs.precondition(&parser) 18 } 19 20 static let punctuationMap: [Punctuation: SyntaxTreeKind] = [ 21 .colon: Kinds.claim, 22 .doubleLeftArrow: Kinds.refine, 23 .doubleRightArrow: Kinds.define 24 ] 25 26 static func inside(_ parser: inout Parser, recovery: Set<TokenKind>) -> ParseResult { 27 let punctuations = punctuationMap.keys.map { TokenKind.punctuation($0) } 28 Lhs.parse(&parser, recovery: recovery.union(punctuations)) 29 parser.eatTrivia() 30 31 var kind: SyntaxTreeKind = .error 32 for cell in punctuationMap { 33 if parser.eat(kind: .punctuation(cell.key), metadata: TokenMetadata(semanticTokenType: .operator)) { 34 kind = cell.value 35 break 36 } 37 } 38 39 if kind == .error { 40 parser.advance(error: "Expected one of \(punctuationMap.keys.map(\.rawValue)) in declaration") 41 } 42 43 parser.eatTrivia() 44 Rhs.parse(&parser, recovery: recovery) 45 46 return ParseResult(kind: kind) 47 } 48} 49 50extension SyntaxView<Declaration> { 51 var lhs: SyntaxView<Declaration.Lhs>? { matchingSubview() } 52 var rhs: SyntaxView<Declaration.Rhs>? { matchingSubview() } 53}