       // consuming possibly significant new lines.
       let backtrackPosition = streamPosition
       if consume(.dot, afterMany: .newline) != nil {
-        // Although it wouldn't make the grammar ambiguous otherwise, notice that we require the
-        // selected identifier to be on the same line.
-        guard peek().kind == .identifier
+        guard peek().kind == .identifier || peek().isPrefixOperator || peek().isInfixOperator
           else { throw parseFailure(.expectedMember) }
-
-        let ident = try parseIdentifier()
+        let ident = try parseIdentifier(allowOperators: true)
+
         expression = SelectExpr(
           owner: expression,
           ownee: ident,

  }

  /// Parses an identifier.
  func parseIdentifier() throws -> Ident {
    guard let token = consume(.identifier)
      else { throw unexpectedToken(expected: "identifier") }
    let ident = Ident(name: token.value!, module: module, range: token.range)

    // Attempt to parse the specialization list.
    let backtrackPosition = streamPosition


    case .dot:
      consume()
      guard peek().kind == .identifier || peek().isPrefixOperator || peek().isInfixOperator
        else { throw parseFailure(.expectedMember) }
      let ident = try parseIdentifier(allowOperators: true)

      expression = SelectExpr(
        ownee: ident,
        module: module,
