       // 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,


    case .dot:
      consume()
      let ident = try parseIdentifier()
      expression = SelectExpr(
        ownee: ident,
        module: module,

      throw unexpectedToken(expected: "expression")
    }

    // NOTE: Although it wouldn't make the grammar ambiguous otherwise, notice that we require
    // trailers to start at the same line. The rationale is that it doing otherwise could easily
    // make some portions of code *look* ambiguous.
    trailer:while true {
      if consume(.leftParen) != nil {
        let args = try parseList(delimitedBy: .rightParen, parsingElementWith: parseCallArg)

