File: Quantification.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (73 lines) | stat: -rw-r--r-- 2,257 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021-2022 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//

extension AST {
  public struct Quantification: Hashable {
    public let amount: Located<Amount>
    public let kind: Located<Kind>

    public let child: AST.Node
    public let location: SourceLocation

    /// Any trivia intermixed between the operand and the quantifier, as well
    /// as between the quantifier characters themselves. This can occur in
    /// extended syntax mode where PCRE permits e.g `x * +`.
    public let trivia: [AST.Trivia]

    public init(
      _ amount: Located<Amount>,
      _ kind: Located<Kind>,
      _ child: AST.Node,
      _ r: SourceLocation,
      trivia: [AST.Trivia]
    ) {
      self.amount = amount
      self.kind = kind
      self.child = child
      self.location = r
      self.trivia = trivia
    }

    public enum Amount: Hashable {
      case zeroOrMore                              // *
      case oneOrMore                               // +
      case zeroOrOne                               // ?
      case exactly(AST.Atom.Number)                // {n}
      case nOrMore(AST.Atom.Number)                // {n,}
      case upToN(AST.Atom.Number)                  // {,n}
      case range(AST.Atom.Number, AST.Atom.Number) // {n,m}
    }

    public enum Kind: String, Hashable {
      case eager      = ""
      case reluctant  = "?"
      case possessive = "+"
    }
  }
}

/// MARK: - Semantic API

extension AST.Quantification.Amount {
  /// The bounds.
  public var bounds: (atLeast: Int?, atMost: Int?) {
    switch self {
    case .zeroOrMore: return (0, nil)
    case .oneOrMore:  return (1, nil)
    case .zeroOrOne:  return (0, 1)

    case let .exactly(n):  return (n.value, n.value)
    case let .nOrMore(n):  return (n.value, nil)
    case let .upToN(n):    return (0, n.value)
    case let .range(n, m): return (n.value, m.value)
    }
  }
}