// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers // // SPDX-License-Identifier: MPL-2.0 import Foundation enum Declaration: Grammar { enum Kinds { static let claim = SyntaxTreeKind(name: "decl.claim") static let refine = SyntaxTreeKind(name: "decl.refine") static let define = SyntaxTreeKind(name: "decl.define") } static let kinds = [Kinds.claim, Kinds.refine, Kinds.define] static func before(_ parser: inout Parser) -> Bool { Lhs.before(&parser) } static let punctuationMap: [Punctuation: SyntaxTreeKind] = [ .colon: Kinds.claim, .doubleLeftArrow: Kinds.refine, .doubleRightArrow: Kinds.define ] static func inside(_ parser: inout Parser) -> ParseResult { Lhs.parse(&parser) parser.eatTrivia() var kind: SyntaxTreeKind = .error for cell in punctuationMap { if parser.eat(kind: .punctuation(cell.key), metadata: TokenMetadata(semanticTokenType: .operator)) { kind = cell.value break } } if kind == .error { parser.advance(error: "Expected one of \(punctuationMap.keys.map(\.rawValue)) in declaration") } parser.eatTrivia() Rhs.parse(&parser) return ParseResult(kind: kind) } } extension SyntaxView { var lhs: SyntaxView? { matchingSubview() } var rhs: SyntaxView? { matchingSubview() } }